详解Js加法运算符

更新日期: 2019-10-18阅读: 2.7k标签: 运算符

简介

JavaScript是一门了不起的语言。我喜欢它的灵活性:只需以你喜欢的方式做事:更改变量类型,动态的向对象添加方法或属性,对不同的变量类型使用运算符等等。

然而动态是要付出代价的,开发人员需要知道怎样处理对于不同操作符的类型转换:加号(+),等号(==和===),不等号(!=和!==)等等,许多运算符有自己处理类型转换的方式。


加法运算符

最常用的运算符:+,这个运算符用于接连字符串或对数字求和:

字符串连接

var result = "Hello, " + "World!";
// 字符串 + 字符串 = 字符串 (连接)
// "Hello, World!"

数字算术相加

var result = 10 + 5;
// 数字 + 数字 = 数字 (相加)
// 15

JavaScript允许使用对象,数组,null或undefined作为操作数。下面试着揭开转换的一般规则。


转换规则

使用下面的等式看一下在操作运算符里JavaScript是如何进行类型转换的:

  1. 如果至少有一个操作数是对象,会被转换成原始值(字符串,数字或布尔);
  2. 转换之后,如果至少有一个操作数是字符串类型,第二个操作数会被转换成字符串,并且会执行连接。
  3. 在其他的情况下,两个操作数都会转换成数字并执行算数加法运算。

如果两个操作数都是原始类型,运算符会检查是否至少有一个是字符串类型,如果是就执行连接操作。其他情况就都转换为数字并求合。


对象类型转为原始类型

对象类型向原始类型的转换

  • 如果对象类型是Date,会调用该对象的toString();
  • 其他情况下,如果valueOf()返回的是原始类型,会调用对象的valueOf();
  • 其他情况下(如果valueOf()不存在或没有返回原始类型),会调用toString()方法,大部分情况下是用的这种转换。

当数组转换为原始类型,JavaScript会使用它的join(',')方法,例如[1,5,6]就是"1,5,6"。普通JavaScript对像{}的原始类型是"[object Object]"。


学习例子

下面的例子帮助我们理解简单和复杂的转换场景。

例1:数字和字符串

var result = 1 + "5"; // "15"

解析:

  1. 1+"5"(第二个操作数是字符串,基于规则2数字1变"1")
  2. "1"+"5"(字符串连接)
  3. "15"

第二个操作数是字符串,第一个操作数从数字转换为字符串,然后进行连接。

例2:数字和数组

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

解析:

  1. [1, 3, 5] + 1 (使用规则1,将数组[1, 3, 5]转换成原始值: "1,3,5")
  2. "1,3,5" + 1 (使用规则,将数字1转换为字符串 "1")
  3. "1,3,5" + "1" (字符串连接)
  4. "1,3,51"

第1个操作数是数组,所以它被转换为原始字符串值,在下一步数字操作数转换为字符串,然后再完成两个字符串的连接。

例3:数字和布尔类型

var result = 10 + true; //11

解析:

  1. 10 + true (基于规则3将布尔值true转换成数字1)
  2. 10 + 1 (将两个数字求值)
  3. 11

因为两个操作数都不是字符串,布尔值转换成数字,然后执行算术的求和。

例4:数字和对象

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

解析:

  1. "15 + {}" (第二操作数是个对象,应用规则1将对象转换为原始类型字符串"[object Object]")
  2. 15 + "[object Object]" (使用规则2将数字15转换成字符串 "15")
  3. "15" + "[object Object]" (字符串连接)
  4. "15[object Object]"

第二个对象操作数转为字符串值,因为valueOf()方法返回对象本身,它不是原始值,toString() 方法就会被调用并返回字符串,第二个操作数现在是字符串了,因此数字也被转换为字符串,最后执行两个字符串的连接。

例5: 数字和null

var result = 8 + null; // 8

