«если» сокращение с двойным амперсандом - PullRequest
1 голос
/ 09 апреля 2019

Я видел эти строки кода.

this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
  ...
})

Это сокращение для

if(this.tween){
  this.tween.kill();
}
this.tween = TweenMax.to(object, 1, {
  ...
})

спасибо;)

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Да, оба варианта эквивалентны.

function test(value) {
  console.log(value);
  
  value && console.log("\texecyted using AND");
  if (value) console.log("\texecuted using if");
}

test(true);
test(false);
test("string");
test(""); //empty string
test(0);
test(null);
test(undefined);
test(1);
test({});

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

function f (condition) {
  condition && one(),
  two();
}

function one() {
  console.log("one");
}

function two() {
  console.log("two")
}

f(false);
f(true);

Это действительно эффективно

function f(condition) {
  if (condition) {
    one();
 }

  two();
}

Итак, one() будет выполняться несколько раз, тогда как two будетвсегда быть выполненным.Однако, не зная правил приоритета, может показаться, что и one() и two() будут выполнены условно.Это простая ошибка, и даже проще, если это сложные условия и логика

person.account.moneyAmount > 0 && creditor.getDebt(person).moneyOwed > 0 && person.account.moneyAmount > creditor.getDebt(person).moneyOwed  && (deductTaxes(payAndReturnAmount(person, creditor)), printStatement()), printHello()

Это немного преувеличено, но вполне возможно оказаться в подобной ситуации.Если ваш код прост как одно условие и одно действие, тогда вы экономите 2 байт от использования встроенного условия по сравнению с оператором if

condition && action()
if (condition) action()
                     ^^
"extra" characters __||
0 голосов
/ 09 апреля 2019

Да, это короткая рука для вышеприведенного кода. Здесь, если this.tween не определен, код после "&&" не будет выполнен. После этого будет выполнен код, следующий за ",". Вот несколько примеров:

this.a= undefined;
this.b= 20;
this.a && this.b.toString(),   // if a is true then b will be executed and converted to string
  console.log(this.b); // if a is true the output will be a string but in this case, a is undefined and the string conversion didn't happen, the console returns an integer

this.a = 10;
this.b=20
this.a && this.b.toString(),
  console.log(this.b); // this will return a string
  
if(this.a){ // if a is true be will be converted to string
this.b = parseInt(this.b);
}
this.a = this.b;  
console.log(this.a) // if a is true be will be converted back to integet and assigend to a

если a не определено

// a is undefined then
this.a = undefined;
this.b=20
this.a && this.b.toString(),
  console.log(this.b); // this will return a integer
  
if(this.a){ // since a is undefined it will fail and conversion won't take place
this.b.toString();
}
this.a = this.b;  
console.log(this.a) // a integer is returned 
0 голосов
/ 09 апреля 2019

Не совсем.

this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
  ...
})

, если this.tween является истинным значением в этом утверждении, оно оценивается и остается там.Так и получается, как этот код.

this.tween,
this.tween = TweenMax.to(object, 1, {
  ...
})
...