先说这一道题:console.log(++[[]][+[]]+[+[]])
的结果:"10"
根据运算符的优先级,前置递加++和一元加法+的优先级为16,加法的运算符优先级为13。可以将其分为:++[[]][+[]] + [+[]]
我们从左到右先算两边
右边是一个数组取值的形式,
类似[1, 2, 3][2] //取到数组索引为2的项
由于 +[]
进行隐式类型转换结果为数字类型的0
所以++[[]][+[]]
变成了++[[]][0]
经历数组取值操作后也就是++[]
++[]
在进行隐式类型转换变为++0
也就是数字类型的1
+号右边的很简单中括号里边 +[]
转换为0
最后两边算完是这样:1 + [0]
因为加法运算符在遇到字符串、对象类型(函数、数组、对象)是会把两边的数据转换为字符串进行拼接
所以最终1 + [0]
拼接完结果为字符串类型的"10"
接下来复习一下JS中的数据类型转换
1.Number()
1、undefined: NaN
2、null: 0
3、布尔值: true为1,false为0
4、字符串:
4-1)、空字符串,空格字符串转为0
4-2)、非空字符串,并且内容为纯数字(包含进制与科学计数法)转成对应的数字
4-3)、其余都是NaN
5、对象:
5-1)、对象、函数转成NaN
5-2)、空数组转为0,数组里只有一个数据并且这个数据能转成数字,则转成对应的数字,其它都转成NaN
eg:
Number(7e3) //7000
Number(["3"]) //3
Number([3, 3]) //NaN
Number({}) //NaN
2.String()
1、基本数据类型、null、undefined的结果就是给数据加上引号变成字符串
2、对象:
2-1)、数组的结果为把所有中括号去掉,外面加个引号
2-2)、对象的结果为'[object Object]'
2-3)、函数的结果为在函数整体外面加个引号
String(null) //"null"
String({name: "sf"}) //"[object Object]"
String([3, [4]]) //"3,4"
3.Boolean()
1、undefined: false
2、null: false
3、数字:
+0、-0、NaN转布尔值的结果为false,其它的转布尔值的结果为true
4、字符串:
空字符串转布尔值的结果为false,其它(包括空格字符串)的都转成true
5、对象转布尔值都是true
Boolean(' ') //true
Boolean([]) //true
其实顶层对象Object的原型上有两个方法:
valueOf()和toString()其中
valueOf 返回对象对应的原始值
toString 返回对象的字符串的表现形式
当你使用Number()或String()传入参数是对象时,他们会先调用这两个方法在进行转换
规则如下:
Number方法参数为对象的转换原理:
1、调用对象的valueOf方法。如果返回原始类型的值,再使用Number函数,不再进行后续步骤
2、如果valueOf方法返回的还是对象,则调用toString方法
3、如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤
4、如果toString方法后返回的是还是对象,就报错
String参数为对象的转换原理:
1、调用对象的toString方法。如果返回原始类型的值,再使用String函数,不再进行后续步骤
2、如果toString方法返回的还是对象,再调用对象的valueOf方法
3、如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤
4、如果valueOf方法返回的是还是对象,就报错
大家仅作了解即可,我们都知道除非人为修改toString方法,不然toString()方法咋可能返回对象嘛
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。