当前位置: 首页 > news >正文

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

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

相关文章:

  • xlc编译mysql_aix|安装Xlc编译器12版本
  • java print 包_java打jar包的几种方式详解
  • java extjs 项目_Java Web项目(Extjs)报错八
  • java技术路线_Java技术路线
  • java 内存模型书籍_那些年读过的书《Java并发编程实战》十、再探究Java内存模型...
  • linux mysql 表名大小写_Linux系统下MySql表名大小写敏感问题
  • java 分支结构_Java分支结构
  • java里的文件显示繁体_关于在JSP页面上同时显示简体和繁体的问题(字符编码)...
  • java main.init_记录:java程序没有main函数只有init函数怎么运行,或者applet小程序怎么运行...
  • java配置一个json文件_Java 使用json 做配置文件
  • java 同时使用多个流_如何在带有lambda表达式的java 8中使用多个流...
  • 用java在JPanel中建一个表格_java常用面板(JPanel、JScrollPane)
  • map在Java集合_Java 集合 -- Map
  • jquery给日期赋值_jQuery 取值、赋值的基本方法整理
  • java 内部类定于_搞懂 JAVA 内部类
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • AHK 中 = 和 == 等比较运算符的用法
  • Docker: 容器互访的三种方式
  • Odoo domain写法及运用
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • text-decoration与color属性
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 实现简单的正则表达式引擎
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​MySQL主从复制一致性检测
  • # C++之functional库用法整理
  • $.ajax()参数及用法
  • (06)金属布线——为半导体注入生命的连接
  • (C语言)二分查找 超详细
  • (Forward) Music Player: From UI Proposal to Code
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (排序详解之 堆排序)
  • (转)nsfocus-绿盟科技笔试题目
  • (转)关于多人操作数据的处理策略
  • (转)项目管理杂谈-我所期望的新人
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)Google Chrome调试JS
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .aanva
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET委托:一个关于C#的睡前故事
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [BZOJ3223]文艺平衡树
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制
  • [LeetCode][LCR190]加密运算——全加器的实现
  • [LeetCode]Spiral Matrix
  • [one_demo_8]十进制转二进制
  • [Phoenix] 七、如何使用自增ID
  • [PostgreSQL的 SPI_接口函数]