0

[ ][[ ]]的结果未定义 ,因为 this [[ ]][ ]抛出SyntaxError: Unexpected token ]。有什么解释吗?

4

7 回答 7

4

object[key]语法用于通过 获取 的属性,该属性object必须在key里面,key否则[]会出现语法错误。

[][[]],对象是一个空数组[],键是另一个空数组[]

[[]][],对象是一个数组,里面有一个空数组,而里面没有键[]

于 2013-10-09T09:37:54.240 回答
2

[]定义一个空数组,因此[][[]]可以重写为:

var a = [];
var b = [];
var c = a[b];

现在通过索引访问数组,其中索引本身是一个数组是未定义的——标准没有说明应该发生什么,但它在语法上是有效的。

然而[[]][]被打破了——这可以写成最接近的手写体是:

var a = [];
var b = [];
[b]a;

...这是胡说八道的代码。

于 2013-10-09T09:36:44.333 回答
2

我不明白为什么有人会想要使用这样的东西,但这里有一个解释:

情况1:

[]是一个空数组。通过添加[n]( [][n]),您可以引用第 n 个元素。n在你的情况下是[]. 解释器尝试将其转换为可用值并以空字符串 ("") 结束。因此,您实际上尝试[][""]引用undefined

案例二:

[[]]是一个空数组中的一个空数组。通过添加[n]( [[]][n]),您可以引用外部数组的第 n 个元素。您需要提供索引n,否则会引发错误,这在您的情况下会发生。

于 2013-10-09T09:37:10.150 回答
1

我无法想象你为什么需要使用它,但这是我的解释:

[[]] 是 new Array(new Array()),它是一个元素为 ONE 的数组,一个空数组。

[] 是一个空数组,因此您可以执行 [][2] 或 [][0] 并返回 undefined。第二个 [] 是索引。

因此,在 [] [[]] 中,您正在寻找一个索引,即索引 []。

[][0] == [][[]]

但在 [[]] [] 中,索引为空,相当于 [1,2,3][] -> SyntaxError: Unexpected token ]

于 2013-10-09T09:37:30.450 回答
0

JavaScript 对象具有与之关联的属性。您可以使用简单的点表示法或方括号表示法访问对象的属性,如果被non existing key引用,它会给出undefined值。

var obj = {};
obj[ 'key' ] 

一件重要的事情是在 JavaScript 数组中是一个对象

console.log( [] instanceof Object ) // gives true so it act like object

有趣的是,我们像下面这样通过。

var keyCanbeFunction = function(){};
var keyCanbeObject = {};
var keyCanbeArray = [] ;

console.log( obj[ keyCanbeArray ] ) // gives undefined, that key not exists

第一种情况

var obj = [];
obj[ keyCanbeArray  ] // gives undefined

和第二种情况

var obj = [[ ]]
obj[]; // where is key ???  
于 2013-10-09T10:06:41.010 回答
0

好的。只是你应该用一个键访问数组。否则会抛出语法错误。

[][[]]- 数组已定义,并且您正在访问[]该数组中未定义的键。

[[]][]- 定义了数组,并且您没有传递任何键来访问该数组 - 语法错误。

于 2013-10-09T09:38:15.027 回答
0

我猜会发生类型转换:

[][
    // an index is expected here
    [] // so javascript probably tries to get a number from this empty array
]

这可能相当于:

[][+[]] // +[] gives 0

而在这种模式中,[[]][]两个数组是并排声明的。

于 2013-10-09T09:53:33.373 回答