我今天正在编码,我在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调用有时会很有用,虽然我不会这样设计语言)。
答案 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(没有提示)。当两个操作数都被识别为数字时,执行添加 - 这甚至可能发生在对象上:
+