"if" shorthand 带双符号
"if" shorthand with double ampersand
我看过这几行代码。
this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
...
})
shorthand
if(this.tween){
this.tween.kill();
}
this.tween = TweenMax.to(object, 1, {
...
})
谢谢 ;)
不完全是。
this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
...
})
如果 this.tween
是这个语句中的真值,它会被评估并留在那里。所以就变成了这样的代码。
this.tween,
this.tween = TweenMax.to(object, 1, {
...
})
是的,这是上面代码的简写。这里如果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
是的,两者在执行上是等价的
function test(value) {
console.log(value);
value && console.log("\texecute 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()
这只是稍微夸大了一点,但完全有可能出现类似的情况。如果您的代码像单个条件和单个操作一样简单,那么使用内联条件与使用 if
语句
相比,您可以节省 2 字节
condition && action()
if (condition) action()
^^
"extra" characters __||
如果"state"为"true",则右侧值为"test" 的双符号显示在 Console:
let state = true // Here
function test() {
return "test"
}
console.log(state && test()) // test
如果"state"为"false",则左侧值"false" ] 的双符号显示在 Console:
let state = false // Here
function test() {
return "test"
}
console.log(state && test()) // false
我看过这几行代码。
this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
...
})
shorthand
if(this.tween){
this.tween.kill();
}
this.tween = TweenMax.to(object, 1, {
...
})
谢谢 ;)
不完全是。
this.tween && this.tween.kill(),
this.tween = TweenMax.to(object, 1, {
...
})
如果 this.tween
是这个语句中的真值,它会被评估并留在那里。所以就变成了这样的代码。
this.tween,
this.tween = TweenMax.to(object, 1, {
...
})
是的,这是上面代码的简写。这里如果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
是的,两者在执行上是等价的
function test(value) {
console.log(value);
value && console.log("\texecute 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()
这只是稍微夸大了一点,但完全有可能出现类似的情况。如果您的代码像单个条件和单个操作一样简单,那么使用内联条件与使用 if
语句
condition && action()
if (condition) action()
^^
"extra" characters __||
如果"state"为"true",则右侧值为"test" 的双符号显示在 Console:
let state = true // Here
function test() {
return "test"
}
console.log(state && test()) // test
如果"state"为"false",则左侧值"false" ] 的双符号显示在 Console:
let state = false // Here
function test() {
return "test"
}
console.log(state && test()) // false