python给js变量赋值_JavaScript OR(||)变量赋值说明

这篇博客解释了JavaScript中的逻辑运算符OR(||)如何用于变量赋值。它展示了当多个变量连接使用OR运算符时,表达式会返回第一个非null、非undefined、非false、非0、非空字符串的值。这种技术常用于设置默认值,并且在JavaScript中不同于其他语言,如PHP,因为JavaScript的OR运算符会返回操作数本身而非布尔值。
摘要由CSDN通过智能技术生成

JavaScript OR(||)变量赋值说明

给出这段JavaScript代码......

var a;

var b = null;

var c = undefined;

var d = 4;

var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

有人可以向我解释一下这种技术的用途(我最好的猜测是在这个问题的标题中!)? 它是如何/为什么它正常工作?

我的理解是变量f将被赋予第一个变量的最近值(从左到右),该变量的值不是null或未定义,但是我没有设法找到关于这种技术的很多参考资料, 已经看到它使用了很多。

此外,这种技术是否特定于JavaScript? 我知道在PHP中做类似的事情会导致f具有真正的布尔值,而不是d本身的值。

12个解决方案

179 votes

有关说明,请参见短路评估。 这是实现这些运营商的常用方式; 它不是JavaScript独有的。

unwind answered 2019-02-13T16:32:17Z

154 votes

如果0变量是假的,则用于指定默认值,在本例中为false。

JavaScript中的布尔运算符可以返回操作数,而不像其他语言那样总是布尔结果。

Logical OR运算符(false)返回其第二个操作数的值,如果第一个操作数是假的,则返回第一个操作数的值。

例如:

"foo" || "bar"; // returns "foo"

false || "bar"; // returns "bar"

假值是那些在布尔上下文中使用时强制转向false的值,它们是0,null,undefined,空字符串,NaN,当然还有false。

CMS answered 2019-02-13T16:33:07Z

109 votes

Javacript对逻辑运算符messages和noNewMessagesText使用短路评估。但是,它与其他语言的不同之处在于它返回停止执行的最后一个值的结果,而不是messages或noNewMessagesText值。

JavaScript中的以下值被认为是假的。

空值

messages(空字符串)

0

未定义

忽略运算符优先级规则并保持简单,以下示例显示哪个值暂停了评估,并作为结果返回。

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"

前5个值高达messages是假的,所以它们都是从左到右进行评估,直到它满足第一个真实值 - noNewMessagesText,这使得整个表达式为真,所以不会评估任何进一步的结果,并且结果返回newMessagesText 的表达。 同样,在这种情况下:

1 && [] && {} && true && "World" && null && 2010 // null

前5个值都是真实的并且得到评估,直到它满足使表达式为假的第一个假值(messages),因此不再评估noNewMessagesText,并且由于表达式而返回newMessagesText。

您给出的示例是使用JavaScript的此属性来执行赋值。 它可以在任何需要在一组值中获得第一个truthy或falsy值的地方使用。 下面的代码将值messages分配给noNewMessagesText,因为它可以更容易地分配默认值,而不是执行if-else检查。

var a = false;

var b = a || "Hello";

您可以将下面的示例称为利用此功能,我相信它会使代码更难阅读。

var messages = 0;

var newMessagesText = "You have " + messages + " messages.";

var noNewMessagesText = "Sorry, you have no new messages.";

alert((messages && newMessagesText) || noNewMessagesText);

在警报内,我们检查messages是否是假的,如果是,则评估并返回noNewMessagesText,否则评估并返回newMessagesText.由于在此示例中它是假的,我们停在noNewMessagesText并警告"Sorry, you have no new messages."。

Anurag answered 2019-02-13T16:34:55Z

42 votes

Javascript变量没有输入,因此f可以分配一个整数值,即使它是通过布尔运算符赋值的。

f被赋予最接近的值,该值不等于false。 所以0,false,null,undefined都被传递:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'

Alsciende answered 2019-02-13T16:35:32Z

30 votes

它没有任何魔力。 像a || b || c || d这样的布尔表达式被懒惰地评估。 Interpeter查找a的值,它是未定义的所以它是假的所以它继续前进,然后它看到b这是null,它仍然给出错误的结果所以它继续前进,然后它看到c - 相同的故事。 最后它看到了d并且说'嗯,它不是空的,所以我有我的结果'并且它将它分配给最终变量。

