Ответ 1
Все, что находится между скобками свойств, преобразуется в строку. null
становится "null"
, что является допустимым свойством.
Объекты 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?
Все, что находится между скобками свойств, преобразуется в строку. 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
(Оба вышеперечисленного работают в Chrome, даже с включенным "use strict"
.)
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'
}
Если ваша среда поддерживает ES6, и вы должны иметь возможность хранить значение для null
, а также любую произвольную строку, вы можете использовать Map.
const a = new Map();
a.set(null, 'foo')
a.set('null', 'bar')
// Map { null => 'foo', 'null' => 'bar' }
Я не могу оставлять комментарии, поэтому я создал ответ...
В то время как 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