“加号 +” 的运算原理(“+” 既是一元运算符,也是二元运算符)

1. 一元运算符

说明:’+’ 号运算符作为一元运算符时,表达式将进行 ToNumber() 操作(隐式类型转换)。
注:有关隐式类型转换,可参考 Javascript基础:隐式类型转换

① ToNumber(argument) 转换方式:

argument类型 返回值
Undefined return NaN
Null return 0
Boolean true return 1; false return 0;
Number return value
String 若字符串为纯数字,返回转换后的数字;非纯数字则返回 NaN
Symbol 抛出 TypeError 异常
Object 进行如右步骤:1.先进行 ToPrimitive(argument, hint Number) 得到 rs ; 2.然后返回 ToNumber(rs) 的结果。

② 示例:

 // Undefined+ undefined; // => NaN// Null+ null; // => 0// Boolean+ true; // => 1+ false; // => 0// String+ '1'; // => 1+ '-1'; // => -1+ 'a1'; // => NaN// Object+ []; // => 0+ {}; // => NaN+ { valueOf: function () { return 0 } }; // => 0/**   该对象重写了 valueOf() 方法,*    因此该对象隐式转换过程中调用 valueOf() 方法后得到 0,*   故最终结果为 0*/

2. 二元运算符

① 运算元其一为字符串(String)

  运算元其一为字符串时,进行字符串的拼接操作。

 console.log('10' + 1);          //   101console.log('ab' + 'cd');       //  abcdconsole.log('1' + true);        //   1trueconsole.log('1' + undefined);   //  1undefinedconsole.log('1' + null);        // 1null

② 运算元其一为数字(Number)

  1 + ‘cd’ 为运算元其一为字符串情况,做字符串拼接操作;其余为在没有字符串情况下,运算元其一为数字,做类型转换后做数值相加。

 console.log(1 + 1);            //  2console.log(1 + 'cd');        //    1cdconsole.log(1 + true);         //   2console.log(1 + undefined);    // NaNconsole.log(1 + null);         //   1

注:在运算元一侧为数字,另一侧为字符串的情况下,如果是 “减号 - ” 或其他运算符(eg:“*”、“/”、“%”、“ >”、“<”、“==”) 的话,会将字符串转换为数字进行减法操作(eg:数字相减:10 - “1” = 9)。

③ 数字(Number) / 字符串(String) 以外的原始类型相加

  当数字与字符串以外的其他原始数据类型直接使用加号运算时,要先转为数字(可参考上面有关 “ToNumber(argument) 转换方式” 的表格)再运算,这与字符串完全无关。

 console.log(true + true);             // 2console.log(true + null);             // 1console.log(true + undefined);        //NaNconsole.log(undefined + null);        //NaNconsole.log(undefined + undefined);   //NaNconsole.log(null + null);            //0

④ 运算元其一为复杂数据类型(以下为初步解释,示例请见后续第三大点)

注意,以上 ① ~ ③ 的示例均是原始数据类型的 “加法 +” 操作,当进行复杂数据类型的 “加法 +” 操作时,JS 内部有以下有隐式转换过程(实际上是 JS 调用了内部的 toPrimitive() 方法,有关该方法详见 JS原始值转换算法—toPrimitive() ):
  Ⅰ 当 “加号 +” 的某一侧数据类型是对象时,会将对象先进行 valueOf() 操作(有关 valuOf() 方法可参考博文 JS 中 valueOf() 方法的详解);
  Ⅱ 如果返回的是原始数据类型,则后续操作按照以上三点进行;
  Ⅲ 如果返回的值还是对象,则再调用 toString 方法(此处应了解 “ [] 调用 toString() 方法变成空字符串 "",{} 调用 toString() 等于 [object Object] ,有关 toString 方法详解可参考 有关 toString() 方法的初步认识 );
  Ⅳ 若返回原始数据类型,则按照上面原始数据类型计算;
  Ⅴ 否则报错。

⑤ 有关 NaN 需要注意的点

  Ⅰ. 执行运算时 , 非带 “+” 号的运算,只要有 NaN 参与,执行结果就都是 NaN;
  Ⅱ. 如果是带 “+” 号的运算,一侧是 NaN、另一侧是字符串时,就执行字符串拼接操作;
  Ⅲ. 如果是带 “+” 号的运算,一侧是 NaN、另一侧是 Number 类型的数值时,执行结果就都是 NaN;
  Ⅳ. 在 JavaScript 中的规定,NaN 表示的是非数字,但是这个非数字也是不同的;因此 NaN 不等于 NaN,两个 NaN 永远不可能相等。
