JavaScript的数据类型的隐式转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript的数据类型的隐式转换相关的知识,希望对你有一定的参考价值。

什么是弱类型语言?
计算机语言的类型可以分为强类型和弱类型两种。

二者之间的区别,就在于计算时,不同类型数据是否可以透明的隐式转换。如果一个语言可以隐式转换它的所有类型,那么它的变量、表达式等在参与运算时,即使类型不正确,也能通过隐式转换来得到正确的类型,这样的语言就属于弱类型语言。

与此相对,强类型语言的类型之间不一定有隐式转换。

弱类型相对于强类型来说,类型检查更不严格,比如允许变量类型的隐式转换,允许强制类型转换等等,而强类型语言一般不允许这么做。
一、1+"2"+"2" //"122"

二、1+ +"2"+"2" //"32"

三、1++"2"+"2" //Invalid left-hand side expression in postfix operation

四、{}+1 //1

五、1+{} //"1[object Object]"

六、1-{} //NaN

七、1+!{} //1

八、1-!{} //1

九、({}+1) //"[object Object]1"

十、[]+1 //"1"

十一、1+[] //"1"

十二、1-[] //1

十三、[]+{} //"[object Object]"

十四、{}+[] //0

十五、{}+{} //chrome:"[object Object][object Object]",Firfox:NaN

十六、[]==[] //false

十七、[]==![] //true

十八、[]===![] //false

十九、[]==!{} //true

二十、![]=={} //false

二十一、{}==![] //Unexpected token ==

二十二、{}==!{} //false

二十三、、++[[]][+[]]+[+[]] == 10

1、拆分
左边:++[[]][+[]]
右边:[+[]]
2、先分析右边
+会调用ToNumber方法把ToNumber([])转化成数字,[]是数组对象,因此会调用ToPrimitive方法;
空数组先调用valueOf()方法,得到[]不是原始值,继续调用toString()方法,得到""空字符串;
ToNumber("")===0,于是右边结果是[0]。
3、再分析左边
++[[]][0],数组下标的优先级高于一元运算符++,++([[]][0]),数组下标为0也就是第一个元素,++[]
得到[]+1,即ToNumber([])+1,而ToNumber([])===0
得到0+1,于是得到1。
4、两边一起分析
得到1+[0],[0]数组先调用valueOf()方法,得到[0]不是原始值,继续调用toString()方法,得到 "0"的字符串。于是1+"0"==="10",判断"10"==10,ToNumber("10")===10。
最后++[[]][+[]]+[+[]]==10

 

以上是关于JavaScript的数据类型的隐式转换的主要内容,如果未能解决你的问题,请参考以下文章

[2016-02-08][javascript][数据类型的隐式转换]

JavaScript数据类型的隐式转换

javascript的隐式类型转换

javascript中的隐式类型转化

带你玩转JavaScript中的隐式强制类型转换

javascript的隐式类型转换(使(a==1&&a==2&&a==3) 成立)