解析:

  1. 8 + null (因为两个操作数都不是字符串,基于规则3将null转为数字0)
  2. 8 + 0 (数字相加)
  3. 8

因为操作数不是对象也不是字符串,null被转换成数字,然后计算数字的和。

例6: 字符串和null

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

解析:

  1. "queen" + null (因为第一个操作数是字符串,基于规则2将null转成字符串"null")
  2. "queen" + "null" (字符串连接)
  3. "queennull"

因为第一个操作数是字符串,null转成字符串,然后进行字符串连接。

例7:数字和undefined

var result = 12 + undefined; // NaN

解析:

  1. 12 + undefined (因为操作数都不是对象或字符串,基于规则3将undefined转为数字NaN)
  2. 12 + NaN (数字相加)
  3. NaN

因为操作数都不是对象或字符串,undefined转为数字:NaN,对数字和NaN进行相加求值等于NaN.


总结

为了避免潜在的问题,不要对对象进行使用加法运算符,除非你清楚的定义了toString()或valueOf()方法。正如例子中所看到了,加法操作符有很多特定的情况。了解确切的转换场景能帮你避免未来的意外,祝coding愉快!

翻译:道奇;作者:Dmitri Pavlutin 
原文:https://dmitripavlutin.com/  

链接: https://www.fly63.com/article/detial/6037

理解强大的 ES6 「 ... 」运算符

... 运算符, 是ES6里一个新引入的运算法, 也叫展开/收集 运算符, 我们每天都要和它打交道。这篇文章,我就带你系统的回顾下这个运算符, 介绍一些基础和进阶的用法。

对象扩展运算符和 rest 运算符及 keyof 和查找类型

TypeScript 2.1 增加了对 对象扩展运算和 rest 属性提案的支持,该提案在 ES2018 中标准化。可以以类型安全的方式使用 rest 和 spread 属性。对象 rest 属性假设已经定义了一个具有三个属性的简单字面量对象

JS 中使用扩展运算符的10种方法

我们可以使用展开操作符复制数组,不过要注意的是这是一个浅拷贝。这样我们就可以复制一个基本的数组,注意,它不适用于多级数组或带有日期或函数的数组。

JavaScript中强大的操作符&运算符总汇

JS 里的操作符大家每天都在使用,还有一些 ES2020、ES2021 新加的实用操作符,这些共同构成了 JS 灵活的语法生态

4个你从未听说过的强大的 JavaScript 运算符

你有没有花一个下午的时间浏览过 Mozilla 文档?如果你有,你会很清楚网上有很多关于 JavaScript 的信息。这使得人们很容易忽略一些不同寻常的 JavaScript 操作符。

ES6 扩展运算符 三点...

扩展运算符( spread )是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。array.push(...items)和add(...numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。

JavaScript展开运算符和剩余运算符的区别

JavaScript使用符号三个点(...)作为剩余运算符和展开运算符,不过这两个运算符是有区别的。最主要的区别就是,剩余运算符将用户提供的某些特定值的其余部分放入JavaScript数组中

JavaScript 代码的一个新运算符:管道运算符 |>

首先,如果是嵌套写法的话,简单的嵌套还好,但是当嵌套变得很深的时候就有点难以阅读了。嵌套的执行流程是从右到左移动的,而不是我们正常阅读代码从左到右的方向

JavaScript运算符单竖杠|

很多人都对双竖杠||非常熟悉,因为这个经常在项目中经常会用到。单竖杠|,却很少在项目开发中使用到。|是位运算符,||是逻辑运算符。平常,经常使用以下这个几个方法对数字进行处理。

Js ES6扩展运算符(spread)和剩余运算符(rest)

Spread 和 Rest 是 ES6 Javascript 提供的两个功能,分别主要用于解构和函数参数处理。Spread 从可迭代对象(如数组、字符串或对象)中获取元素并将它们分散到各个部分。这就像将一副纸牌铺在桌子上一样。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!