Я не смог найти упоминания об этом решении на esdiscuss, поэтому я могу только предложить свою собственную точку зрения.
Как отмечает комментатор, это является частью более широкой тенденции в ES 2015, позволяющей вводить необъектные объекты более широко.В спецификации ES 2015 фраза «В предыдущем издании необъектный аргумент всегда вызывает выброс TypeError
» появляется в отношении 10 различных методов для Object
.
.Во-первых, это изменение приводит поведение Object.keys
в соответствие с поведением циклов for-in
, которые всегда могли работать с примитивами.Учитывая, что в спецификации уже требовался порядок соответствия между Object.keys
и for-in
, требование того же набора допустимых операндов кажется неудивительным.
Это изменение кажется почти таким же безвредным, как и существующий код, при этом значительно сокращаяхрупкость Object.keys
.Даже в вашем случае try-catch трудно представить себе случай, когда успешное выполнение Object.keys
вызывает реальную проблему.Я легко могу представить код, подобный этому:
try {
var keys = Object.keys(input);
} catch {
// oops, input was a primitive; call `new [Constructor]` to wrap it
var keys = Object.keys(
new input.constructor(input)
);
}
Но это не сломается, когда Object.keys
не выдаст ошибку;успешный вызов Object.keys
делает код catch
устаревшим.
Конечно, где-то может существовать такой код:
try {
var keys = Object.keys(input);
} catch {
// oops, input was a primitive; that unlocks the secret prize
giveUserAFreePuppy();
}
По сути, то, что я пытаюсь сказатьчерез очень глупый пример, это то, что случаи, когда пропуск блока catch
был бы действительно проблематичным для работы некоторого кода, кажутся настолько надуманными, что нарушение такого кода кажется небольшой ценой, чтобы заплатить, чтобы получить менее хрупкие Object.keys
функция.