S运算符&&和|| 及其优先级
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回a
a || b : 将a, b转换为Boolean类型, 再执行逻辑或, true返回a, false返回b
转换规则:
对象为true
非零数字为true
非空字符串为true
其他为false
/**
* 几乎所有语言中||和&&都遵循“短路”原理,
* 如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。
* js也遵循上述原则。
* 当||时,找到为true的分项就停止处理,并返回该分项的值,否则执行完,并返回最后分项的值。
* 当&&时,找到为false的分项就停止处理,并返回该分项的值。
**/
var a = "" || null || 3 || 4;//
alert(a);
var b = 4 && 5 && null && "0";//null
alert(b);
今天看了一段压缩的js代码:
Site.positionManifestoSlides = function() {
Site.manifesto_height = Site.first_manifesto_slide.outerHeight(),
Site.manifestos_height = Site.manifesto_height * Site.manifestos_n,
Site.manifesto_start = Site.manifestos_container.offset().top,
Site.manifesto_end = Site.manifesto_start + Site.manifestos_height,
Site.manifestos_container.height(Site.manifestos_height);
var e = $(window).height(),
t = $(window).scrollTop(),
n = Site.header.outerHeight(),
i = .5 * (e + n - Site.manifesto_height),
o = .5 * (Site.manifesto_height - e + n),
r = t - Site.manifesto_start + i;
if (r >= 0 && r < Site.manifestos_height && $(window).width() > 768) {
var a = Math.floor(r / Site.manifesto_height) + 1,
s = "block";
a >= Site.manifestos_n && (a = Site.manifestos_n - 1, s = "none"),
Site.manifestos.each(function(t) {
var n = $(this);
t > a && n.css({
top: e,
position: "fixed",
"z-index": 10,
display: "block"
}),
a == t && n.css({
top: e - (r - Site.manifesto_height * (a - 1)) + o,
position: "fixed",
"z-index": 100,
display: "block"
}),
a > t && n.css({
top: i,
position: "fixed",
"z-index": 11 + t,
display: s
})
})
} else Site.manifestos.css({
top: 0,
position: "relative",
"z-index": 0,
display: "block"
})
},
直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。
&& (逻辑与)
这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:
1 |
var a = 1 && 2 && 3;//3 |
2 |
var b = 0 && 1 && 2;//0 |
3 |
var c = 1 && 0 && 2;//0 |
4 |
alert(a),alert(b),alert(c); |
嘿嘿,写法很奇怪,运行的结果是3,0,0。一般我们在if语句中经常用到。“&&” (逻辑与) 运算和“||”运算真好相反,“&&” 运算遇到false就返回。
例如: a && b ,如果 a 为true,直接返回b,而不管b为true或者false 。如果 a 为false
那么直接返回a,上面例子中第一个var a = 1 && 2 && 3;因为1 &&
2,1为真,返回2;2&&3, 2为真,返回3 。
||(逻辑或)
再来看看“||”(逻辑或)运算,看例子:
1 |
var a = 0 || 1 || 2;//1 |
2 |
var b = 1 || 0 || 3;//1 |
3 |
alert(a),alert(b); |
“||”运算遇到true就返回。例如:a || b ,如果 a 为false,直接返回b,而不管b为true或者false ,如果为a || b ||c a为false, b为true则 返回b , 如果b为false, 直接返回c,而不管c为true或者false 。如果 a 为true,直接返回a,而不会继续往下执行。
&& (逻辑与) 和||(逻辑或)混合使用的时候要注意他们的优先级:
&& (逻辑与) 优先级高于||(逻辑或)
return a && b || c ,
根据a来判断返回值,a 是 false 则肯定返回 c;如果 b , c 都是 true ,那么我们就可以根据 a 来决定b 还是 c ,如果 a 是 false 则返回 c,如果a是true 则返回 b。
return a || b && c
根据优先级相当于先算 b && c ,然后和a 相 或;如果a是true,则返回a,不论是b或c,如果a是false,则如果b是false,返回b,如果b是true,返回c;
1 |
var //2 |
3 |
var // 3 |
5 |
var // 3 |
6 |
alert(a),alert(b),alert(c); |
另附:JS运算符优先级(从高到低列出)
| 运算符 | 描述 |
| . [] () | 字段访问、数组下标、函数调用以及表达式分组 |
| ++ -- - ~ ! delete new typeof void | 一元运算符、返回数据类型、对象创建、未定义值 |
| * / % | 乘法、除法、取模 |
| + - + | 加法、减法、字符串连接 |
| << >> >>> | 移位 |
| < <= > >= instanceof | 小于、小于等于、大于、大于等于、instanceof |
| == != === !== | 等于、不等于、严格相等、非严格相等 |
| & | 按位与 |
| ^ | 按位异或 |
| | | 按位或 |
| && | 逻辑与 |
| || | 逻辑或 |
| ?: | 条件 |
| = oP= | 赋值、运算赋值 |
| , | 多重求值 |
S运算符&&和|| 及其优先级的更多相关文章
- Mysql 中Left/Right join on后面and和where条件查询的差异-Mysql SQL运算符是有优先级
一.Mysql中Left/Right join on后面and和where条件查询的差异 1.建两张测试表,一张商户定义表.一张商户操作状态明细表 1)商户定义表 CREATE TABLE hope. ...
- input、raw_input区别,运算符,运算优先级,多变赋值方式
目录 1. Python2中的input.raw_input赋值方式和Python3中的input赋值方式的差别 2. 运算符 3. python运算符优先级 4. 格式化输出 5. 链式赋值 6. ...
- 运算符 Operator 及优先级
算数运算符 + - * / ** % /表示自然除,结果是浮点数.//为整除.python2.x版本/和//都是整除. 位运算符 & | ~ ^ << >> <& ...
- [转] JS运算符 &&和|| 及其优先级
第一.&& (逻辑与)运算,看一个简单的例子: var a = 1 && 2 && 3; var b = 0 && 1 &&am ...
- C语言运算符表(优先级)
http://www.is.pku.edu.cn/~qzy/c/operator.htm
- C语言运算符和优先级
关于C语言运算符和优先级,经整理众多博客资料汇入自己的实战,如下: a.算术运算 C语言一共有34种运算符,包括常见的加减乘除运算. 1) 加法:+ 还可以表 ...
- js 运算符优先级
在看jquery源码,仔细看入口函数的时候,有点懵了.看到与或.多重三目,傻傻的分不清,就代码仔细的区分下运算符优先级,以前都是呼呼的飘过.看来任何一个细节都不能忽略,不然效率极低.. !functi ...
- swift:高级运算符(位运算符、溢出运算符、优先级和结合性、运算符重载函数)
swift:高级运算符 http://www.cocoachina.com/ios/20140612/8794.html 除了基本操作符中所讲的运算符,Swift还有许多复杂的高级运算符,包括了C语和 ...
- python运算符的优先级
运算符优先级 如果你有一个如2 + 3 * 4那样的表达式,是先做加法呢,还是先做乘法?我们的中学数学告诉我们应当先做乘法——这意味着乘法运算符的优先级高于加法运算符. 下面这个表给出Python的运 ...
随机推荐
- 分层图最短路【bzoj2662】[BeiJing wc2012]冻结
分层图最短路[bzoj2662][BeiJing wc2012]冻结 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" ...
- AtCoder Beginner Contest 121 题解
题目链接:https://atcoder.jp/contests/abc121 A White Cells 分析:题目数据规模很小,直接暴力修改都可以.或者可以推出公式. 代码: #include & ...
- Helvetic Coding Contest 2016 online mirror D1
Description "The zombies are lurking outside. Waiting. Moaning. And when they come..." &qu ...
- Excel去除空行
本文转载至:https://baijiahao.baidu.com/s?id=1590204478648348952&wfr=spider&for=pc,需要详细信息可链接查看 方法一 ...
- CMD当前代码页修改
python3.x在程序开发中统一的编码是 UTF-8,但是进行交互式编程的时候会经常遇到乱码问题,这是因为Window cmd的默认编码是GBK.与程序采用的 UTF-8 不一致造成的中文及特殊字符 ...
- PHP根据经纬度计算距离
思路: 公式: W为纬度对应的弧度,J为经度对应的弧度,如上图所示 下面代码 lat是纬度 lng是经度 /** * 根据经纬度算距离,返回结果单位是公里,先纬度,后经度 * @param $la ...
- java编程如何实现多条2017-01-16 22:28:11.0这样的时间数据,转换成Date类型Mon Jan 16 22:28:11 CST 2017这样的时间数据
不多说,直接上干货! package zhouls.bigdata.DataFeatureSelection.sim; import java.text.ParseException; import ...
- RS485相关学习
TIA-485-A (Revision of EIA-485) Standard ANSI/TIA/EIA-485-A-1998Approved: March 3, 1998Reaffirmed: M ...
- linq 读取xml
xml 文件如下: <?xml version="1.0" encoding="utf-8" ?><nodes> <node> ...
- KBEngine warring项目源码阅读(一) 项目简介和注册
首先介绍下warring项目,是kbe自带的一个演示示例,大部分人了解kbe引擎也是从warring项目开始的. 项目地址:https://github.com/kbengine/kbengine_u ...