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、原型链、函数对象、函数声明提前等一系列知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值