Это безопасный способ проверить, существует ли свойство, назначить другое? - PullRequest
0 голосов
/ 26 января 2019

Ниже приведен пример из примера MDN

var d = withValue.d || (
  withValue.d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: value
  }
);

Это безопасный способ проверить, существует ли свойство, назначить и инициализировать его?Если нет, то есть ли лучший, безопасный и оптимизированный способ?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Нет, вы должны проверить, является ли in объект вместо

Точно так же, как сказал @ureperformance, небезопасно проверять, существует ли свойство объекта, проверяя его значение. Вместо этого вы можете просто проверить, является ли свойство in объектом, используя JavaScript в операторе :

if (!('d' in withValue)) {
  withValue.d = { ... };
}

const { d } = withValue;

Единственная проблема, с которой вы можете столкнуться, это то, что prop in obj будет проверять не только свойства объекта, но и прототип. Однако для большинства случаев это, вероятно, хорошо.

0 голосов
/ 26 января 2019

Нет, это небезопасно, поскольку свойство действительно может существовать для объекта, но оно может быть falsey , в этом случае withValue.d || завершится ошибкой и перейдет к чередованию, назначив объект для d свойство, несмотря на то, что свойство d уже существует. Вместо этого используйте hasOwnProperty и не помещайте присваивание там, где ожидается выражение:

if (!withValue.hasOwnProperty('d')) {
  withValue.d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: value
  }
}
const { d } = withValue;

Если свойство d, если оно существует, всегда будет объектом , то ваш исходный код будет работать , потому что объекты всегда верны. (Код все еще вонючий, хотя, из-за присваивания как выражения)

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