在看jquery源码,仔细看入口函数的时候,有点懵了。看到与或、多重三目,傻傻的分不清,就代码仔细的区分下运算符优先级,以前都是呼呼的飘过。看来任何一个细节都不能忽略,不然效率极低。。
!function(a, b) { "object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) { if (!a.document) throw new Error("jQuery requires a window with a document"); return b(a) } : b(a) }("undefined" != typeof window ? window : this, function(a, b) { //代码 n = function(a, b) { return new n.fn.init(a,b) }; A = n.fn.init = function(a,b){ //代码}; A.prototypt = n.fn; return n })();
由于优先级 == 高于 && 、|| 高于 ?: 高于 =, 所以里面的函数体 相当于
`(` object" == typeof module && "object" == typeof module.exports `)` `?` module.exports = `(` a.document ? b(a, !0) : function(a) {if (!a.document) throw new Error("jQuery requires a window with a document"); return b(a)} `)` `:` b(a)
赋值是从右到左赋值。
场景一
function foo() { var a = b = 0;}//会产生全局变量
首先,是赋值表达式b = 0,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。
场景二
看到代码在判断的时候经常看到如下形式:
if('string' == a)
为什么string放在左边而不是放在右边呢?看到 赋值的循序菜知道string位于左值的优势,如果变量a不存在,就不用接下来的判断了,这是良好的编程习惯呀。
逗号表达式 ==>从左到右的顺序被执行,并获得右边表达式的值
example:
a =(7,9,0); // a=0
&& 优先级高于 || , 所以碰到与或运算最好是写上括号(ps:/developer.mozilla.org上写着||高于&&,本人试过了,这个是错的)
var a = true, b = false, c = false; console.log( a || b && c ) // true console.log( (a || b) && c ) // false console.log( a || (b && c) ) // true
下面是一个关于new () . 优先的题,不看下面的表格后面两题简直是做不出来
function Foo() { getName = function () { console (1); }; return this; } Foo.getName = function () { console (2);}; Foo.prototype.getName = function () { console (3);}; var getName = function () { console (4);}; function getName() { console (5);} //请写出以下输出结果: Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName();
/
2
*4
- 1
1
2
3
3
*/
js运算符 参考来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
具体的js运算符如下:
优先级 | 运算类型 | 关联性 | 运算符 |
---|---|---|---|
19 | 圆括号 |
n/a | ( … ) |
18 | 成员访问 |
从左到右 | … . … |
需计算的成员访问 |
从左到右 | … [ … ] |
|
new (带参数列表) |
n/a | new … ( … ) |
|
17 | 函数调用 | 从左到右 | … ( … ) |
new (无参数列表) | 从右到左 | new … |
|
16 | 后置递增(运算符在后) | n/a | … ++ |
后置递减(运算符在后) | n/a | … -- |
|
15 | 逻辑非 | 从右到左 | ! … |
按位非 | 从右到左 | ~ … |
|
一元加法 | 从右到左 | + … |
|
一元减法 | 从右到左 | - … |
|
前置递增 | 从右到左 | ++ … |
|
前置递减 | 从右到左 | -- … |
|
typeof | 从右到左 | typeof … |
|
void | 从右到左 | void … |
|
delete | 从右到左 | delete … |
|
14 | 乘法 | 从左到右 | … * … |
除法 | 从左到右 | … / … |
|
取模 | 从左到右 | … % … |
|
13 | 加法 | 从左到右 | … + … |
减法 | 从左到右 | … - … |
|
12 | 按位左移 | 从左到右 | … << … |
按位右移 | 从左到右 | … >> … |
|
无符号右移 | 从左到右 | … >>> … |
|
11 | 小于 | 从左到右 | … < … |
小于等于 | 从左到右 | … <= … |
|
大于 | 从左到右 | … > … |
|
大于等于 | 从左到右 | … >= … |
|
in | 从左到右 | … in … |
|
instanceof | 从左到右 | … instanceof … |
|
10 | 等号 | 从左到右 | … == … |
非等号 | 从左到右 | … != … |
|
全等号 | 从左到右 | … === … |
|
非全等号 | 从左到右 | … !== … |
|
9 | 按位与 | 从左到右 | … & … |
8 | 按位异或 | 从左到右 | … ^ … |
7 | 按位或 | 从左到右 | … | … |
6 | 逻辑与 | 从左到右 | … && … |
5 | 逻辑或 | 从左到右 | … || … |
4 | 条件运算符 | 从右到左 | … ? … : … |
3 | 赋值 | 从右到左 | … = … |
… += … |
|||
… -= … |
|||
… *= … |
|||
… /= … |
|||
… %= … |
|||
… <<= … |
|||
… >>= … |
|||
… >>>= … |
|||
… &= … |
|||
… ^= … |
|||
… |= … |
|||
2 | yield | 从右到左 | yield … |
yield* | 从右到左 | yield* … | |
1 | Spread | n/a | ... … |
0 | 逗号 | 从左到右 | … , … |
来源:https://www.cnblogs.com/lyre/p/5475169.html