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

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方法(一般来说,对象的valueOf方法总是返回对象自身) ,如果返回原始类型的值,则不在调用toString方法。
  • 第二步:
    如果valueOf方法返回还是对象,再自动调用对象的toString方法,将其转为字符串。
  • 第三步:
    如果toSrting方法返回的是对象,就会报错。

如果想得到想要的结果,可以自定义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'

2.非加法运算符减法、乘法、除法(一律转为数值,在进行相应的数字运算)

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()
  • 原始类型值
    Number函数将字符串转为数值,只要有一个字符串无法转为数值,整个字符串就会被转为NaN。
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方法返回的是对象,就报错。

9.数据类型转换-String()

  • 原始数据类型
    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方法返回的是对象,就报错。

10.数据类型转换-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

  • 对象
    所有的对象的布尔值都是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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值