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


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 相关文章推荐
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 Javascript
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
Sep 06 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
Oct 20 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
基于jquery实现动态竖向柱状条特效
Feb 12 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
利用JS做网页特效_大图轮播(实例讲解)
Aug 09 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
vue cli3.0 引入eslint 结合vscode使用
May 27 Javascript
谈一谈vue请求数据放在created好还是mounted里好
Jul 27 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
使用webpack打包koa2 框架app
2018/02/02 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python实现聊天机器人的示例代码
2018/07/09 Python
Django实战之用户认证(初始配置)
2018/07/16 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python实现感知机模型的示例
2020/09/30 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
计算机科学系职业生涯规划书
2014/03/08 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
投标授权委托书范文
2014/08/02 职场文书
健康状况证明书
2014/11/26 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang