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的运 ...
随机推荐
- Linux下配置Java环境方法
本文详细介绍Linux系统下配置Java环境的方法,使用JDK1.8版本. 1. 从Oracle官网上下载Java8版本. 下载链接:https://www.oracle.com/technetwor ...
- CSS基本
CSS选择器优先级:从高到低 无条件优先的属性只需要在属性后面使用!important,但是IE6不支持.解决办法,IE6是单个支持的. 例如: 在IE6中需要这样写 .className{color ...
- CF987B High School: Become Human 数学
题意翻译 题目大意 输入一个 xxx ,一个 yyy ,求是 xyx^yxy 大还是 yxy^xyx 大. (1≤x,y≤109)(1≤x,y≤10^9)(1≤x,y≤109) 输入输出格式 输入格式 ...
- Retina显示屏-揭秘移动端的视觉稿通常会设计为传统PC的2倍
一.Retina显示屏简介 retina:一种具备超高像素密度的液晶屏,同样大小的屏幕上显示的像素点由1个变为多个,如在同样带下的屏幕上,苹果设备的retina显示屏中,像素点1个变为4个. reti ...
- 消息中间件的研究(二) RabbitMQ应用场景分析
分析一下六个场景下RabbitMQ的应用: 1.爬虫 2.智能家居云平台 3.电子商务系统 4.实时监控系统 5.海量日志的分布式处理 6. 智能交通管控平台中数据分析子系统 1.爬虫 ...
- java文件操作文件之csv
直接上代码: @Test public void dowrite(){ String filePath = "D://test.csv"; try { File f = new F ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- Luogu P4901 排队 fib数列+树状数组+倍增
这题让我升华..还好只重构了一遍 首先我们发现:$n$较小时,整个队伍的形态 跟 $n$ 比较大时的局部是一样的 所以我们预处理出这个队伍的形态,和每一行每个位置的质因子个数的前缀和,$O(nlogn ...
- 分层图 (可以选择K条路的权为0,求最短路)
分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...
- 027 Remove Element 移除元素
给定一个数组和一个值,在这个数组中原地移除指定值和返回移除后新的数组长度.不要为其他数组分配额外空间,你必须使用 O(1) 的额外内存原地修改这个输入数组.元素的顺序可以改变.超过返回的新的数组长度以 ...