重学JS: 隐式强制类型转换

隐式强制类型转换指的是那些隐藏的强制类型转换,反作用也不是很明显,事实上,只要本身以为不够明显的强制类型转换均可以算做隐式强制类型转换,接下来,此文将会介绍几种常见的隐式类型转换。函数

加法操做符

转换规则:编码

  • 若是两个操做数,一个操做数是数字,另外一个数是布尔值,那么则将布尔值转换为数字,而后进行加法操做
  • 若是两个操做都是字符串,则将第二个操做数与第一个操做数拼接起来
  • 若是只有一个操做数是字符串,则将另外一个操做数转换为字符串,而后再将两个字符串拼接起来code

    • 若是另外一个操做数是数字、或布尔值,则调用它们的toString()方法取得对应的字符串值
    • 若是另外一个操做数对象,对象valueOf()方法返回基本值,则调用valueOf()方法取得返回值,而后再作字符串拼接,不然直接调用toString()方法取得对应的字符串值

举例:对象

console.log(1 + true) // 2
console.log('1' + '1') // '11'
console.log(1 + '1') // '11'
console.log('1' + 'true') // '1true'
var a = {
  valueOf: function() {
    return 2
  },
  toString: function() {
    return 1
  }
}
var b = {b: 1}
console.log(a + '1') // '21'
console.log(b + '1') // '[object Object]1'

减法操做符

转换规则:字符串

  • 若是有一个操做数字符串、布尔值、null或者undefined,则先在后台调用Number()函数将其转换为数值,若是转换的结果是NaN,则减法的结果就是NaN
  • 若是有一个操做数是对象,则调用的valueOf()方法取得表示该对象的数值,若是获得的结果是NaN,则减法的结果就是NaN。若是对象valueOf()方法返回不是基本值,则调用toString()方法并将获得的字符串转为数字

举例:io

console.log(5 - '1') // 4
console.log(5 - true) // 4
console.log(5 - null) // 5
console.log(5- undefined) // NaN
const c = {
  valueOf: function() {
    return '1'
  }
}
console.log(5 - c) // 4

隐式强制类型转为布尔值

场景:console

  • if()语句中的条件判断表达式
  • for()语句中的条件判断表达式
  • while()和do..while()循环条件中的判断表达式
  • ?:三元运算中的判断表达式
  • 逻辑元算符||和&&左边的操做数

以上的场景中非布尔值会被隐式的强制转为布尔值,转换规则遵循上篇文章的ToBoolean转换规则

举例:字符编码

const d = 11
const e = null
let f
const g = f ? d : e
console.log(g) // null
console.log(d && e) // null
console.log(d || e) // 11

相等

相等操做符分为宽松相等==和严格相等===,这两个都用来判断值是否相等,区别在于在判断两边操做数是否相等时,宽松相等容许进行强制类型转换,而严格相等不容许进行强制类型转换,所以下面只会介绍宽松相等在比较时的强制类型转换

转换规则:function

  • 若是有一个操做数是布尔值,则在比较相等性以前先将其转换为数值,false转为0true转为1
  • 若是一个操做数是字符串,另外一个操做数是数字,在比较以前先将字符串转换为数字
  • 若是一个操做数是对象,另外一个操做数不是,则调用对象的valueOf()方法,若不是基本类型值,则调用toString()方法,用获得的基本类型值按照前面的规则进行比较
  • null和undefined是相等的
  • 要比较相等性以前,不能将null和undefined转换成其余任何值
  • 若是有一个操做数是NaN,则相等操做符返回false,而不相等返回true。即便两个操做数都是NaN,相等操做符也返回false
  • 若是两个操做数都是对象,则比较它们是否是同一个对象。若是两个操做数都指向同一个对象,则相等操做符返回true,不然,返回false

举例:class

console.log(null == undefined) // true
console.log('NaN' == NaN) // false
console.log(5 == NaN) // false
console.log(NaN == NaN) // false
console.log(NaN != NaN) // true
console.log(false == 0) // true
console.log(true == 1) // true
console.log(true == 2) // false
console.log(undefined == 0) // false
console.log(null == 0) // false
console.log('5' == 5) // true

比较操做符

比较操做符包括小于(<)、大于(>)、小于等于(<=)、和大于等于(>=)
转换规则:

  • 若是两个操做数都是字符串,则比较两个字符串的字符编码值
  • 若是一个操做数是数值,则将另外一个操做数转换为数值,而后进行数值比较
  • 若是一个操做数是对象,则调用这个对象的valueOf()方法,若返回值是基本类型,则用获得的结果进行比较,不然调用toString()方法,用获得的值进行比较
  • 若是一个操做数是布尔值,则先将其转换为数字,而后进行比较

举例:

console.log('11' < 3) // false
console.log(true < 2) // true
const h = {
  valueOf: function () {
    return '22'
  }
}
console.log(h > 1) // true

总结

这篇文章对JS中的常见隐式强制类型转换作了一个小结,但愿能对你们理解有所帮助。若是有错误或不严谨的地方,欢迎批评指正,若是喜欢,欢迎点赞

相关文章
相关标签/搜索