- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。
我在 http://jsfiddle.net/fe479/9/ 上对结果进行了 JSFiddle .
下面列出了特定于 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步返回两个空字符串的串联,也就是空字符串。
[] + {}
类似于[] + []
,两个操作数都先转换为原语。对于“对象对象”(第 15.2 节),这又是调用 object.toString()
的结果,对于非空、非 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]"
(参见 [] + {}
)。所以要得到 +{}
的结果,我们必须对字符串 "[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 步之后,我们得到 15 次重复的 "NaN"
和空字符串的串联,这等于您看到的结果。当使用 "wat"+ 1
而不是 "wat"- 1
作为参数时,加法运算符将 1
转换为字符串而不是转换 "wat"
到一个数字,所以它有效地调用 Array(16).join("wat1")
.
至于为什么您在 {} + []
案例中看到不同的结果:当将其用作函数参数时,您将语句强制为 ExpressionStatement,这使得无法将 {}
解析为空 block ,因此它被解析为空对象字面量。
关于javascript - CodeMash 2012 的 'Wat' 演讲中提到的这些奇怪的 JavaScript 行为的解释是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032856/
我对以下难题深感困惑: a = 10 b = a c = a c = c + 1 results in a = 10 b = 10 c = 11 but the following a = ["c",
我一直在使用 C# 和 .NET 4.5,直到我需要为 Windows XP 制作一个应用程序,而 .NET 4.5 不支持它 我的问题是如何实现这个功能: private async
我注意到 Matlab 和 Octave 中的各种情况,其中函数接受矩阵和向量,但对向量的处理与对矩阵的处理不同。 这可能会令人沮丧,因为当您输入一个行数/列数可变的矩阵时,它可能会被解释为一个向量,
例如,在 Wat 中在我的 Chrome 浏览器中: {} + {} 是NaN 但是在 Node REPL 中,它是 [object Object][object Object] 无可否认,后者对我来
我想从 Amazon S3 下载 WAT 存档段的子集。 背景: 搜索 http://index.commoncrawl.org 处的 Common Crawl 索引会生成包含有关 AWS S3 上
我想用 JavaScript 制作一个简单的 WebAssembly 交互式 fiddle 。假设用户以文本格式输入 WebAssembly 源代码,如何将其转换为运行它所需的二进制格式? 我正在寻找
今天我在正则表达式中偶然发现了一个奇怪的行为——匹配。我无法解释,尽管我认为我对正则表达式很有经验 print re.sub('a*|b', '', 'bcd') bcd 没有 glob 的地方 p
'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。 我在 http://jsfiddle.net/fe479/9/ 上对结果
我没有得到 [ClassInitilize] 属性的好处。 示例代码 [TestClass] public class MyTestClass { static MyTestClass()
'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。 我已经将结果制作为 JSFiddle http://jsfiddle.n
'Wat' talk for CodeMash 2012 基本上指出了 Ruby 和 JavaScript 的一些奇怪的怪癖。 我已经将结果制作为 JSFiddle http://jsfiddle.n
我正在尝试使用 i64 生成一个 .wat 文件,但它只是编译为 i32。 在 C 代码中,我使用 int 和 int64_t 进行了测试,但没有成功。 这是 C 代码: #include #inc
我正在尝试使用 i64 生成一个 .wat 文件,但它只是编译为 i32。 在 C 代码中,我使用 int 和 int64_t 进行了测试,但没有成功。 这是 C 代码: #include #inc
我是一名优秀的程序员,十分优秀!