理解JS中的加号运算符

2次阅读

共计 1004 个字符,预计需要花费 3 分钟才能阅读完成。

基本运算规则
+ 的使用有两种情况 当 + 连接两个变量或值时即为二元运算符, 比如 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 类型的转换

正文完
 0