JS运算符及显示隐式类型转换

2020-08-07  本文已影响0人  LuoDada
  1. 加法规则
  1. 布尔值和布尔值相加、数字和布尔值相加。布尔值默认会自动转成数值,然后相加。
console.log(true + false) // 1
console.log(2 + true) // 3
  1. 两个字符串相加。这时加法运算符会变成连接运算符,返回一个新的字符串。
console.log('abc' + 'def') // abcdef
  1. 字符串与非字符串相加。这时非字符串会转成字符串,再连接在一起。
console.log(123 + 'abc') // 123abc
  1. 对象相加。如果运算子是对象,必须先转成原始类型的值,然后再相加。

如果想得到想要的结果,可以自定义valueOf方法或toString方法。

console.log({} + 'abc') // [object Object]abc
console.log([1] + 'abc') // 1abc
console.log([1,2,3] + 'abc') // 1,2,3abc
详解:
1. console.log({} + 'abc') // [object Object]abc
第一步:
  {}会自动调用valueOf方法// {}.valueOf => {}
第二步:
  这时再自动调用对象的toString方法,将其转为字符串。// {}.toString() => [object Object]
第三步:
  [object Object] + 'abc' = '[object Object]abc'
  1. 非加法运算符减法、乘法、除法(一律转为数值,在进行相应的数字运算)
console.log('100' - 20) // 80
console.log('abc' - 1) // NaN
console.log(2 * '8') // 16
console.log(2 * 'abc') // NaN
console.log('12' / 2) // 6
console.log('abc' / 2) // NaN

3.数值运算符,负数值运算符 (+、-)

数值运算符的作用可以将任何值转换成数值类型;

console.log(+true)  // 1
console.log(+[])  // 0
console.log(+{}) // NaN

console.log(-true)  // -1
console.log(-[])  // -0
console.log(-{}) // NaN
  1. 指数运算符(**)

前一个数是底数,后一个数是指数。指数的运算是【右结合】。

console.log(2 ** 3) // 8
console.log(2 ** 3 ** 2) //512 => 相当于2**(3**2) 
  1. 字符串的比较(区分大小写=>Unicode不同)

字符串按照字典顺序进行比较:JavaScript 引擎内部首先比较首字符的 Unicode 码点。如果相等,再比较第二个字符的 Unicode 码点,以此类推。

console.log('a' > 'A') // true 'a'.charCodeAt() => 97 'A'.charCodeAt()=> 65
  1. 非字符串的比较
  1. 原始类型值
    如果两个运算子都是原始类型的值,则会先转成【数值】再比较。
  2. 对象
    如果运算子是对象,会转为【原始类型的值】,在进行比较。

7.undefined和null

undefined其他类型的值比较时,结果都是false,它们相互比较时结果为true.

console.log(undefined == null) // true
console.log(undefined === null) // false

console.log(123 > undefined)  // false
console.log(123 < undefined)  // false

console.log(123 > null) // true
console.log(123 < null) // false

console.log(0 > null) // false
console.log(0 < null) // false
console.log(0 == null) // false
  1. 数据类型转换-Number()
console.log(Number('123')) // 123
console.log(Number('123abc')) // NaN
console.log(Number(true)) // 1
console.log(Number(false)) // 0
console.log(Number('')) // 0
console.log(Number(undefined)) // NaN
console.log(Number(null)) // 0
console.log(Number({})) // NaN
console.log(Number([])) // 0
console.log(Number([6])) // 6
console.log(Number([1, 2])) // NaN
  1. 第一步:
    调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
  2. 第二步:
    如果valueOf方法返回还是对象,则改为调用对象只身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不在进行后续步骤。
  3. 第三步:
    如果toString方法返回的是对象,就报错。
  1. 数据类型转换-String()
console.log(String('123')) // '123'
console.log(String(true)) // 'true'
console.log(String(false)) // 'false'
console.log(String(undefined)) // 'undefined'
console.log(String(null)) // 'null'
console.log(String({})) // '[object Object]'
console.log(String([])) // 
console.log(String([6])) // '6'
console.log(String([1, 2])) // '1,2'

String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。[String([1,3,2]) // “1,3,2”]

  1. 第一步:
    先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行后续操作。
  2. 第二步:
    如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不在进行以下步骤。
  3. 第三步:
    如果valueOf方法返回的是对象,就报错。
  1. 数据类型转换-Boolean()
console.log(Boolean('123')) // true

console.log(Boolean('')) // false
console.log(Boolean(0)) // false
console.log(Boolean(false)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(null)) // false
console.log(Boolean(NaN)) // false

Boolean函数可以将任意类型转为布尔值。
undefined、null、false、0、''、NaN 为false其它都为true

Boolean(new Boolean(false)) // true

console.log(Boolean({})) // true
console.log(Boolean([])) // true
console.log(Boolean([6])) // true
console.log(Boolean([1, 2])) // true
上一篇 下一篇

猜你喜欢

热点阅读