- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。
我已经将结果制作为 JSFiddle http://jsfiddle.net/fe479/9/ .
下面列出了 JavaScript 特有的行为(因为我不了解 Ruby)。
我在 JSFiddle 中发现我的一些结果与视频中的结果不符,我不确定为什么。然而,我很好奇 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]
这也与视频不匹配,输出一个变量如何产生两个对象?也许我的 JSFiddle 是错误的。
Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
执行 wat + 1 会产生 wat1wat1wat1wat1
...
我怀疑这只是简单的行为,尝试从字符串中减去数字会导致 NaN。
最佳答案
以下是对您所看到(以及应该看到)的结果的解释列表。我使用的引用来自 ECMA-262 standard 。
[] + []
使用加法运算符时,左操作数和右操作数都会首先转换为基元 (§11.6.1)。根据 §9.1 ,将对象(在本例中为数组)转换为基元会返回其默认值,对于具有有效 toString()
方法的对象,该默认值是调用 object.toString 的结果()
(§8.12.8)。对于数组,这与调用 array.join() 相同(§15.4.4.2)。连接空数组会产生空字符串,因此加法运算符的第 7 步返回两个空字符串的串联,即空字符串。
[] + {}
与[] + []
类似,两个操作数都首先转换为基元。对于“Object 对象”(第 15.2 节),这又是调用 object.toString()
的结果,对于非 null、非 undefined object 是 “[object Object]”
(§15.2.4.2)。
{} + []
此处的 {}
不会解析为对象,而是解析为空 block ( §12.1 ,至少只要您不强制该语句为表达式,但更多关于稍后)。空 block 的返回值为空,因此该语句的结果与+[]
相同。一元 +
运算符 ( §11.4.6 ) 返回 ToNumber(ToPrimitive(operand))
。我们已经知道,ToPrimitive([])
是空字符串,根据 §9.3.1 ,ToNumber("")
是 0。
{} + {}
与之前的情况类似,第一个 {}
被解析为返回值为空的 block 。同样,+{}
与 ToNumber(ToPrimitive({}))
相同,而 ToPrimitive({})
是 "[对象对象]”
(请参阅[] + {}
)。因此,要获得 +{}
的结果,我们必须对字符串 "[object Object]"
应用 ToNumber
。当执行 §9.3.1 中的步骤时,我们得到 NaN
结果:
If the grammar cannot interpret the String as an expansion of StringNumericLiteral, then the result of ToNumber is NaN.
Array(16).join("wat"- 1)
根据 §15.4.1.1 和 §15.4.2.2 ,Array(16)
创建一个长度为 16 的新数组。要获取要连接的参数的值,§11.6.2 步骤 #5 和 #6 表明我们必须使用 ToNumber
将两个操作数转换为数字。 ToNumber(1)
只是 1 ( §9.3 ),而 ToNumber("wat")
又是 NaN
根据 §9.3.1 。在 §11.6.2 的步骤 7 之后,§11.6.3 指示
If either operand is NaN, the result is NaN.
因此 Array(16).join
的参数是 NaN
。遵循 §15.4.4.5 (Array.prototype.join
),我们必须对参数调用 ToString
,即 "NaN"
( §9.8.1 ):
If m is NaN, return the String
"NaN"
.
在 §15.4.4.5 的第 10 步之后,我们得到了 "NaN"
和空字符串的串联 15 次重复,这等于您看到的结果。当使用 "wat"+ 1
而不是 "wat"- 1
作为参数时,加法运算符会将 1
转换为字符串,而不是转换 "wat"
为数字,因此它有效地调用 Array(16).join("wat1")
。
至于为什么您在 {} + []
情况下看到不同的结果:当将其用作函数参数时,您将强制语句成为一个ExpressionStatement,这使得无法将 {}
解析为空 block ,因此它被解析为空对象文字。
关于javascript - 对于 CodeMash 2012 的 'Wat' 演讲中提到的这些奇怪的 JavaScript 行为有何解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399805/
语音 api 在 WinRT(如 Windows Phone 8)中是否可用。 我可以改用一些第三方语音 api 吗? 我想在我的 Windows 8/WinRT 应用程序中实现 TTS,有人有什么建
我希望将 Ted 演讲嵌入我的网站,但想要居中。 iframe 位于多个 div 中,因此我在隔离和编码必要参数时遇到了一些麻烦。 当前代码: 最佳答案 为第一个 div 尝试样式 margin:
据我了解,TED 可能不会考虑制作黑莓应用程序。我已经创建了一些框架来解析各种类型的 API/提要/服务,并且想知道是否有一种方法可以让第三方开发人员制作 TED 应用程序。我曾通过 Google 听
这个问题与this other question @ SuperUser有关. 我要下载 TED Talks以及离线观看的相应字幕,例如让我们看this short talk by Richard S
我是一名优秀的程序员,十分优秀!