为什么在JS arrayTest [undefined]中有效

时间:2015-06-16 10:32:06

标签: javascript

最近我发现arrayTest [undefined] =' something'和arrayTest [null] ='东西'实际上在javascript中有效。看看底部的代码。

var arrayTest = [];
var someText = 'someText';

arrayTest[undefined] = 'undefined';
arrayTest[null] = 'null';
arrayTest[someText] = 'someText';

// ReferenceError: someUndefinedText is not defined
//arrayTest[someUndefinedText] = 'someUndefinedText';

console.log(arrayTest);
//[ undefined: 'undefined', null: 'null', someText: 'someText' ]

有人有逻辑解释为什么这段代码有效。为什么尝试通过显式设置未定义的键来在数组中插入某些内容是有效的,并通过设置某个未定义变量的键来插入数组中的某些内容无效。

注意:由节点v0.12.2

测试

2 个答案:

答案 0 :(得分:4)

未定义的变量(通常更容易将其视为未声明的变量)与具有undefined对象的的变量之间存在差异。 (变量undefinedundefined对象作为其默认值。)

尝试从前者读取将引发引用错误,尝试从后者读取将为您提供undefined对象。

当您使用方括号表示法访问属性时,必须传递一个字符串或可以转换为字符串的内容。 undefined对象转换为字符串"undefined""" + undefined === "undefined")。

// ReferenceError: someUndefinedText is not defined
//arrayTest[someUndefinedText] = 'someUndefinedText';

arrayTest在这里基本上无关紧要。该错误来自于尝试读取变量someUndefinedText以获取要用作属性名称的字符串。

答案 1 :(得分:1)

其实你可以这样做

var arrayTest = [];
var someText = 'someText';

arrayTest[undefined] = 'undefined';
arrayTest[null] = 'null';
arrayTest[someText] = 'someText';

// ReferenceError: someUndefinedText is not defined
//arrayTest[someUndefinedReference] = 'someUndefinedText';

var bar; // test hold undefined value
arrayTest[bar] = 'foo'; // replace the value 'undefined' at index undefined by 'foo'
console.log(arrayTest);

这是因为在javascript中null和undefined是值。所以Javascript没有看到问题。 如果您没有声明变量,则与设置undefined或null不同。它是一个ReferenceError,在此引用中找不到任何值且没有引用!= undefined