资讯专栏INFORMATION COLUMN

理解JS中的加号运算符

nodejh / 2218人阅读

摘要:中的基本数据类型有种,引用数据类型则是指除了上述基本数据类型以外的所有值,比如隐式类型转换加法的隐式转换转换为原始值当需要转换为原始值时,引擎内部会进行抽象操作。

基本运算规则

+的使用有两种情况
+连接两个变量或值时即为二元运算符,比如a + b,当+在变量或值前面时,则为一元运算符,比如+"12.1"

一元运算符

直接转换为Number类型,相当于Number()
常用的还有!运算符,用来转为Boolean类型

二元运算符

加法,可以认为只有两种情况
1、数字 + 数字
2、字符串 + 字符串
其他类型的值相加最终都会隐式转换为上述两种类型相加。

JS中的基本数据类型(primitives)有6种,
String、Number、Boolean、undefined、null、Symbol
引用数据类型则是指除了上述基本数据类型以外的所有值,比如Array、Function
隐式类型转换

加法的隐式转换:

1、转换为原始值

当需要转换为原始值时,JS引擎内部会进行抽象操作ToPrimitive()

ToPrimitive(input,PreferredType?)
// 如果为原始值则直接返回
// 如果为引用数据类型则
// 1、先尝试调用valueOf()方法,如果返回值为原始值,则返回该值
// 2、否则,尝试调用toString()方法,如果返回值为原始值,则返回该值
// 3、否则,抛出异常
// 注:
// 1、如果第二个参数PreferedType为String,则2和3顺序调换,即先调用toString。
// 2、PreferedType默认为Number,但在遇到Date类型的值时为String

具体转换规则可以参考ECMA规范中9.1的ToPrimitive[[DefaultValue]]部分

2、转换为数字

规则为:

类型 结果
undefined NaN
null 0
Boolean true为1,false为0
Number /
String 转数字,"" -> 0
Object 先ToPrimitive转为原始值再转为数字
3、转换为字符串

直接转换,不做赘述,对象类型时参考数字的处理

相关面试题
[] + {} // 结果为 "[object Object]"
[] + [] // 结果为 ""
{} + {} // 结果为 NaN
{} + [] // 结果为 0,当语句开始为{时,会被JS解释器认为是代码块,所以实质上是 +[]
{} + {} // 结果为NaN,原因同上

注:第五道面试题在node.js环境下的运行结果却是"[object Object]",node和chrome同样使用了V8引擎,想来是对此做了特殊处理

参考

深入理解Javascript中Object类型的转换

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102898.html

相关文章

  • JS的{} + {}与{} + []的结果是什么?

    摘要:对于与的设计在中所设计的纯对象类型的与方法,它们的返回如下方法返回值对象本身。与三个强制转换函数,所对应的就是在标准中的三个内部运算转换的对照表。 在JS中的运算符共同的情况中,(+)符号是很常见的一种,它有以下的使用情况: 数字的加法运算,二元运算 字符串的连接运算,二元运算,最高优先 正号,一元运算,可延伸为强制转换其他类型的运算元为数字类型 当然,如果考虑多个符号一起使用时,...

    2json 评论0 收藏0
  • js入门笔记整理(二)——操作符

    摘要:上一篇入门笔记整理一元操作符递增递增分为前置递增和后置递增前置型两个加号放在前面这个操作其实就是给加,上面的列子等效于前置递增其实可以分为两步操作,其加运算高于赋值号运算,如等效于先运行加运算为再运行赋值运算后置型两个加号放在后面这个操作其 上一篇:js入门笔记整理 一元操作符 递增 递增分为前置递增和后置递增前置型——两个加号(++)放在前面 var num = 1; ++n...

    JasonZhang 评论0 收藏0
  • JavaScript 类型转换

    摘要:这样导致结果不一致,等解析语句为,对空对象强制转为数字类型,即为,将非空字符串转换为数字类型,结果为。综上,右边表达式转换为。 首先从一系列让JavaScript初学者抓狂的运算说起。 1 + {} {} + 1 [] + {} {} + [] [] + [] {} + {} 能全部答对上面的运算结果,不必浪费时间继续阅读本文了。如果对某一些的结果还不确定,请慢慢往下看。 上面列的所有...

    sydMobile 评论0 收藏0
  • 从 ++[[]][+[]]+[+[]]==10? 深入浅出弱类型 JS 的隐式转换

    摘要:与此相对,强类型语言的类型之间不一定有隐式转换。三为什么是弱类型弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等。在中,加性运算符有大量的特殊行为。 从++[[]][+[]]+[+[]]==10?深入浅出弱类型JS的隐式转换 本文纯属原创? 如有雷同? 纯属抄袭? 不甚荣幸! 欢迎转载! 原文收录在【我的GitHub博客】,觉得本文写的不算烂的...

    miya 评论0 收藏0
  • JS最新基本数据类型:BigInt

    摘要:意外四舍五入会损害程序的可靠性和安全性。下面是一些例子构造函数与其他基本类型一样,可以使用构造函数创建。总结是一种新的数据类型,用于当整数值大于数据类型支持的范围时。 为了保证的可读性,本文采用意译而非直译。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。在对大整数执行数学运算时,以任意精...

    lwx12525 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<