什么是&&;javascript表达式中的返回
我在某个应用程序中阅读javascipt代码,代码如下什么是&&;javascript表达式中的返回,javascript,Javascript,我在某个应用程序中阅读javascipt代码,代码如下 getTotalFees:function(){ return this.grid &&this.grid.getStore().sum('fees'); } 现在我不知道它会返回什么 在我看来是 返回a&b 它不会返回true或false而不是b吗 逻辑AND(&&): expr1&&expr2如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&
getTotalFees:function(){
return this.grid
&&this.grid.getStore().sum('fees');
}
现在我不知道它会返回什么
在我看来是
返回a&b
它不会返回true或false而不是b吗
逻辑AND(&&
):expr1&&expr2
如果可以转换为false,则返回expr1
;否则,返回expr2
。因此,当与布尔值一起使用时,&
如果两个操作数都是true
,则返回true
;否则,返回false
因此,基本上:如果第一个参数是
falsy
,则返回该参数。否则,它会返回第二个参数
在您的例子中,这意味着,如果
this.grid
存在,它将返回this.grid.getStore().sum('fees')代码>您误解了&
的作用。让a
和b
成为“实体”。然后a&&b
执行以下操作:
评估a
如果a
为falsy返回a
如果a
是真实的,则评估b
返回b
例如:
var f = function() {
console.log("test");
return 'foo';
}
> 0 && f()
0
> 1 && f()
test
"foo"
注意,在第一种情况下,我们没有得到console.log
,因为f()
没有计算,因为0
是错误的。这个属性很重要,而且实际上很重要
a && b != b && a
尽管从数学上来说应该是一样的(但这不是由于评估的副作用)
Falsy值包括:0
,false
,”
(空字符串),null
,未定义的
,NaN
(非数字类型)。我认为没有任何其他可能的价值观(如果我错了,有人会纠正我)。其他任何事物都是真实的
因此,在您的情况下,代码可以重写为:
if (this.grid) {
return this.grid.getStore().sum('fees');
} else {
return this.grid;
}
好的,让我们假设this.grid.getStore().sum('fees')
返回一些东西,让我们说“Ok!”
现在,代码中的return语句是一种复杂的表达方式:
if(this.grid)//this.grid is defined and doesn't evaluate as 'false'
return this.grid.getStore().sum('fees');
else
return this.grid;
如果没有网格,我们将返回undefined,否则我们将调用gridStore…
并返回它自己的返回。
这是避免“未定义没有方法‘gridStore’”的常见方法
非常重要的一点是,在a&&f()
中,如果“a”的计算结果为false,则不会调用f()。有许多东西的计算结果为false,例如任何未定义的变量、null
、空字符串。。。(请注意,包含虚假内容的字符串,如“false”
或“0000”
实际上是真实的)。甚至像function(){returnnull;}()这样的不可读的语言代码>的计算结果可能为false。这样做是为了防止在未定义的属性上调用方法,否则会导致错误。因此,如果this.grid
是undefined
,则返回undefined
在表达式中,如果当a
等于false
时a&&b
(或者在javascript中,它可以是类似于Cerburs答案的表达式),则返回a
与| |
操作符类似,从左开始的第一个等于true
(在javascript中不是0,不是未定义的,当然不是null,不是NaN,也不是false)的操作符被返回。如果a
不是未定义的b
不是未定义的,returnb
。该代码在功能上等同于if(this.grid){return this.grid.getStore().sum('fees');}
3。如果a
的定义不真实,或者如果它不是未定义的@algorhytim“&&2===”
,而显然“
是定义的。”“是假的,0和“假”也是假的@algorhytim是的,这正是我写的。空字符串是falsy。@Boris是的,但它不是未定义的
,我评论说“…,如果它不是未定义的更好”如果网格不存在,它将返回False
或this.grid
,它是未定义的
,然后它将返回this.grid
,它是未定义的
,它甚至不会尝试调用this.grid.getStore().sum('fees')代码>,从而避免了错误。实际上,这不是相同的代码。if
语句应该是if(this.grid)
。否则它会做不同的事情(如果this.grid
是0
?),是的,你是对的,或者如果(!!this.grid)
。但我认为这会更容易理解。我来编辑