这个技巧适用于对布尔表达式进行惰性短路评估的所有动态语言。 在静态语言中,它不会编译(类型错误)。 在急于评估布尔表达式的语言中,它将返回逻辑值(在这种情况下为true)。

Marcin answered 2019-02-13T16:36:11Z

9 votes

这个问题已经收到了好几个答案。

总之,这种技术正在利用语言编译的特性。 也就是说,JavaScript将布尔运算符的评估“短路”,并返回与第一个非假变量值或最后一个变量包含的值相关联的值。 请参阅Anurag对那些将评估为false的值的解释。

由于几个原因,使用这种技术并不是一种好的做法 然而。

代码可读性:这是使用布尔运算符,如果不理解此编译的行为,则预期结果将是布尔值。

稳定性:这是使用语言编译方式的特性,这种特性在多种语言中是不一致的,因此,它可能会成为未来变化的目标。

记录的功能:现有的替代方案可满足此需求,并且在更多语言中保持一致。 这将是三元运算符:

()? 值1:值2。

使用三元运算符确实需要更多的输入,但它清楚地区分了被评估的布尔表达式和被分配的值。 此外,它可以链接,因此可以重新创建上面执行的默认分配类型。

var a;

var b = null;

var c = undefined;

var d = 4;

var e = 'five';

var f = ( a ) ? a :

( b ) ? b :

( c ) ? c :

( d ) ? d :

e;

alert(f); // 4

WSimpson answered 2019-02-13T16:37:31Z

5 votes

返回输出第一个真值。

如果都是false则返回最后一个false值。

例:-

null || undefined || false || 0 || 'apple' // Return apple

Arshid KV answered 2019-02-13T16:38:11Z

4 votes

它将新变量(z)设置为值2214911230474912769,如果它是“truthy”(非零,有效对象/数组/函数/无论是什么)或y否则。 在x不存在的情况下,这是提供默认值的相对常见方式。

例如,如果你有一个带有可选回调参数的函数,你可以提供一个不执行任何操作的默认回调:

function doSomething(data, callback) {

callback = callback || function() {};

// do stuff with data

callback(); // callback will always exist

}

Matthew Crumley answered 2019-02-13T16:38:49Z

1 votes

这意味着如果设置了false,则z的值将为x,否则如果设置为y,则其值将设置为z的值。

它是一样的

if(x)

z = x;

else

z = y;

这是可能的,因为JavaScript中的逻辑运算符不返回布尔值,而是返回完成操作所需的最后一个元素的值(在OR语句中它将是第一个非假值,在AND语句中它将是最后一个)。 如果操作失败,则返回false。

Andris answered 2019-02-13T16:39:36Z

1 votes

它叫做短路运营商。

短路评估表示,仅当第一个参数不足以确定表达式的值时,才会执行或计算第二个参数。 当OR(||)函数的第一个参数求值为true时,总值必须为true。

它也可以用来设置函数参数的默认值

function theSameOldFoo(name){

name = name || 'Bar' ;

console.log("My best friend's name is " + name);

}

theSameOldFoo(); // My best friend's name is Bar

theSameOldFoo('Bhaskar'); // My best friend's name is Bhaskar`

Vijay answered 2019-02-13T16:40:22Z

0 votes

它将评估X,如果X不为空,则为空字符串,或0(逻辑假),然后将其分配给z。 如果X为空,即空字符串,或0(逻辑假),则它将y指定给z。

var x = '';

var y = 'bob';

var z = x || y;

alert(z);

输出'bob';

tvanfosson answered 2019-02-13T16:41:03Z

0 votes

根据Bill Higgins的博客文章; Javascript逻辑OR赋值习惯用法(2007年2月),从v1.2开始,这种行为是正确的(至少)

他还建议另一种用途(引用):“跨浏览器差异的轻量级规范化”

// determine upon which element a Javascript event (e) occurred

var target = /*w3c*/ e.target || /*IE*/ e.srcElement;

Alon Brontman answered 2019-02-13T16:41:43Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值