[译] 在 JS 运行 {} + {} 是什么结果

本文探讨在JavaScript中运行 {} + {} 时出现的意外结果。加法运算符涉及到值的转换,包括ToPrimitive()、ToNumber()和ToString()。当遇到对象时,会尝试将其转换为原始值,再进行加法操作。对于空对象,{}被视为代码块导致转换异常,从而产生NaN。文章还介绍了不同情况下的转换规则,并通过实例解析了各种加法运算的逻辑。
摘要由CSDN通过智能技术生成

前言

最近在写一个 react 项目的时候,不小心在 render 函数运行了 ‘’ + {}, 出现了奇怪的结果 [object Object], 成功的引起了我的注意。
在 JS 规范中加法运算的规则非常简单:你只能加数字和字符串,其他类型会被转成数字或者字符串。为了能清晰明白转化的过程是怎么样的,我们首先要知道几件事。无论何时当段落提到这个(例如 §9.1),这个都是引用 ES 5.1 标准规范来的。
让我们从一个菜鸟开始学习。在 JS 里面值有两种类型:原始值和对象。原始值有:undefined, null, booleans, numbers, and strings。其他都是对象,包括数组和函数。

Converting values 转换值

加法运算符有三种转换类型:他会转换成原始值,数字和字符串

通过 ToPrimitive() 把值转成原始值

ToPrimitive() 有下面的特征:

ToPrimitive(input, PreferredType?)

可选的形参 PreferredType 可以是数字或者字符串。他只表示一个预设值,结果可以是任何原始值。如果 PreferredType 是数字类型,那么转换步骤就是下面这样的:

  1. 如果输入的是原始值,原地返回输入值
  2. 否则输入的是对象,调用 obj.valueOf()。如果结果是原始值就原地返回。
  3. 否则调用 obj.toString()。如果结果是原始值就原地返回。
  4. 否则抛出错误

如果 PreferredType 是字符串。2 和 3 交换。如果 PreferredType 没有的话,如果是日期类型它会变成字符串,其他就会变成数字。

通过 ToNumber() 把值转成数字

下面的表格展示了 ToNumber() 是怎么将原始值转成数字类型的

参数 结果
undefined NaN
null +0
boolean value true 变成 1, false 变成 +0
number value
string value 解析字符串变成数字,类似于JS方法里面的Number()。 For example, “324” is converted to 324

一个对象通过ToPrimitive(obj, Number) 被转成数字之后调用 ToNumber() 转成原始值

通过 ToString() 把值转成字符串

下面的表格展示了 ToString() 是怎么将原始值转成字符串类型的

参数 结果
undefined “undefined”
null “null”
boolean value “true” 或者 “false”
number value 直接变成字符串, e.g. “1.765”
string value

对象通过ToPrimitive(obj,String) 被转成数字之后调用 ToString() 转成原始值

测试下

下面定义的这个对象可以让你观察转换的过程:

 var obj = {
   
 	valueOf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值