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


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 相关文章推荐
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
一览画面点击复选框后获取多个id值的方法
May 30 Javascript
JavaScript字符串对象(string)基本用法示例
Jan 18 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
May 02 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
Jun 28 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
Javascript删除数组里的某个元素
Feb 28 Javascript
详解vue-video-player使用心得(兼容m3u8)
Aug 23 Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 Javascript
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
Javascript学习笔记之数组的遍历和 length 属性
2014/11/23 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
js查找节点的方法小结
2015/01/13 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
微信小程序 跳转方式总结
2017/04/20 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
python海龟绘图实例教程
2014/07/24 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
详解python中的线程与线程池
2019/05/10 Python
python 画条形图(柱状图)实例
2020/04/24 Python
Python 如何在字符串中插入变量
2020/08/01 Python
Python实现敏感词过滤的4种方法
2020/09/12 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
写好自荐信的要点
2013/11/06 职场文书
运动会入场词50字
2014/02/20 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2014年教研工作总结
2014/12/06 职场文书
如何解决php-fpm启动不了问题
2021/11/17 PHP