“加号 +” 的运算原理(详细!!!)
“加号 +” 的运算原理(“+” 既是一元运算符,也是二元运算符)
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。
截取自 “空对象 {}” 与 “空数组 []” 的相加问题(详解!!!)
“加号 +” 的运算原理(详细!!!)相关推荐
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/index.html 一.系统架构 本文以一个实际的产品为例,来说明 JPEG 在其中的应用. ...
- 【机器学习】算法原理详细推导与实现(七):决策树算法
[机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...
- 显卡结构及工作原理详细解读
显卡结构及工作原理详细解读 标签: 显卡三维图像 2016-01-16 20:58 864人阅读 评论(0) 收藏 举报 分类: 3D原理(11) 什么是显卡? 显卡的工作非常复杂,但其原理和部件 ...
- JPEG 原理详细分析
一 JPEG 概述 JPEG 是 Joint Photographic Experts Group 的缩写,即 ISO 和 IEC 联合图像专家组,负责静态图像压缩标准的制定,这个专家组开发的算法就被 ...
- 【youcans 的 OpenCV 例程200篇】137. 灰度开运算和灰度闭运算原理
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...
- python爬虫原理-python爬虫原理详细讲解
原标题:python爬虫原理详细讲解 一 .爬虫是什么 1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. 2.互联网建立的目的?互联网的 ...
- Java中的与、或、非以及异或( | ~ ^)运算符的运算原理
首先,我们要知道Java存储数据是保存的补码,如果对原码.反码以及补码不太懂,可以参考我的另一篇博客. 1. Java的 与( & ) 运算 所有的逻辑运算都是按位计算的,所以第一步就是先把数 ...
- shell编程入门 linux解释器原理,Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对.doc...
Shell编程入门Linux解释器原理详细介绍 使用Shell进行工作的人们对 Shell编程入门:Linux解释器原理详细介绍使用Shell进行工作的人们对Unix/Linux下的Shell编程都很 ...
- 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC
wxleasyland@139.com 2022.7 以前写过<我学习CRC32.CRC16.CRC原理和算法的总结(与WINRAR结果一致)>长篇.经过十几年又忘记了. 这次碰到DS18 ...
- 计算机加减乘除运算原理
计算机加减乘除运算原理 加减法原理 原码,反码,补码 机器数:数值在计算机中的真实存储:如[+2]为[00000010],[-2]为 [10000010] :其最高位称为符号位,0代表正数,1代表负数 ...
最新文章
- 7、kubernetes 核心技术-Controller 控制器
- ThinkPHP5表单令牌+表单数据验证验证规则
- ES6 Map数据结构
- 计算机科学导论 第4版,计算机科学导论.第4版
- go 获取内核个数_图解Go运行时调度器
- web前端技术分享:web前端的求职前景好不好?
- 诺基亚对塞班的支持将持续到2016年
- 自动化运维之saltstack(二)states深入理解
- 使用TFHelp解析Html
- BitmapFactory.Options详解
- 重磅|前浪、后浪 一起迎接风口! BCS 2020向全球发起议题征集
- Tomcat报错 严重: A child container failed during start
- 线程的创建方式及Runnable与Callable的区别
- 将知网格式的.caj文件转换为.pdf文件
- Build/Launch EDKII emulator in Windows and Linux:编译/运行Windows和Linux环境下EDKII模拟器[4]
- MySQL数据库学习资料(七)
- 讲解如何禁止iOS屏幕自动旋转
- 【linux基础1】linux命令行使用技巧
- 计算机网络实验IP数据报分片,实验报告三IP数据分片.doc
- 利用计算机的认识与感受制作海报,手绘pop海报在大学中的应用和现实意义