详解加法运算符

JavaScript 内里差别的范例做加法之前,需要做种种转换,这里做一个比较完善的总结。

基础转换规则

  1. 运算两边存在对象时

    • 假如有一个对象,那末先把它转换成基础范例值

    • 转换以后,假如有字符串,另一个值先转换成字符串,然后再做衔接操纵

    • 假如没有,把两者转换成数字再相加

  2. 假如两者都是基础范例值,先搜检是不是有字符串范例,假如有就做衔接操纵;假如没有,就把两者转换成数字相加。

对象转换成基础范例值

  • 假如是 Date 对象,那末用toString()

  • 别的状况下,用valueOf()

  • 其他状况下(valueOf()不存在或许不返回基础范例值),那末用toString()

举例

数字加字符串

var result = 1 + '5' // 15

两者都是基础范例值,且有字符串,因而做衔接操纵。

数字加数组

var result = [1, 3, 5] + 1 // "1, 3, 51"

数组是援用范例,先用valueOf()举行转换,然则数组的valueOf()的效果照样本来的数组,所以用toString()要领获得一个字符串"1, 3, 5";然后是一个字符串加一个数字,做衔接操纵。

数字加 boolean

var result = 10 + true // 11

两者都是基础范例值,且没有字符串,所以把true转换成数字相加。

数字加对象

var result = 15 + {} // "15[object Object]"

起首对对象做转换,对象的valueOf照样本身,所以用toString()来转换,{}.toString()的效果是"[object Object]",所以末了的效果就是"15[object Object]"

数字加 null

var result = 8 + null // 8

null 转为0,再做加法运算。

字符串加 null

var result = "queen" + null // "queennull"

数字加 undefined

var result = 12 + undefined // NaN

undefined转换成数字,获得NaN,因而加法的效果就是NaN

[] + {}

var result = [] + {} // "[object Object]"

两者都是对象,而且两者的valueOf要领的效果都是本身,所以要挪用toString要领。空数组挪用的效果是个空字符串,空对象挪用的效果是"[object Object]", 字符串衔接以后的效果就是"[object Object]"

{} + []

var result = {} + [] // 0

在这里,{}被剖析成一个空的 block,因而实际上剖析成如许:

{ // empty block }
+ []

就是把一个空数组转换成数值,挪用valueOf以后照样本身,因而挪用toString, 获得一个空字符串,转换成数字0。

参考:

    原文作者:陈屹峤
    原文地址: https://segmentfault.com/a/1190000005158296
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