Подтвердить что ты не робот

Является ли null действительным именем свойства 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?

4b9b3361

Ответ 1

Все, что находится между скобками свойств, преобразуется в строку. null становится "null", что является допустимым свойством.

Ответ 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".)

Ответ 3

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'
}

Ответ 4

Если ваша среда поддерживает ES6, и вы должны иметь возможность хранить значение для null, а также любую произвольную строку, вы можете использовать Map.

const a = new Map();

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

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

Ответ 5

Я не могу оставлять комментарии, поэтому я создал ответ...

В то время как 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