# 隐式类型转换

js中的数据类型是非常弱的,在使用算数运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和一个数字相加。之所以不同的数据类型之间可以做运算,是因为js引擎在运算之前会悄悄地把他们进行了隐式类型转换。

console.log([] == []) // false
console.log([] == ![]) // true
console.log([] !== [])  // true
console.log(NaN != NaN) // true
console.log(null == undefined) // true
console.log(null === undefined) // false
console.log(1 == true) // true
console.log(null > 0) // false
console.log(true + 1) // 2
console.log(undefined + 1) // NaN
console.log({} + 1) // [object Object]1
console.log([] + {}) // [object Object]
console.log([2,3] + [1,2])  // 2,31,2
1
2
3
4
5
6
7
8
9
10
11
12
13

js为我们提供了严格比较与类型转换比较两种模式,严格比较(===)只会在操作符两侧的操作对象类型一致,并且内容一致时才会返回true,否则返回false。而更为广泛使用的==操作符则会首先将操作对象转化为相同类型,在进行比较。

# 相等操作符

相等操作符会对操作值进行隐式转换后进行比较:

  • 如果一个操作值为布尔值,则在比较之前先将其转换为数值
  • 如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
  • 如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
  • null与undefined是相等的
  • 如果一个操作值为NaN,则相等比较返回false
  • 如果两个操作值都是对象,则比较它们是不是指向同一个对象

# 加法运算操作符:

加法运算符在js中也用作字符串拼接,所以加法操作符的规则分为两种

  • 如果一个数是NaN,则结果就是NaN
  • 如果是Infinity+Infinity,结果是Infinity
  • 如果是-Infinity+(-Infinity),结果是-Infinity
  • 如果是Infinity+(-Infinity),结果是NaN
  • 如果有一个操作值是字符串,则:
  • 如果两个都是字符串则,拼接起来
  • 一个有一个操作值是字符串,则将另外的值转换成字符串,然后拼接起来
  • 如果又一个值是对象、数值或者布尔值,则调用toString()方法取得字符串值,然后再应用前面的字符串规则。对于undefined和null,分别调用String()显式转换为字符串。

# 逻辑操作符(!、&&、||)

逻辑非(!)操作符首先通过Boolean()函数将它的操作值转换为布尔值,然后求反。

# 逻辑与(&&)操作符,如果一个操作值不是布尔值时,遵循以下规则进行转换:

  • 如果第一个操作数经Boolean()转换后为true,则返回第二个操作值,否则返回第一个值(不是Boolean()转换后的值)
  • 如果有一个操作值为null,返回null
  • 如果有一个操作值为NaN,返回NaN
  • 如果有一个操作值为undefined,返回undefined

# 逻辑或(||)操作符,如果一个操作值不是布尔值,遵循以下规则:

  • 如果第一个操作值经Boolean()转换后为false,则返回第二个操作值,否则返回第一个操作值(不是Boolean()转换后的值)
  • 对于undefined、null和NaN的处理规则与逻辑与(&&)相同

# 关系操作符(<, >, <=, >=)

与上述操作符一样,关系操作符的操作值也可以是任意类型的,所以使用非数值类型参与比较时也需要系统进行隐式类型转换:

  • 如果两个操作值都是数值,则进行数值比较
  • 如果两个操作值都是字符串,则比较字符串对应的字符编码值
  • 如果只有一个操作值是数值,则将另一个操作值转换为数值,进行数值比较
  • 如果一个操作数是对象,则调用valueOf()方法(如果对象没有valueOf()方法则调用toString()方法),得到的结果按照前面的规则执行比较
  • 如果一个操作值是布尔值,则将其转换为数值,再进行比较

# 总结

参考链接

  • https://www.cnblogs.com/mengxiangji/p/11080006.html

# 致谢

感谢大家阅读我的文章,如果对我感兴趣可以点击页面右上角,帮我点个star。

作者:我会放电啪啪

链接: https://www.cnblogs.com/mengxiangji/p/11080006.html

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上次更新: 2019-11-18 3:11:11 ├F10: PM┤