Необходимо разбить охранные операторы, чтобы предотвратить дополнительные вычисления?

Давайте сравним obj1 и obj2 в этом коде:

var target1 = {}, target2 = {};
var obj1 = Object.create(target1, {myProp: {value: 1}});
var obj2 = Object.assign(target2, {myProp: 1});

Прототипическая цепочка

Object.create создает новый объект с указанным [[Prototype]] , и Object.assign присваивает свойства непосредственно указанному объекту:

obj1 !== target1;
obj2 === target2;

Прототипные цепочки obj1 и obj2 выглядят как

obj1 --> target1 -->  Object.prototype --> null
obj2 -------------->  Object.prototype --> null

Свойства

Object.create определяет свойства, а Object.assign назначает их только.

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

Object.getOwnPropertyDescriptor(obj1, 'myProp');
  // { value: 1, writable: false, enumerable: false, configurable: false }
Object.getOwnPropertyDescriptor(obj2, 'myProp');
  // { value: 1, writable: true, enumerable: true, configurable: true }
2
задан hgale 15 January 2019 в 18:13
поделиться

2 ответа

Нет нет необходимости разбивать утверждения.

Вы можете легко проверить это, выполнив следующий код:

var condition = false
func failingTest() -> Bool {
  fatalError("this should never execute")
}
guard condition, failingTest() else {
  print("Early exit")
  return
}
  • Когда это печатает Early exit, вы знаете, что он не оценил все условия охраны перед печатью ранний выход.
  • Когда это вызывает фатальную ошибку, вы знаете, что он выполнил failingTest даже после того, как знал, что condition было ложным.

При выполнении этого фрагмента кода с использованием Apple Swift version 4.2.1 мы получаем Early exit, поэтому мы знаем, что Swift прекращает оценку условий защиты после первого условия, которое оценивается как false.

Обычно вы должны иметь возможность искать подобные вещи в справочнике по языку . Но в этом случае ответ на ваш вопрос еще не упомянут в ссылке. Надеюсь, кто-то добавит его в будущем.

0
ответ дан Damiaan Dufaux 15 January 2019 в 18:13
поделиться

Защитное утверждение работает следующим образом: если первый предикат равен false, он not оценивает следующий предикат (ы).

Другими словами, вы можете считать запятую , оператора guard такой же, как оператор &&. Это то, что мы называем ленивой оценкой; Если вы проверили, как && работает , вы заметите, что rhs представляет собой автозаполнение возвращает логическое значение, но не логическое значение, что означает, что оно может даже не оцениваться (в случае lhs параметр равен false).

хотите узнать больше об автозаполнении? проверьте это !

Итак, для вашего случая вы можете объединить все предикаты (которые, я думаю, будут более читабельными ИМО) в одном выражении guard. [1117 ]

0
ответ дан Koen 15 January 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: