Javascript运算符优先级和结合性

先放上mdn上关于运算符优先级关联性的汇总表

下面的表将所有运算符按照优先级的不同从高到低排列。

image

有一道题(摘自你不知道的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

考察对this、原型链、函数对象、函数声明提前等一系列知识。

原文链接:yinzhuo.online

你可能感兴趣的:(Javascript运算符优先级和结合性)