Почему Object.keys был изменен, чтобы принудить примитивы в объекты в ES2015? - PullRequest
6 голосов
/ 04 июня 2019

Кто-нибудь знает причину изменения от выдачи ошибки при передаче примитива до Object.keys до бесшумного приведения примитива к объекту и возврата результата?

Я не уверен, что кто-то ожидал бы, что Object.keys('abc') вернет [0, 1, 2], и это, кажется, нарушает основную директиву "не ломай сеть". Что если на каком-то веб-сайте есть код, обертывающий вызов Object.keys в попытке / отлове для обработки вызовов, ошибочно передававших примитив?

Вот почему я чувствую, что за изменением должно быть веское обоснование. Мне было бы очень интересно, если бы у кого-нибудь была информация об этом.

1 Ответ

1 голос
/ 05 июня 2019

Я не смог найти упоминания об этом решении на 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 функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...