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的数据类型的隐式转换的主要内容,如果未能解决你的问题,请参考以下文章