null和undefined
undefined
和null
没有toString
和valueOf
方法。
undefined.toString(); //TypeError: Cannot read property 'toString' of undefined
null.toString(); //TypeError: Cannot read property 'toString' of null
undefined.valueOf(); //TypeError: Cannot read property 'valueOf' of undefined
null.valueOf(); //TypeError: Cannot read property 'valueOf' of null
布尔型
布尔型数据toString
返回对应的字符串。valueOf
返回原值。
console.log(true.toString()); //'true'
console.log(false.toString()); //'false'
console.log(true.valueOf()); //true
console.log(false.valueOf()); //false
字符串
返回原值
console.log('123'.toString()); //'123'
console.log('123'.valueOf()); //'123'
数值
整数直接跟.toString()
和.valueOf
形式,会报错,提示无效标记。因为整数后的点被识别为小数点。所以尽量加括号,加括号后,toString
返回字符串,valueOf
返回原值。
console.log(1.valueOf());
console.log(1.toString()); //SyntaxError: Invalid or unexpected token
console.log((1).valueOf()); //1
console.log((1).toString()); //'1'
-0
的valueOf
值是-0
,而-0
的toString()
值是'0'
console.log((-0).valueOf()); //-0
console.log((-0).toString()); //'0'
console.log((+0).valueOf()); //0
console.log((+0).toString()); //'0'
valueOf
直接返回原值。(有正号的会被省略)
console.log(NaN.valueOf()); //NaN
console.log(+Infinity.valueOf()); //Infinity
console.log(-Infinity.valueOf()); //-Infinity
console.log(1.23.valueOf()); //1.23
console.log(-1.23.valueOf()); //-1.23
console.log(+1.23.valueOf()); //1.23
toString
- 带正负号的浮点数与Infinity(没有加小括号),相当于先进行
toString
运算,再添加正负号,转换为数字。
console.log(+1.23.toString()); //1.23
console.log(-1.23.toString()); //-1.23
console.log(+Infinity.toString()); //Infinity
console.log(-Infinity.toString()); //-Infinity
- 正浮点数(不带
+
号),加引号直接返回
console.log(1.23.toString()); //'1.23'
对象
toString
对象Object类型及自定义对象类型 加括号(不加会报错)返回[object Object]。
{}.toString(); //SyntaxError: Unexpected token .
常使用Object.prototype.toString()
进行类型识别。
console.log(Object.prototype.toString.call('123')); //'[object String]'
console.log(Object.prototype.toString.call(123)); //'[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({})); //'[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(/\w/)); //'[object RegExp]'
可以识别标准类型及内置对象类型,不能识别自定义类型
function Person(){};
console.log(Object.prototype.toString.call(new Person)); //[object Object]
还能进行其他一些识别,如识别arguments或DOM元素
(function () {
console.log(Object.prototype.toString.call(arguments)); //'[object Arguments]'
})();
console.log(Object.prototype.toString.call(document)); //'[object HTMLDocument]'
valueOf
返回原对象
console.log(({}).valueOf()); //{}
函数
toString
对一个自定义函数使用toString()
方法时,可以得到该函数的源代码。对内置函数使用toString()
方法时,得到'[native code]``。因此,可以使用
toString()`方法区分自定义函数和内置函数。
function f() {alert(1);};
console.log(f.toString()); //'function f() {alert(1);}'
console.log(Function.toString.toString()); //'function toString() { [native code] }'
valueOf
返回原函数
function f() {alert(1);};
console.log(f.valueOf()); //ƒ f() {alert(1);}
console.log(Function.toString.valueOf()); //ƒ toString() { [native code] }
数组
toString
返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
console.log([].toString()); //''
console.log([1].toString()); //'1'
console.log([1, 2, 3].toString()); //'1,2,3'
console.log([{}, 1, Function].toString()); //'[object Object],1,function Function() { [native code] }'
valueOf
返回原数组
console.log([].valueOf()); //[]
console.log([1].valueOf()); //[1]
console.log([{}, 1, Function].valueOf()); // [{…}, 1, ƒ]
Date
toString
返回当前时区的时间的字符串表示
console.log(new Date().toString()); //'Mon Jan 22 2018 17:29:22 GMT+0800 (中国标准时间)'
valueOf
返回一直数字值,是当前时间值。
console.log(new Date().valueOf()); //1516613677784
正则表达式
toString
返回正则表达式字面量的字符串表示。
console.log(/ab/g.toString()); //'/ab/g'
valueOf
返回原正则对象