细述Javascript的加法运算符的具体使用


Posted in Javascript onOctober 18, 2019

简介

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+"5"(第二个操作数是字符串,基于规则2数字1变"1")
  • "1"+"5"(字符串连接)
  • "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() 方法就会被调用并返回字符串,第二个操作数现在是字符串了,因此数字也被转换为字符串,最后执行两个字符串的连接。

Example 5: 数字和null

var result = 8 + null; // 8

解析:

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

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

Example 6: 字符串和null

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

解析:

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

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

Example 7:数字和undefined

var result = 12 + undefined; // NaN

解析:

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

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

可以在JsBin中看这些例子

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js客户端快捷键管理类的较完整实现和应用
Jun 08 Javascript
js 设置缓存及获取设置的缓存
May 08 Javascript
jQuery检查事件是否触发的方法
Jun 26 Javascript
jquery的幻灯片图片切换效果代码分享
Sep 07 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
JS实现按钮添加背景音乐示例代码
Oct 17 Javascript
微信小程序实现复选框效果
Dec 28 Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 Javascript
Javascript节流函数throttle和防抖函数debounce
Dec 03 Javascript
Html5生成验证码的示例代码
May 10 Javascript
ElementUI之Message功能拓展详解
Oct 18 #Javascript
js实现简易计算器功能
Oct 18 #Javascript
JavaScript实现更换背景图片
Oct 18 #Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 #jQuery
CountUp.js数字滚动插件使用方法详解
Oct 17 #Javascript
CountUp.js实现数字滚动增值效果
Oct 17 #Javascript
countUp.js实现数字动态变化效果
Oct 17 #Javascript
You might like
PHP 文件系统详解
2012/09/13 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python Mysql自动备份脚本
2008/07/14 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Flask之flask-script模块使用
2018/07/26 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
html5唤起app的方法
2017/11/30 HTML / CSS
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
毕业生个人的求职信范文
2013/12/03 职场文书
长辈证婚人证婚词
2014/01/09 职场文书
教学质量评估实施方案
2014/03/17 职场文书
真诚的求职信
2014/07/04 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
新手入门Mysql--sql执行过程
2021/06/20 MySQL
详细分析PHP7与PHP5区别
2021/06/26 PHP
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS