JavaScript中的逻辑运算的返回值(逻辑与&&,逻辑或||,逻辑非!)
2015-09-04 09:30
405 查看
在JavaScript中,逻辑与非或经常用在条件判断语句中:
直观的感觉是逻辑或运算会返回一个布尔值:true和false
但常常也会看到这样的条件赋值写法:
这会让一些初学JS的朋友感到困惑,这难道是把布尔值赋给了变量x?。
本文试图说明一下这种条件赋值语句的写法原理及其后果。
首先,在JS中,是允许用表达式赋值的。在用表达式赋值时,所赋的值并非表达式本身,而是表达式的运算结果。
以上几段代码说明。a+b这个表达式并非是在其赋值变量c被引用时才进行计算,而是在其赋值之前先计算,然后将结果赋值给C。但系统会提前收集这些变量,所以在第三段代码中a未定义,但最后一段代码中,a并非未定义。
明白了这个,文首所提到的条件赋值方法即可理解,无论是逻辑与非或,其做为表达式时,都是遵循表达式的规则的。不同的是,其运算的结果。
逻辑与的运算规则,左右两者同为true时,为true;有一者为false时,为false。
但是其返回值并非是返回布尔类型的true和false,而是返回其运算符左右两旁的一个值。
当有一个false时,返回false一侧的值;
当有两个false时,返回运算符之前(左侧)的值;
当有两个true时,返回运算符之后(右侧)的值。
这样既保证了在条件判断语句中,逻辑与的运算规则,又给了一个返回值。逻辑与运算属于短路运算,在按从左向右的运算顺序运算时,如果一个为假,即停止运算,并返回为假的值。
条件判断语句则是对返回值的再一次布尔类型判断。
下面这段代码可以看出其返回值及其位置关系:
逻辑或的运算规则,一个为true时为true,一个为false时为false。
其返回值与运算符的关系,正好同逻辑与相反。
当有一个true时,返回true一侧的值;
当有两个true时,返回运算符之前(左侧)的值;
当有两个false时,返回运算符之后(右侧)的值。
逻辑非运算因为只有一个值参与运算,所以比较简单。对运算符右侧的值先转为布尔值,再取反。
然后将结果返回,所以其返回值为布尔值。这一点与逻辑与和逻辑非不同。
有时候在需要一个布尔值时,可以用两次逻辑非运算来获取。
以上内容在《JavaScript高级程序设计》一书中(望远镜封面)有更详细的说明。
if( a || b ){ //same code. }
直观的感觉是逻辑或运算会返回一个布尔值:true和false
但常常也会看到这样的条件赋值写法:
var x=a||b;
这会让一些初学JS的朋友感到困惑,这难道是把布尔值赋给了变量x?。
本文试图说明一下这种条件赋值语句的写法原理及其后果。
首先,在JS中,是允许用表达式赋值的。在用表达式赋值时,所赋的值并非表达式本身,而是表达式的运算结果。
var a= 5; var b= 6; var c= a+b; console.log(c);//结果为11
var a= 5; var b= 6; var c= a+b; a= 10; console.log(c);//结果是11,并非16
var b= 6; var c= a+b; console.log(c);//Uncaught ReferenceError: a is not defined<span style="font-family:Arial, Helvetica, sans-serif;">。a未定义。</span>
var b= 6; var c= a+b; var a= 5; console.log(c);//NaN,a虽然定义了,但在引用时,其并未赋值。
以上几段代码说明。a+b这个表达式并非是在其赋值变量c被引用时才进行计算,而是在其赋值之前先计算,然后将结果赋值给C。但系统会提前收集这些变量,所以在第三段代码中a未定义,但最后一段代码中,a并非未定义。
明白了这个,文首所提到的条件赋值方法即可理解,无论是逻辑与非或,其做为表达式时,都是遵循表达式的规则的。不同的是,其运算的结果。
逻辑与的运算规则,左右两者同为true时,为true;有一者为false时,为false。
但是其返回值并非是返回布尔类型的true和false,而是返回其运算符左右两旁的一个值。
当有一个false时,返回false一侧的值;
当有两个false时,返回运算符之前(左侧)的值;
当有两个true时,返回运算符之后(右侧)的值。
这样既保证了在条件判断语句中,逻辑与的运算规则,又给了一个返回值。逻辑与运算属于短路运算,在按从左向右的运算顺序运算时,如果一个为假,即停止运算,并返回为假的值。
条件判断语句则是对返回值的再一次布尔类型判断。
下面这段代码可以看出其返回值及其位置关系:
var a={}; var b=56; //window.abcdefg为一个不存在的对象, console.log(window.abcdefg && null); //undefined console.log(null && window.abcdefg); //null console.log(a && null); //null console.log(window.abcdefg && a); //undefined console.log(a && b); //56 console.log(b && a); //object {}
逻辑或的运算规则,一个为true时为true,一个为false时为false。
其返回值与运算符的关系,正好同逻辑与相反。
当有一个true时,返回true一侧的值;
当有两个true时,返回运算符之前(左侧)的值;
当有两个false时,返回运算符之后(右侧)的值。
逻辑非运算因为只有一个值参与运算,所以比较简单。对运算符右侧的值先转为布尔值,再取反。
然后将结果返回,所以其返回值为布尔值。这一点与逻辑与和逻辑非不同。
有时候在需要一个布尔值时,可以用两次逻辑非运算来获取。
以上内容在《JavaScript高级程序设计》一书中(望远镜封面)有更详细的说明。
相关文章推荐
- Json 基本应用
- 【JavaScript】实现计算日期相差天数
- JSP获取绝对物理地址
- laydate JS日期插件
- 前端路上的各种问题-javascript—6
- 如何在JavaScript捕获鼠标事件
- js base64 加密
- BZOJ 题目1012: [JSOI2008]最大数maxnumber(线段树)
- 自定义的js函数库
- JavaScript核心基础语法
- js获取PC浏览器可见区域尺寸
- JScript基础
- 关于json数据解析
- JS验证正则表达式(大全)
- JSP Learning Notes 4
- JavaScript 动态脚本
- 图解JavaScript
- 网页要展示大量图片时怎样延迟加载图片 lyz.delayLoading.min.js
- js跨域问题
- Json判断是否存在某个属性和遍历各个属性和值