文章目录
数据的转换
所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。
第一个是toString(),它的作用是返回一个相对这个对象的字符串(js值显示)
第二个是valueOf(),它的作用是返回它相应的原始值(js值运算)
toString详解
进制转换
num1.toString()
:可以将十进制的num1
转换为其他进制
【用法:】num.toString(radix)
其中radix
就是目标进制的数据。范围[2, 32]
var a = 32;
console.log(a.toString(2)); //返回字符串100000(十进制转2进制)
console.log(a.toString(4)); //返回字符串200(十进制转4进制)
console.log(a.toString(16)); //返回字符串20(十进制转16进制)
console.log(a.toString(30)); //返回字符串12(十进制转30进制)
console.log(a.toString(32)); //返回字符串10(十进制转32进制)
parseInt(num, radix)
将radix进制的 num 转换为十进制
【举个栗子】: 将二进制的10001000转换为十六进制数
// 二进制 转 十进制
var num1 = parseIn('10001000', 2)
// 十进制 转 十六进制
var num2 = num1.toString(16)
num.toString(radix)
和parseInt(num1, radix)
他们的radix
的范围都是[2, 32]
toString 判断基本类型
js中的基本类型包括:String、Boolean、 Number、undefined、 null
以及es6的 symbol
toString 判断引用类型
js中的引用类型包括:Object、Function、Array、Date、RegExp、 Error
Object.prototype.toString()
使用Object.prototype.toString()来进行类型识别,返回代表该对象的[object 数据类型]字符串表示
Object.prototype.toString()可以识别标准类型及内置对象类型,但不能识别自定义类型
console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]
封装写法:
function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
console.log(type("jerry"));//"string"
console.log(type(12));//"number"
console.log(type(true));//"boolean"
console.log(type(undefined));//"undefined"
console.log(type(null));//"null"
console.log(type({name: "jerry"}));//"object"
console.log(type(function(){}));//"function"
console.log(type([]));//"array"
console.log(type(new Date));//"date"
console.log(type(/\d/));//"regexp"
function Person(){};
console.log(type(new Person));//"object"
除了类型识别之外,还可以进行其他识别,如识别arguments或DOM元素
(function(){
console.log(Object.prototype.toString.call(arguments));//[object Arguments]
})()
console.log(Object.prototype.toString.call(document));//[object HTMLDocument]
toString()和valueOf()调用顺序
toString()
可以看做是把一个数据转换成了相应字符串的形式
valueOf()
则是获取指定对象的原值
【使用小点】:
- 在有操作符的情况下:
valueOf
的优先级 >toString()
- 在使用
String(obj)
强转字符串时优先使用toString()
,使用Number(obj)
强转为数字时,优先使用valueOf()
如果在强转字符传时,没有重写
toString
方法,但是重写了valueOf
方法,此时会优先调用valueOf
方法 - 在进行对象转换时,优先调用
toString
方法(两者都没有重写的情况下)如果没有重写
toString()
,但是重写了valueOf()
则优先调用valueOf()
方法
Object中的 valueOf和toString调用顺序
对obj进行自增操作,此时valueOf的优先级要高于toString
【两者都没有重写】:调用默认的valueOf() -> toString() -> Number() -> NaN
var obj = {
i : 3
}
console.log(++obj)
// NaN
【重写valueOf】:优先调用 valueOf, 默认的toString不被调用即:valueOf() -> Number()
var obj = {
i : 3,
valueOf: function(){
console.log('重写的valueOf')
return this.i
}
}
console.log(++obj)
// 重写的valueOf
// 4
【重写toString】:优先调用 toString, 默认的valueOf不被调用即:toString()-> Number()
var obj = {
i : 3,
toString: function(){
console.log('重写的toString')
return this.i
}
}
console.log(++obj)
// 重写的toString
// 4
【两者都重写】:优先调用 valueOf, 默认的toString不被调用即:valueOf() -> toString()-> Number()
var obj = {
i : 3,
valueOf: function(){
console.log('重写的valueOf')
return this.i
},
toString: function(){
console.log('重写的toString')
return this.i
}
}
console.log(++obj)
// 重写的valueOf
// 4