为null是有效的javascript属性名称

Is null a valid javascript property name?

本文关键字:属性 javascript null 有效      更新时间:2023-09-26

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;

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

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

它是有效的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

(即使启用了"use strict",上述两项都可以在Chrome中工作。)

我不能留下评论,所以我创建了一个答案。。。

虽然Rob W是正确的,但他的回答有点误导。方括号之间的项使用ToString()转换为字符串。因此,一个[null]只等于一个['ull'],因为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

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

const a = new Map();
a.set(null, 'foo')
a.set('null', 'bar')
// Map { null => 'foo', 'null' => 'bar' }
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'
}