Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
赋值中的Javascript和运算符_Javascript_Variable Assignment_Logical Operators_And Operator - Fatal编程技术网

赋值中的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 &

我知道,在JavaScript中,您可以执行以下操作:

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”运算符的内容,这将是一件非常好的事情,因为这是一个很好的上下文。你甚至可以在这里引用道格拉斯·克罗克福德的话:试试看。请看我的回答