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 字符索引来比较

参考资料:
前端进阶之道

posted @ 2019-07-30 15:55  guangzan  阅读(209)  评论(0编辑  收藏  举报