100基本上指出了Ruby和JavaScript的一些奇怪之处.

我在http://jsfiddle.net/fe479/9/岁时做了一系列的测试.

下面列出了特定于JavaScript(我不知道Ruby)的行为.

我在JSFIDLE中发现,我的一些结果与视频中的结果不一致,我不知道为什么.然而,我很想知道JavaScript在每种情况下是如何处理幕后工作的.

Empty Array + Empty Array
[] + []
result:
<Empty String>

我对JavaScript中与数组一起使用的+运算符很好奇.

Empty Array + Object
[] + {}
result:
[Object]

这与视频的结果相符.这是怎么回事?为什么这是一个物体.+号接线员是干什么的?

Object + Empty Array
{} + []
result:
[Object]

这和录像带不符.视频显示结果是0,而我得到的是[Object].

Object + Object
{} + {}
result:
[Object][Object]

这也与视频不匹配,输出一个变量会产生两个对象吗?也许我的JSFdle错了.

Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

做wat+1的结果是wat1wat1wat1wat1...

我怀疑这只是一种简单的行为,试图从字符串中减go 一个数字会产生NaN.

推荐答案

以下是对您正在看到的结果(以及应该看到的结果)的一系列解释.我使用的推荐人来自ECMA-262 standard.

  1. [] + []

    使用加法运算符时,左操作数和右操作数都将首先转换为基元(§11.6.1).根据§9.1,将对象(在本例中为数组)转换为原语将返回其默认值,对于具有有效toString()方法的对象,该值是调用object.toString()(§8.12.8)的结果.对于数组,这与调用array.join()(§15.4.4.2)相同.连接一个空数组会产生一个空字符串,因此加法运算符的第#7步返回两个空字符串的串联,即空字符串.

  2. [] + {}

    [] + []类似,两个操作数都首先转换为原语.对于"对象对象"(§15.2),这也是调用object.toString()的结果,对于非空、非未定义的对象,调用object.toString()的结果是"[object Object]"(§15.2.4.2).

  3. {}+[]

    这里的{}不是作为一个对象解析的,而是作为一个空块解析的(§12.1,至少只要你不强迫该语句成为一个表达式,但稍后会详细介绍).空块的返回值为空,因此该语句的结果与+[]相同.一元+运算符(§11.4.6)返回ToNumber(ToPrimitive(operand)).我们已经知道,ToPrimitive([])是空字符串,根据§9.3.1ToNumber("")是0.

  4. {} + {}

    与前一种情况类似,第一个{}被解析为返回值为空的块.同样,+{}ToNumber(ToPrimitive({}))相同,ToPrimitive({})"[object Object]"相同(参见[] + {}).因此,为了得到+{}的结果,我们必须对字符串"[object Object]"应用ToNumber.按照从§9.3.1开始的步骤,我们得到NaN:

    如果语法不能将字符串解释为StringNumericLiteral的扩展,则ToNumber的结果是NaN.

  5. array(16).join("wat"-1)

    按照§15.4.1.1§15.4.2.2,Array(16)创建一个长度为16的新array.要获得要联接的参数的值,§11.6.2步骤5和6显示,我们必须使用ToNumber将两个操作数转换为一个数字.ToNumber(1)只是1(§9.3),而根据§9.3.1,ToNumber("wat")又是NaN.在§11.6.2,§11.6.3的第7步之后规定

    如果任一操作数为NaN,则结果为NaN.

    Array(16).join的论点是NaN.在§15.4.4.5(Array.prototype.join)之后,我们必须对论点调用ToString,即"NaN"(§9.8.1):

    如果mNaN,则返回字符串100.

    §15.4.4.5步中的第10步之后,我们得到了"NaN"和空字符串串联的15次重复,这等于您看到的结果.

至于为什么在{}+[]的情况下会看到不同的结果:当将其用作函数参数时,您强制语句为ExpressionStatement,这使得无法将{}解析为空块,因此它被解析为空对象文本.

Javascript相关问答推荐

如何在加载的元数据上使用juserc和await中获得同步负载?

通过实现regex逻辑自定义数据表搜索

Express.js:使用Passport.js实现基于角色的身份验证时出现太多重定向问题

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

TypeScript索引签名模板限制

成功完成Reducers后不更新状态

如何让npx在windows中运行js脚本?

PDF工具包阿拉伯字体的反转数字

覆盖TypeScrip中的Lit-Element子类的属性类型

连接到游戏的玩家不会在浏览器在线游戏中呈现

删除加载页面时不存在的元素(JavaScript)

警告框不显示包含HTML输入字段的总和

为列表中的项目设置动画

处理app.param()中的多个参数

输入的值的类型脚本array.排序()

Reaction即使在重新呈现后也会在方法内部保留局部值

在HTML5画布上下文中使用putImageData时,重载解析失败

在每次重新加载页面时更改指针光标

将字符串解释为数字;将其重新编码为另一个基数

使用VITE开发服务器处理错误