理解JS中的加号运算符

clipboard.png

基本运算规则

+的使用有两种状况
+链接两个变量或值时即为二元运算符,好比a + b,当+在变量或值前面时,则为一元运算符,好比+'12.1'javascript

一元运算符

直接转换为Number类型,至关于Number()
经常使用的还有!运算符,用来转为Boolean类型java

二元运算符

加法,能够认为只有两种状况
一、数字 + 数字
二、字符串 + 字符串
其余类型的值相加最终都会隐式转换为上述两种类型相加。node

JS中的基本数据类型(primitives)有6种,
String、Number、Boolean、undefined、null、Symbol
引用数据类型则是指除了上述基本数据类型之外的全部值,好比Array、Function

隐式类型转换

加法的隐式转换:面试

一、转换为原始值

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

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

具体转换规则能够参考ECMA规范中9.1的ToPrimitive[[DefaultValue]]部分spa

二、转换为数字

规则为:code

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

三、转换为字符串

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

相关面试题

[] + {} // 结果为 '[object Object]'
[] + [] // 结果为 ''
{} + {} // 结果为 NaN
{} + [] // 结果为 0,当语句开始为{时,会被JS解释器认为是代码块,因此实质上是 +[]
{} + {} // 结果为NaN,缘由同上

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

参考

深刻理解Javascript中Object类型的转换字符串

相关文章
相关标签/搜索