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上工作?
答案 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' }