码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript的数据类型的隐式转换

时间:2017-08-09 10:05:02      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:空字符串   express   expec   计算   优先   hand   javascrip   隐式转换   pos   

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

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

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

弱类型相对于强类型来说,类型检查更不严格,比如允许变量类型的隐式转换,允许强制类型转换等等,而强类型语言一般不允许这么做。
一、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的数据类型的隐式转换

标签:空字符串   express   expec   计算   优先   hand   javascrip   隐式转换   pos   

原文地址:http://www.cnblogs.com/camille666/p/js_datatype_hidetransfer.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!