javascript类型转换
转Boolean
在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。
对象转基本类型
对象在转换基本类型时,首先会调用 valueOf 然后调用 toString。并且这两个方法你是可以重写的。
let a = {
valueOf() {
return 0
}
}
也可以重写 Symbol.toPrimitive ,该方法在转基本类型时调用优先级最高。
let a = {
valueOf() {
return 0;
},
toString() {
return '1';
},
[Symbol.toPrimitive]() {
return 2;
}
}
1 + a // =3
'1' + a // ='12'
四则运算符
只有当加法运算时,其中一方是字符串类型,就会把另一个也转为字符串类型。
并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串。
其他运算只要其中一方是数字,那么另一方就转为数字。
1 + '1' // '11'
2 * '2' // 4
[1, 2] + [2, 1] // '1,22,1'
// [1, 2].toString() -'1,2'
// [2, 1].toString() -'2,1'
// '1,2' + '2,1' = '1,22,1'
'a' + + 'b' // -"aNaN"
// 因为 + 'b' -NaN
// 你也许在一些代码中看到过 + '1' -1
== 操作符
比较运算x==y,其中和和y是值,产生tue或者 false.这样的比较按如下方式进行:
1.若Type(x)与 Typey)相同,则
a.若Type(x)为 Undefined,返回true
b.若Type(x)为Nu,返回tue
c.若Type(x)为 Number,则
1.若x为NaN,返回fase
2.若y为NaN,返回 False
3.若x与y为相等数值,返回true
4.若x为+0且y为-0,返回true
5.若x为-0且y为+0,返回te
6..返回fase
d.若 Type(x)为 String则当x和y为完全相同的字符序列(长度相等且相同字符在相同位置)时返回ue.否则返回fase
e.若Type(x)为 Boolean,当x和y为同为rue或者同为 false时返回true.否则,返回 false
f.当x和y为引用同一对象时返回tue.否则,返回 false
2.若x为nu且y为 undefined,返回true
3.若x为 undefined且y为nu,返回te
4.若Type(x)为 Number且 Type(y)为Stng,返回 comparison x== ToNumbery)的结果.
5.若Type(x)为 String且Type(y)为 Number,
6.返回比较 ToNumber(x)y的结果
7.若Type(x)为 Boolean,返回比较 ToNumbert(x)y的结果.
8.若 Type(y)为 Boolean,返回比较x== ToNumber(y)的结果
9.若Type(x)为Stng或 Number,且 Type(y)为 Object,返回比较x== ToPrimitivey)的结果.
10.若Type(x)为 Object且Type(y)为 String或 Number,返回比较 ToPrimitive(x)==y的结果.
11.返回 false.
上图中的 toPrimitive 就是对象转基本类型。
DEMO
// 解析[] == ![] // -true ,下面是这个表达式为何为 true 的步骤
// [] 转成 true,然后取反变成 false
[] == false
// 根据第 8 条得出
[] == ToNumber(false)
[] == 0
// 根据第 10 条得出
ToPrimitive([]) == 0
// [].toString() -''
'' == 0
// 根据第 6 条得出
0 == 0 // -true
比较运算符
- 如果是对象,就通过 toPrimitive 转换对象
- 如果是字符串,就通过 unicode 字符索引来比较
参考资料:
前端进阶之道