先放上mdn上关于运算符优先级关联性的汇总表
下面的表将所有运算符按照优先级的不同从高到低排列。
有一道题(摘自你不知道的JS(中卷))
var a =42;
var b = "foo";
var c = false;
var d = a && b || c ? c || b ? a : c && b : a;
d; //42
通过查询表格,我们可以把上面代码分解:
var d = ((a && b) || c ) ? (( c || b ) ? a :(c && b)) : a
| 6 | [逻辑与] | 从左到右 | … && …
|
| 5 | [逻辑或] | 从左到右 | … || …
|
| 4 | [条件运算符] | 从右到左 | … ? … : …
|
逐一执行
(a && b) 结果为:''foo"
"foo" || c 结果为 :"foo"
第一个?中,"foo"为真值
(c || b)结果为:"foo"
第二个?中,"foo"为真值
a的值为42
最后结果为42
还有一道题(摘自segmentfault)
function Foo() {
getName = function () {
alert(1);
};
return this;
}
Foo.getName = function () {
alert(2);
};
Foo.prototype.getName = function () {
alert(3);
};
var getName = function () {
alert(4);
};
function getName() {
alert(5);
}
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName(); //3
执行Foo.getName()这个函数,输出2
先执行function getName(),在执行var getName = function,输出4,进行了一次覆盖
执行Foo()里的getName(),因为没有用var定义,所以该函数是定义在全局的,this也指向windows,此时覆盖掉以前的4,输出1
执行全局的getName, 输出1
new (Foo.getName)() .操作符优先级高于new(不带参数)优先级,输出2
(new Foo()).getName(); 如果是new (Foo().getName)(),那么在执行Foo()时,它是一个函数调用,优先级低于带参数的new,因此这样不行。那么只能是(new Foo()).getName(),输出3
new((new Foo()).getName)(),输出3