3

先说这一道题:
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()方法咋可能返回对象嘛


丽塔y
29 声望2 粉丝

hey!