赋值中的Javascript和运算符
我知道,在JavaScript中,您可以执行以下操作:赋值中的Javascript和运算符,javascript,variable-assignment,logical-operators,and-operator,Javascript,Variable Assignment,Logical Operators,And Operator,我知道,在JavaScript中,您可以执行以下操作: var oneOrTheOther = someOtherVar || "these are not the droids you are looking for..."; 其中,变量一个或另一个如果不是null、未定义、或false,则将采用第一个表达式的值。在这种情况下,它被分配给第二条语句的值 但是,当我们使用逻辑AND运算符时,变量一个或另一个分配给什么 var oneOrTheOther = someOtherVar &
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
其中,变量一个或另一个
如果不是null
、未定义
、或false
,则将采用第一个表达式的值。在这种情况下,它被分配给第二条语句的值
但是,当我们使用逻辑AND运算符时,变量一个或另一个分配给什么
var oneOrTheOther = someOtherVar && "some string";
当someOtherVar
为非false时会发生什么情况?
当someOtherVar
为false时会发生什么
正在学习JavaScript,我很好奇与and运算符结合使用赋值会发生什么。引用1:
variable = indicator && value
如果第一个操作数为falsy,则&&
运算符将生成其第一个操作数的值。否则,它将生成第二个操作数的值
1 Douglas Crockford:-Page 16基本上,逻辑AND运算符(&&
)将返回第二个操作数的值(如果第一个操作数是真的),如果第一个操作数本身是假的,它将返回第一个操作数的值,例如:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
请注意,falsy值是在布尔上下文中使用时强制为false
的值,它们是null
,未定义的,0
,NaN
,一个空字符串,当然false
,任何其他强制为true&
的值有时称为保护运算符
variable = indicator && value
只有当指示器是真实的时,才可以使用它来设置值。初学者示例
如果您试图访问“user.name”,但发生以下情况:
Uncaught TypeError: Cannot read property 'name' of undefined
不要害怕。现在,您可以在现代浏览器上使用ES6可选链接
const username = user?.name;
见MDN:
下面是一些关于守卫操作符的更深入的解释,这些解释可能有助于理解
在引入可选链接之前,您可以在赋值中使用&&operator或通常称为保护运算符来解决此问题,因为它“保护”未定义错误的发生
下面是一些你可能会觉得奇怪的例子,但请继续阅读,后面会解释
var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined
user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'
user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined
说明:在保护操作中,每个术语从左到右一次进行评估。如果评估值为falsy,则评估将停止,然后分配该值。如果到达最后一个项目,则无论其是否为falsy,都将分配该项目
falsy表示它是这些值中的任意一个undefined、false、0、null、NaN、
和truthy表示不是falsy
奖金:OR操作员
另一个实用的奇怪赋值是或操作符,通常用于以下插件:
this.myWidget = this.myWidget || (function() {
// define widget
})();
只有当“this.myWidget”为falsy时,才会分配代码部分。这很方便,因为您可以在任何地方多次声明代码,而不管以前是否分配了代码,因为使用插件的人可能会多次意外地声明您的脚本标记src,所以知道它只分配一次
解释:每个值从左到右计算,一次一个。如果某个值是真的,它将停止计算并分配该值,否则,将继续进行,如果达到最后一项,则无论该值是否为假,都将分配该值
额外学分:在作业中结合&&和| |
你现在拥有了终极力量,可以做一些非常奇怪的事情,比如在回文中使用它的这个非常奇怪的例子
function palindrome(s,i) {
return (i=i || 0) < 0 || i >= s.length >> 1 || s[i] == s[s.length - 1 - i] && isPalindrome(s,++i);
}
函数回文(s,i){
返回(i=i | | 0)<0 | | i>=s.length>>1 | | s[i]==s[s.length-1-i]&&isPalindrome(s,++i);
}
在此进行深入解释:
快乐编码。根据:
在逻辑OR运算符(| |)的情况下
expr1 | | expr2返回expr1(如果可以转换为true);
否则,返回expr2。因此,当与布尔值一起使用时||
如果任一操作数为true,则返回true;如果两者都为false,则返回
错
在给定的示例中
var oneOrTheOther=someOtherVar | |“这些不是你要找的机器人……往前走”
如果布尔值(someOtherVar)为true,则结果将是someOtherVar的值(请参阅)。如果它是假的,结果将是“这些不是你正在寻找的机器人……继续前进”
在逻辑And运算符(&&)的情况下
如果可以将expr1转换为false,则返回expr1;否则,返回
expr2。因此,当与布尔值一起使用时,&&返回true(如果两者都是)
操作数为真;否则,返回false
在给定的示例中
案例1:布尔值(someOtherVar)为false时:返回someOtherVar的值
案例2:当布尔值(someOtherVar)为true时:返回“这些不是您要寻找的机器人……继续前进”我在工作中看到分配语句过度使用了(&D)。问题有两方面:
1) “指示符”检查有时是一个具有开发人员没有考虑的开销的函数。
2)DEVs很容易把它看作是安全检查,而不认为它们是对他们的VAR分配错误。我喜欢他们有一种类型安全的态度,所以我让他们改变这个:
var currentIndex=App.instance&&App.instance.rightSideView.getFocusItemIndex()代码>
为此:
var currentIndex=App.instance&&App.instance.rightSideView.getFocusItemIndex()|| 0代码>
所以他们得到了一个预期的整数。啊,好的。谢谢这是有道理的,因为它毕竟是OR运算符的相反形式;否则,返回false。)我喜欢这个例子。如果您能包含一点关于&&
被称为“guard”运算符的内容,这将是一件非常好的事情,因为这是一个很好的上下文。你甚至可以在这里引用道格拉斯·克罗克福德的话:试试看。请看我的回答