运算符&&的三个不同层次


Posted in Javascript onApril 07, 2013

运算符可以从三个不同的层次进行理解。

第一层理解

当操作数都是布尔值时,“&&”对两个值执行布尔与(AND)操作。

x==0 && y==0 // 只有当x和y都是0时,才返回true

关系运算符的优先级比”&&”要高。

第二层理解

”&&“可以对真值和假值进行布尔与(AND)操作。(假值有false、null、undefined、0、NaN和”“)。在JS中任何希望使用布尔值的地方,表达式和语句都会将其当做真值或假值来对待,因此实际上”&&”并不总是返回true和false。

null && true // =>null: 左操作数为假值,并将其返回,整个表达式为假
true && (5 - 3) // =>2: 左操作数为真,计算右操作数,并将其结果返回

第三层理解

当运算符要返回一个真值或假值时,根据左操作数的值会遇到两种运算情况:运算符首先计算左操作数的值,如果计算结果是假值,那么整个表达式的结果一定也是假值,此时”&&“简单的返回左操作数的值,而并不会对右操作数进行计算。如果左操作数是真值,”&&“将计算右操作数的值并将其返回作为整个表达式的计算结果。

var o = {x:1};
var p = null;
o && o.x; // =>1 o是真值,返回o.x的值
p && p.y; // =>null: p是假值,将其返回,而不去计算p.y

”&&“的行为有时称作”短路“,我们将会看到很多代码利用了这一特性进行有条件地执行代码。例如下面两行代码是完全等价的:

if(a == b) stop();
(a == b) && stop();// 与上面语句等价

知识延伸

运算符“||”和”&&”一样也具有一些复杂的行为。

用来从一组备选表达式中选出第一个真值表达式:

// 先检查a是否是真值,如果是,返回a,否则和a处理方式相同地处理b
// 如果b是真值返回b,否则返回5
var max = a || b || 5;

这种用法在函数中可以用来给参数提供默认值:

function copy(o, p) {
p = p || {}; // 如果没有向参数p传递对象,就使用新创建的对象
// ...
}

运算符优先级

同一优先级的运算符,运算次序由结合方向所决定。

简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

 

Javascript 相关文章推荐
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
精通Javascript系列之数据类型 字符串
Jun 08 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
取得元素的左和上偏移量的方法
Sep 17 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
jQuery常用的一些技巧汇总
Mar 26 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
jQuery判断是否存在滚动条的简单方法
Sep 17 Javascript
详解vuejs几种不同组件(页面)间传值的方式
Jun 01 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
继承行为在 ES5 与 ES6 中的区别详解
Dec 24 Javascript
jquery实现excel导出的方法
Apr 04 #Javascript
关于jquery input textare 事件绑定及用法学习
Apr 03 #Javascript
Jquery实现弹出层分享微博插件具备动画效果
Apr 03 #Javascript
让低版本浏览器支持input的placeholder属性(js方法)
Apr 03 #Javascript
用Jquery重写windows.alert方法实现思路
Apr 03 #Javascript
如何使用jquery动态加载js,css文件实现代码
Apr 03 #Javascript
关于js注册事件的常用方法
Apr 03 #Javascript
You might like
php 判断字符串中是否包含html标签
2014/02/17 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
javascript生成大小写字母
2015/07/03 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python ftp上传文件
2016/02/13 Python
python中logging包的使用总结
2018/02/28 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
护士自荐信怎么写
2013/10/18 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
交通处罚决定书
2015/06/24 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
高中地理教学反思
2016/02/19 职场文书
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