null是有效的javascript属性名称吗?

时间:2012-03-13 16:17:29

标签: javascript

Javascript对象可以用作地图。以下全部是有效代码:

var x = {};
x.a = 1;
x['b'] = 2; // the same as x.b = 2;
x[3] = 3; // x.3 won't work, but this syntax works fine. Also, x[3] == x['3'].
x['What, this works too?!?!?'] = 'Yup, it does!';

但是今天我测试了另一个似乎有效的案例,但在我的头脑中引起了一些警告标志,因为它看起来......错了:

x[null] = 42;

现在,如果按预期工作,那将是非常酷的(我不必重写一堆代码),但我可以依赖它吗?或者这只是一些未记录的行为,只是发生在所有现代浏览器中工作,但也可能停止在下一版Google Chrome上工作?

5 个答案:

答案 0 :(得分:21)

属性括号之间的任何内容都将转换为字符串。 null变为"null",这是一个有效的属性。

答案 1 :(得分:2)

这是有效的ECMAScript 5,但在某些版本的Internet Explorer中可能会遇到问题。

这很好:

x = {};
x[null] = 42;
x[null];
// 42

x = {"null": 42};
x[null];
// 42

但是,IE8不接受以下保留字,例如null

x.null
// Error: Expected identifier

x = {null: 42}
// Expected identifier, string or number

(上述两项工作均在Chrome中进行,即使已启用"use strict"。)

答案 2 :(得分:0)

x['null'] = 42;
但是,我强烈反对避免混淆。

属性名称是字符串。每个字符串都可以工作,甚至代表保留标识符。

不是字符串的所有内容都将转换为字符串(通过调用对象的toString()方法):

a = ['FOO'];   // an array
o = {};        // an object
o[a] = 'foo';  // using a as the property name

// o now is:
{
  FOO: 'foo'
}

答案 3 :(得分:0)

我不能发表评论,所以我创建了答案......

虽然Rob W是正确的,但他的回答有点误导。方括号之间的项目使用ToString()转换为字符串。所以,[null]只等于['null'],因为ToString(null)=='null'

以例如

var a = 1;
var x = {}

x[a] = 20;
x['1'] = 30; -- this is exactly the same as the previous line and now x[a] == 30

答案 4 :(得分:0)

如果您的环境支持ES6,并且您需要能够存储null的值以及任意字符串,那么您可以使用Map

const a = new Map();

a.set(null, 'foo')
a.set('null', 'bar')

// Map { null => 'foo', 'null' => 'bar' }