首页 > 代码库 > JavaScript的数据类型的隐式转换
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的数据类型的隐式转换