2017-02-17 10 views
-1

В Python, JavaScript, JSON (и, вероятно, других языках тоже) вам разрешено переопределить ключ в словаре буквальным образом:Почему Переопределение ключа в словаре литерале Разрешенный

{ "foo" : 1, "foo" : 2 } 

Это похоже это привело бы к непредсказуемым результатам, и я не могу себе представить, почему человек будет делать это намеренно. Есть ли веская причина, что это разрешено?

+6

Возможно, это потому, что словарь находится в процессе создания, поэтому поиск каждой клавиши, видимой, если она уже существует, слишком медлительна. – martineau

+2

Простота и согласованность. Изменение ключа/значения разрешено вообще, и порядок корректно определен в случае литерала. Это позволяет более легко и естественно писать код, который генерирует, скажем, JSON из разрозненных источников. – pvg

+0

Есть, вероятно, веские причины, но, возможно, вам стоит перефразировать ваш вопрос относительно того, было бы возможно или желательно обнаружить дубликаты и какие ошибки было бы целесообразно бросить в этом случае. Например, это, вероятно, выходит за рамки грамматики CF (синтаксический анализатор), и, как говорили другие, вам нужно будет создать хеш-таблицу для обнаружения дубликатов, так что это не делается для вас. –

ответ

2

Это не приведет к непредсказуемому результату. Последний ключ будет иметь свое значение в объекте.

var o = { "foo" : 1, "foo" : 2 }; 

в значительной степени так же, как:

var o = {}; 
o["foo"] = 1; 
o["foo"] = 2; // overrides the previous ones 
// o == {"foo": 2} 
+0

Я не вижу этих двух одинаковых. Ключи ассоциативного массива неупорядочены, поэтому неясно, что происходит. Второе совершенно очевидно. – speedplane

+0

@speedplane Когда интерпретатор анализирует (слева направо), я думаю, что он назначил пары ключ-значение, поскольку они интерпретируют их, поэтому эти два ** почти ** одинаковы! –

+0

Это зависит от вашего понимания того, как интерпретатор интерпретирует код, он не имеет смысла с точки зрения языка. – speedplane

1

Javascript объектов существенно сопоставить ассоциативные массивы, которые имеют функциональные возможности добавления, удаления и переназначение хранилищ ключей значение.

Если объект имеет возможность переназначить значение, почему он помешает вам сделать это? Существует много разных способов определения объекта в Javascript, и я бы предположил, что накладные расходы на ограничение операций на основе синтаксиса были бы безумными и обеспечивали бы очень мало (IMO no) значение.