参考学习:https://blog.youkuaiyun.com/just_do_it2009/article/details/71079784 这篇文章太赞!
JS 数据类型转换 方法主要有2种、
1.转换函数,强制类型转换
2.利用js变量弱类型转换。
valueOf()方法的使用
undefined,null:没有valueOf()方法,使用会报错;
布尔类型:true和false会返回原值;
字符串类型:会返回原值;
数字:
1.如果是整数,需要用小括号将数字包起来再使用valueOf()方法,直接在数字后面跟.valueOf()会报错;
2.如果是小数会返回原值;
对象:
1.对象Object类型及自定义对象类型会返回原对象(注意花括号可能会被当作代码块的问题);
2.函数function类型返回原函数;
3.数组Array类型返回原数组;
4.Date对象类型返回数字(1970年1月1日00:00:00至现在的毫秒数);
5.正则表达式RegExp类型返回正则对象
toString()方法的使用
参考学习:https://www.cnblogs.com/xiaohuochai/p/5557387.html
undefined和null:没有valueOf()方法,使用会报错;
布尔类型:true和false会返回'true'和'false'
字符串类型会返回原值;
数值类型较为复杂:
1.正浮点数及NaN、Infinity加引号返回
2.负浮点数或加'+'号的正浮点数直接跟上.toString(),相当于先运行toString()方法,再添加正负号,转换为数字
3.整数直接跟上.toString()形式,会报错,提示无效标记,因为整数后的点会被识别为小数点,整数时加括号。
4.字类型的toString()方法可以接收表示转换基数(radix)的可选参数,如果不指定此参数,转换规则将是基于十进制
对象:
1.对象Object类型及自定义对象类型加括号返回[object Object]
2.数组Array类型返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串
3.时间Date类型返回表示当前时区的时间的字符串表示
4.正则表达式RegExp类型返回正则表达式字面量的字符串表示
5.错误Error类型
功能:
1.Object.prototype.toString()可以识别标准类型及内置对象类型,但不能识别自定义类型 除了类型识别之外,还可以进行其他识别,如识别arguments或DOM元素
(function(){
console.log(Object.prototype.toString.call(arguments));//[object Arguments]
})()
console.log(Object.prototype.toString.call(document));//[object HTMLDocument]
2.可以使用toString()方法来区分自定义函数和内置函数
当我们对一个自定义函数调用toString()方法时,可以得到该函数的源代码;如果对内置函数使用toString()方法时,会得到一个'[native code]'字符串。
function test(){
alert(1);//test
}
test.toString();/*"function test(){
alert(1);//test
}"*/
Function.toString();//"function Function() { [native code] }"
js的自动装箱(临时创建一个包装对象)
valueOf() 方法返回 Math 对象的原始值。
两个与类型转换有关的函数:valueOf()和toString()
valueOf()的意义是,返回这个对象逻辑上对应的原始类型的值。
toString()的意义是,返回这个对象的字符串表示。用一个字符串来描述这个对象的内容。
js内部用于实现类型转换的4个函数
这4个方法实际上是ECMAScript定义的4个抽象的操作,它们在js内部使用,进行类型转换。我们js的使用者不能直接调用这些函数,但是了解这些函数有利于我们理解js类型转换的原理。
ToPrimitive ( input [ , PreferredType ] )
ToBoolean ( argument )
ToNumber ( argument )
ToString ( argument )
类型转换分为显式类型转换(强制转换)和隐式类型转换(自动类型转换)
ToPrimitive ( input [ , PreferredType ] )
1.将input转化成一个原始类型的值。PreferredType参数要么不传入,要么是Number 或 String。
如果PreferredType参数是Number,ToPrimitive这样执行:
如果input本身就是原始类型,直接返回input。
调用input.valueOf(),如果结果是原始类型,则返回这个结果。
调用input.toString(),如果结果是原始类型,则返回这个结果。
抛出TypeError异常。
2.以下是PreferredType不为Number时的执行顺序。
如果PreferredType参数是String,则交换第2和第3步的顺序,其他执行过程相同。
如果PreferredType参数没有传入
如果input是内置的Date类型,PreferredType 视为String
否则PreferredType 视为 Number
可以看出,ToPrimitive依赖于valueOf和toString的实现
[]+[]
// ""
// 提示:ToPrimitive([])返回空字符串
[] + {}
// "[object Object]"
// 提示:ToPrimitive({})返回"[object Object]"
123 + { toString: function () { return "def" } }
// "123def"
// 提示:ToPrimitive(加号右边的对象)返回"def"
{} + []
// 0
// 结果不符合我们的预期:"[object Object]"
// 提示:在Chrome中,符号左边的{}被解释成了一个语句块,而不是一个对象
// 注意在别的执行引擎上可能会将{}解释成对象
// 这一行等价于'+[]'
// '+anyValue'等价于Number(anyValue)
({}) + []
// "[object Object]"
// 加上括号以后,{}被解释成了一个对象,结果符合我们的预期了
四则运算符
它有以下几个特点:
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型。其他运算只要其中一方是数字,那么另一方就转为数字。并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串。
比较运算符:
如果是对象,就通过 toPrimitive 转换对象
如果是字符串,就通过 unicode 字符索引来比较
常见的面试题
1 + '1'
true + 0
{}+[]
4 + {}
4 + [1]
'a' + + 'b'
console.log ( [] == 0 )
console.log ( ! [] == 0 )
console.log ( [] == ! [] )
console.log ( [] == [] )
console.log({} == !{})
console.log({} == {})
答案:
一错就知道,一做又全忘哈哈哈哈。
答案:
'11'
1
0
"4[object Object]"
"41"
"aNaN"
true
true
true
false
false
false