Javascript AND运算符在赋值中
我知道在JavaScript中你可以这样做:
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
其中变量oneOrTheOther
将采取第一个表达式的值,如果它不是null
, undefined
或false
。 在这种情况下,它被分配到第二个语句的值。
但是,当我们使用逻辑AND运算符时,变量oneOrTheOther
被分配了什么?
var oneOrTheOther = someOtherVar && "some string";
当其他someOtherVar
是非假时会发生什么?
当其他someOtherVar
错误时会发生什么?
刚刚学习JavaScript,我很好奇将与AND运算符一起分配会发生什么。
基本上,逻辑AND运算符( &&
)将返回第二个操作数的值,如果第一个操作数是真的 ,则返回第一个操作数的值,例如:
true && "foo"; // "foo" NaN && "anything"; // NaN 0 && "anything"; // 0
请注意,在布尔上下文中使用的伪造值是强制为false
值,它们是null
, undefined
, 0
, NaN
,一个空字符串,当然是false
,其他任何强制为true
。
引用Douglas Crockford 1 :
如果第一个操作数是虚假的,
&&
操作符就会生成第一个操作数的值。 否则它产生第二个操作数的值。
1道格拉斯·克罗克福德: JavaScript:好的部分 – 第16页
&&
有时被称为警卫操作员。
variable = indicator && value
只有在指标正常的情况下才可以使用。
初学者的例子
如果您尝试访问“user.name”,但是会发生这种情况:
Uncaught TypeError: Cannot read property 'name' of undefined
如果你不希望发生这种情况,你可以在一个任务中使用&&运算符来完成:
// username is not assigned here var user = 'mrsmith'; var username = user && user.username; console.log('username', username);
结果是未定义的。 如果user && user.name为false,则不会尝试访问“user.name”,并将“username”变量保留为undefined。
// username is assigned here var user = 'mrsmith'; var username = user && user.username || user; console.log('username', username);
结果在“mrsmith”用户&& user.name导致错误,所以然后去用户,并导致“mrsmith”
看这个简单的例子以供参考: https : //jsfiddle.net/qv6rg940/3/
实际使用的另一个有用的奇怪的任务是OR操作符,它只是定义了一些你可能在插件或框架中看到的未定义的东西,比如:
this.myWidget = myWidget || (function() { // define widget })();
如果“myWidget”未定义,它将只定义小部件。
你甚至可以坚持这一点,并把它放在实际的算法逻辑如下:
function palindrome(s,i) { return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i); }
Lodash守卫方法
使用lodash的美丽的守卫操作符来访问嵌套数据,如下所示:
var val = _.get(obj, 'some.very.nested.stuff.might.not.be.defined');
因为它处理引擎盖下的&&东西,而且使用方便。
根据注释的ECMAScript 5.1第11.11节 :
在逻辑OR运算符(||)的情况下,
expr1 || expr2如果可以转换为true,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,|| 如果任一操作数为真,则返回true; 如果两者都是错误的,则返回false。
在给定的例子中,
var oneOrTheOther = someOtherVar || “这些不是你正在寻找的机器人…移动”;
如果布尔(someOtherVar)为true,结果将是someOtherVar的值 (请参阅表达式的真值 )。 如果是错误的,结果将是“这些不是你正在寻找的机器人…移动”;
而在逻辑AND运算符(&&)的情况下,
如果可以将其转换为false,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,如果两个操作数都为真,则&&返回真; 否则,返回false。
在给定的例子中,
情况1:当布尔(someOtherVar)为false时:它返回someOtherVar的值。
情况2:当布尔(someOtherVar)是真的:它返回“这些不是你正在寻找的… …移动的机器人”。
我已经看到&&在这里工作过度使用任务报表。 关注点有两方面:1)“指标”检查有时是开发人员没有考虑到的开销。 2)开发者很容易把它看作是一个安全检查,并不认为他们正在为他们的var分配错误。 我喜欢他们有一个类型安全的态度,所以我让他们改变这个:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
对此:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
所以他们得到一个整数如预期。