类型转换 
- Date()构造函数,当它收到一个不是- Date实例的参数时 —— 字符串表示日期字符串,而数值表示时间戳。
- +运算符 —— 如果运算对象(两边只要有一边儿是)是字符串,执行字符串串联;否则,执行数值相加。
- ==运算符 —— 如果一个运算对象是原始值,而另一个运算对象是对象(object),则该对象将转换为没有首选类型的原始值。
js
console.log({} + []); // "[object Object]"1
{}  和  []  都没有  [Symbol.toPrimitive]()  方法。 {}  和  []  都从 Object.prototype.valueOf 继承  valueOf() ,其返回对象自身。因为返回值是一个对象,因此它被忽略。因此,调用  toString()  方法。{}.toString() 返回  "[object Object]" ,而 [].toString() 返回  "" ,因此这个结果是它们的串联: "[object Object]" 。
有三种不同的路径可以将对象转换为原始值:
- 原始值强制转换: [Symbol.toPrimitive]("default")→valueOf()→toString()
- 数字类型强制转换、number 类型强制转换、BigInt 类型强制转换: [Symbol.toPrimitive]("number")→valueOf()→toString()
- 字符串类型强制转换: [Symbol.toPrimitive]("string")→toString()→valueOf()
boolean 
- undefinedturns into- false.
- nullturns into- false.
- 0,- -0, and- NaNturn into- false; other numbers turn into- true.
- 0nturns into- false; other BigInts turn into- true.
- The empty string  ""turns intofalse; other strings turn intotrue.
- Symbols turn into  true.
- All objects become  true.
String 
- 字符串按原样返回。
- undefined转换成- "undefined"。
- null转换成- "null"。
- true转换成- "true";- false转换成- "false"。
- 使用与 toString(10)相同的算法转换数字。
- 使用与 toString(10)相同的算法转换 BigInt。
- Symbol 抛出 TypeError。
- 对于对象,首先,通过依次调用其 [Symbol.toPrimitive]()(hint 为"string")、toString()和valueOf()方法将其转换为原始值。然后将生成的原始值转换为一个字符串。
Number 
- Number 将按原样返回
- undefined转换为- NaN。
- null转换为- 0。
- true转换为- 1;- false转换为- 0。
- 字符串将被假定为包含数字字面量,并通过解析它们来转换。解析失败会得到  NaN。与实际数字字面量相比,它们有一些细微的差别:- 前导和尾随的空格 / 换行符会被忽略。
- 前导的数字  0不会导致该数值成为八进制字面量(或在严格模式下被拒绝)。
- +和- -允许出现在字符串的开头以指示其符号。(在实际代码中,它们 “看起来像” 文字的一部分,但实际上是独立的一元运算符。)然而,该标志只能出现一次,并且后面不能跟空格。
- Infinity和- -Infinity被当作是字面量。在实际代码中,它们是全局变量。
- 空字符串或仅包含空格的字符串转换为  0。
- 不允许使用数字分隔符。
 
- BigInt 抛出 TypeError,以防止意外的强制隐式转换导致精度损失。
- Symbol 抛出 TypeError。
- 对象首先通过按顺序调用它们的 [Symbol.toPrimitive]()(使用"number"提示)、valueOf()和toString()方法将其转换为原始值。然后将得到的原始值转换为数字。
Object 
另外 
parseInt() 
parseInt 相比 Number ,就没那么严格了, parseInt 函数逐个解析字符,遇到不能转换的字符就停下来
js
parseInt('32a3') //321
除了 + 有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
js
'5' - '2' // 3
'5' * '2' // 10
true - 1  // 0
false - 1 // -1
'1' - 1   // 0
'5' * []    // 0
false / '5' // 0
'abc' - 1   // NaN
null + 1 // 1
undefined + 1 // NaN1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
null 转为数值时,值为 0  。 undefined 转为数值时,值为 NaN
等号 
等于操作符( == )在比较中会先进行类型转换,再确定操作数是否相等
null 和 undefined 相等
如果有任一操作数是  NaN  ,则相等操作符返回  false
如果一个操作数是对象,另一个操作数不是,则调用对象的  valueOf() 方法取得其原始值,再根据前面的规则进行比较
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true
全等操作符由 3 个等于号( === )表示,只有两个操作数在不转换的前提下相等才返回  true 。即类型相同,值也需相同
js
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n' == 0 // true1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12