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


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 相关文章推荐
javascript操作文本框readOnly
May 15 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
简单实用的反馈表单无刷新提交带验证
Nov 15 Javascript
angularjs实现与服务器交互分享
Jun 24 Javascript
javascript bom是什么及bom和dom的区别
Nov 26 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
Sep 29 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
Jan 20 Javascript
微信小程序网络请求wx.request详解及实例
May 18 Javascript
EasyUI Tree树组件无限循环的解决方法
Sep 27 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
Apr 19 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
Aug 17 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结合安卓客户端实现查询交互实例
2015/05/05 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
浅谈Python中数据解析
2015/05/05 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
深入理解Python中装饰器的用法
2016/06/28 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
通过实例解析python描述符原理作用
2020/01/22 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python中如何写类
2020/06/29 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
经销商培训邀请函
2014/01/21 职场文书
产假请假条
2014/04/10 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
暑假安全保证书
2015/02/28 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
圆明园观后感
2015/06/03 职场文书
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android