数组之间运算的语义

时间:2014-09-25 17:03:14

标签: javascript arrays

我今天正在编码,我在javascript中声明一个数组数组(使用文字符号)时犯了一个错误,我忘记在数组中的每个元素之间放置一个逗号。经过一些进一步的测试后,我得到了:

[[0][0]]给了我[0]

[[1][2]]给了我[undefined]

[0][0]给了我0

[3][3]给了我undefined

[3]3给了我一个SyntaxError: Unexpected number

[][]给了我SyntaxError: Unexpected token ]

[3]*3给了我9(数字不在数组中)

[3,4]*3给了我NaN

[3,3]*[3,3]给了我NaN

[3,3]*[[3,3]]给了我NaN

[3,3][3,3]给了我undefined

[3,3][[3,3]]给了我undefined

起初我认为这种行为可能是数学向量/矩阵乘法,但似乎并非如此。

因此,每个数组之间的no运算符与添加*运算符明显不同,*运算符本身似乎既不执行标量乘法也不执行矩阵乘法。

减号和分号似乎总是产生NaN,加号似乎在两个数组上调用toString并且连接字符串。

我发现很奇怪,两个数组之间的操作背后的语义是什么?对我来说,最有意义的是在声明Array Array时总是给出错误,并在声明Array _operator_ Array时总是给出NaN。但事实并非如此。 +符号至少是有意义的,因为Array继承自Object,如果你尝试new Date() + new Date()也会发生这种情况(这种自动toString调用有时会很有用,虽然我不会这样设计语言)。

1 个答案:

答案 0 :(得分:3)

  

*运算符本身似乎既不执行标量乘法也不执行矩阵乘法。减号和分号似乎总是产生NaN。

事实上。 */-仅适用于数字,他们会将操作数转换为数字。数组[3,3]将在该过程中首先转换为字符串"3,3,这不是有效数字,因此NaN作为结果。使用[3]*3它“有效”,因为数组已转换为数字3。同样,[3]-[1]会产生2

  

因此,每个数组之间的no运算符与添加*运算符明显不同。我发现很奇怪,两个数组之间的操作背后的语义是什么?

如果你确实在数组之间放置了“无操作符”,则后者不再是数组。第一对[…]确实构建了array literal,但以下所有[…]都是property accessors括号表示法。 [0][0]只访问恰好是[0]的{​​{1}}数组的第一项。

这就是0语法错误的原因 - 括号表示法需要属性名称的表达式。

您使用[…][]看到的是用于分隔表达式的comma operator,它不是数组文字,而是解析为[…][…,…]。您的…[(…, …)]相当于[3,3][3,3],访问数组[3,3][3]中的第四项将产生[3,3]

  

+符号至少是有意义的,因为Array继承自Object,如果你尝试新的Date()+ new Date()也会发生这种情况(这种自动toString调用有时可能很有用,虽然我不会设计这种语言方式)。

是的,undefined运算符在JS中很复杂,因为它处理多种不同的类型并执行(数字)添加或(字符串)连接。

当您在对象上使用它时,情况会更糟。在这种情况下,尝试将其转换为原始值(字符串,数字,布尔值),并为此应用[[DefaultValue]] algorithm(没有提示)。当两个操作数都被识别为数字时,执行添加 - 这甚至可能发生在对象上:

+