赋值中的 Javascript AND 运算符

IT技术 javascript variable-assignment logical-operators and-operator
2021-02-01 17:56:04

我知道在 JavaScript 中你可以这样做:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

其中变量oneOrTheOther将在第一表达式的值,如果它不是nullundefinedfalse在这种情况下,它被分配给第二个语句的值。

但是,oneOrTheOther当我们使用逻辑 AND 运算符时,变量被分配给什么?

var oneOrTheOther = someOtherVar && "some string";

someOtherVar非假时会发生什么
someOtherVar为假时会发生什么

刚刚学习 JavaScript,我很好奇与 AND 运算符结合使用赋值会发生什么。

6个回答

基本上,逻辑与运算符 ( &&) 将在第一个操作数为时返回第二个操作数的值,如果它本身为则返回第一个操作数的值,例如:

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

请注意,falsy值是false在布尔上下文中使用时强制为的那些值,它们是null, undefined, 0, NaN,一个空字符串,当然false,其他任何东西都可以强制为true

喔好吧。谢谢。这是有道理的,毕竟它是 OR 运算符的反向操作。
2021-03-18 17:56:04
我喜欢这个例子。如果您包含一些关于&&被称为“守卫”运算符的内容,这对空检查有好处,因为这是一个很好的上下文,那就太好了。你甚至可以在这里引用道格拉斯·克罗克福德:javascript.crockford.com/survey.html
2021-03-21 17:56:04
因此,当与布尔值一起使用时,如果两个操作数都为真,&& 返回真;否则,返回 false。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-30 17:56:04

&&有时称为警卫操作员。

variable = indicator && value

仅当指标为真时才可用于设置值。

很明确的回答。其他答案让我相当困惑,但这是一种非常明确的表达方式。谢谢!
2021-03-18 17:56:04
我认为这个答案显然是错误的。执行上述语句后,'variable' 的值就是表达式“indicator && value”的值,无论它是什么。因此,赋值左侧的变量值始终设置为某个值。不管右侧发生了什么(除非抛出错误)。不?
2021-04-05 17:56:04

初学者示例

如果您尝试访问“user.name”,但会发生这种情况:

Uncaught TypeError: Cannot read property 'name' of undefined 

不要怕。您现在可以在现代浏览器上使用 ES6 可选链。

const username = user?.name;

见 MDN:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

这里有一些关于守卫运算符的更深入的解释,可能有助于理解。

在引入可选链之前,您可以在赋值中使用&& 运算符来解决这个问题,或者通常称为保护运算符,因为它可以“防止”发生未定义的错误。

以下是一些您可能会觉得奇怪的例子,但请继续阅读,稍后会解释。

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意味着它是这些值中的任何一个,undefined, false, 0, null, NaN, ''truthy只是意味着 NOT falsy。

奖励:OR 运算符

在实际使用中另一个有用的奇怪赋值是OR 运算符,它通常用于像这样的插件:

this.myWidget = this.myWidget || (function() {
   // define widget
})();

如果“this.myWidget”为假,它只会分配代码部分。这很方便,因为您可以在任何地方多次声明代码,而不用关心它之前是否被分配过,知道它只会被分配一次,因为使用插件的人可能会不小心多次声明您的脚本标签 src。

说明:每个值都是从左到右计算的,一次一个如果值为真,则停止评估并分配该值,否则继续进行,如果达到最后一项,则无论是否为假,都会对其进行分配。

额外学分:结合 && 和 || 在一项任务中

你现在拥有终极力量,可以做一些非常奇怪的事情,比如在回文中使用它的这个非常奇怪的例子。

function palindrome(s,i) {
 return (i=i || 0) < 0 || i >= s.length >> 1 || s[i] == s[s.length - 1 - i] && isPalindrome(s,++i);
}

这里有深入的解释:回文检查 Javascript

快乐编码。

谢谢,很棒的例子!帮助我理解&&和|| 运营商!+1
2021-04-02 17:56:04
谢谢你的回答!我很好奇 JS 会持续尝试访问最深级别的属性多久?例如,如果您正在等待响应到达后端,那么使用它安全var x = y && y.z 吗?
2021-04-05 17:56:04

引用道格拉斯·克罗克福德1

&&操作者产生其第一个操作数的值,如果所述第一操作数是falsy。否则它产生第二个操作数的值。


1 Douglas Crockford:JavaScript:好的部分- 第 16 页

Crockford 在这里也称其为“守卫操作员”:javascript.crockford.com/survey.html
2021-03-14 17:56:04

根据Annotated ECMAScript 5.1 section 11.11

在逻辑 OR 运算符 (||) 的情况下,

expr1 || expr2 如果可以转换为 true,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时, || 如果任一操作数为真,则返回真;如果两者都为假,则返回假。

在给定的例子中,

var oneOrTheOther = someOtherVar || “这些不是你要找的机器人……继续前进”;

结果将是 someOtherVar 的值,如果 Boolean(someOtherVar) 为 true。(请参阅表达式的真实性)。如果它是假的,结果将是“这些不是你正在寻找的机器人......继续前进”;

并且在逻辑与运算符(&&)的情况下,

如果可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,&& 返回真;否则,返回 false。

在给定的例子中,

情况 1:当 Boolean(someOtherVar) 为 false 时:它返回 someOtherVar 的值。

情况 2:当 Boolean(someOtherVar) 为真时:它返回“这些不是你正在寻找的机器人......继续前进”。