注:NaN 虽然不是一个具体数值,但数据类型确是 Number 类型;NaN 和任何 Number 类型数据进行 “+”、“-”、“*”、“/”、“% 等操作时,操作结果都是 NaN。


截取自 “空对象 {}” 与 “空数组 []” 的相加问题(详解!!!)

“加号 +” 的运算原理(详细!!!)相关推荐

  1. JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用

    http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/index.html 一.系统架构 本文以一个实际的产品为例,来说明 JPEG 在其中的应用. ...

  2. 【机器学习】算法原理详细推导与实现(七):决策树算法

    [机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...

  3. 显卡结构及工作原理详细解读

    显卡结构及工作原理详细解读 标签: 显卡三维图像 2016-01-16 20:58 864人阅读 评论(0) 收藏 举报  分类: 3D原理(11)  什么是显卡? 显卡的工作非常复杂,但其原理和部件 ...

  4. JPEG 原理详细分析

    一 JPEG 概述 JPEG 是 Joint Photographic Experts Group 的缩写,即 ISO 和 IEC 联合图像专家组,负责静态图像压缩标准的制定,这个专家组开发的算法就被 ...

  5. 【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算原理

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  6. python爬虫原理-python爬虫原理详细讲解

    原标题:python爬虫原理详细讲解 一 .爬虫是什么 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. 2.互联网建立的目的?互联网的 ...

  7. Java中的与、或、非以及异或( | ~ ^)运算符的运算原理

    首先,我们要知道Java存储数据是保存的补码,如果对原码.反码以及补码不太懂,可以参考我的另一篇博客. 1. Java的 与( & ) 运算 所有的逻辑运算都是按位计算的,所以第一步就是先把数 ...

  8. shell编程入门 linux解释器原理,Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc...

    Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对 Shell编程入门:Linux解释器原理详细介绍使用Shell进行工作的人们对Unix/Linux下的Shell编程都很 ...

  9. 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC

    wxleasyland@139.com 2022.7 以前写过<我学习CRC32.CRC16.CRC原理和算法的总结(与WINRAR结果一致)>长篇.经过十几年又忘记了. 这次碰到DS18 ...

  10. 计算机加减乘除运算原理

    计算机加减乘除运算原理 加减法原理 原码,反码,补码 机器数:数值在计算机中的真实存储:如[+2]为[00000010],[-2]为 [10000010] :其最高位称为符号位,0代表正数,1代表负数 ...

最新文章

  1. 7、kubernetes 核心技术-Controller 控制器
  2. ThinkPHP5表单令牌+表单数据验证验证规则
  3. ES6 Map数据结构
  4. 计算机科学导论 第4版,计算机科学导论.第4版
  5. go 获取内核个数_图解Go运行时调度器
  6. web前端技术分享:web前端的求职前景好不好?
  7. 诺基亚对塞班的支持将持续到2016年
  8. 自动化运维之saltstack(二)states深入理解
  9. 使用TFHelp解析Html
  10. BitmapFactory.Options详解
  11. 重磅|前浪、后浪 一起迎接风口! BCS 2020向全球发起议题征集
  12. Tomcat报错 严重: A child container failed during start
  13. 线程的创建方式及Runnable与Callable的区别
  14. 将知网格式的.caj文件转换为.pdf文件
  15. Build/Launch EDKII emulator in Windows and Linux:编译/运行Windows和Linux环境下EDKII模拟器[4]
  16. MySQL数据库学习资料(七)
  17. 讲解如何禁止iOS屏幕自动旋转
  18. 【linux基础1】linux命令行使用技巧
  19. 计算机网络实验IP数据报分片,实验报告三IP数据分片.doc
  20. 利用计算机的认识与感受制作海报,手绘pop海报在大学中的应用和现实意义

热门文章

  1. Ubuntu 使用XCB
  2. 免费在线条码二维码识别
  3. linux驱动篇-touchscreen-精简版
  4. 华为OD机试题:按区间反转文章片段
  5. Infor SyteLine ERP 报告设置
  6. Java实现生成并下载Excel文件
  7. Linear-gradient()
  8. 赤兔之死高考满分作文原文及赏析
  9. 记一次计算机课作文,记一次有趣的作文课作文800字
  10. 1934. 贝茜放慢脚步