Давайте сравним 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 }
Нет нет необходимости разбивать утверждения.
Вы можете легко проверить это, выполнив следующий код:
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
.
Обычно вы должны иметь возможность искать подобные вещи в справочнике по языку . Но в этом случае ответ на ваш вопрос еще не упомянут в ссылке. Надеюсь, кто-то добавит его в будущем.
Защитное утверждение работает следующим образом: если первый предикат равен false
, он not
оценивает следующий предикат (ы).
Другими словами, вы можете считать запятую ,
оператора guard такой же, как оператор &&
. Это то, что мы называем ленивой оценкой; Если вы проверили, как &&
работает , вы заметите, что rhs
представляет собой автозаполнение возвращает логическое значение, но не логическое значение, что означает, что оно может даже не оцениваться (в случае lhs
параметр равен false
).
хотите узнать больше об автозаполнении? проверьте это !
Итак, для вашего случая вы можете объединить все предикаты (которые, я думаю, будут более читабельными ИМО) в одном выражении guard
. [1117 ]