jirengu / frontend-interview

前端笔试面试题题库
1.29k stars 139 forks source link

JS 运算符优先级相关题目 #8

Open jirengu opened 7 years ago

jirengu commented 7 years ago

如下代码输出什么? 解释原因

var object1 = {
    valueOf: function () {
        return 1;
    },
    toString: function () {
        return "object1";
    }
};

var object2 = {
    valueOf: function () {
        return 2;
    },
    toString: function () {
        return "object2";
    }
};

alert((object2 > object1 +-- object1) + true); //输出什么? 解释原因
stuodte commented 7 years ago

(object2 > object1 +-- object1) + true)

object1和object2 都是对象,所以运算的时候会调用valueOf方法,所以得到: (2 > 1 + --1) + true)

--1为前递减所以为0,2 > 1为true 得到: (true + 0) + true)

布尔值在运算时会自动转为数字 true -> 1 false -> 0 得到: (1+ 0) + 1)

所以结果是2

Jemair commented 7 years ago

(object2 > object1 +-- object1) + true); 先算大于号 obj2 > obj1 == 2 > 1 == true; => true + -- obj1 == true + --1 == true + 0 == 1 + 0 == 1; => 1 + true == 1 + 1 == 2 故输出2

WangXiaoyugg commented 7 years ago

参考MDN的运算符优先级 () 19级 -- 15级 + 13级 >11 级 (object2 > object1 +-- object1) + true) object1和object2 都是对象,所以运算的时候会调用valueOf方法,所以得到: (2 > 1 + --1) + true) => ((2>1 + 0)+true) => ((2>1)+true) >=(true+true) >=(1+1) >=2

hungeroxc commented 7 years ago

结果输出是2;


原因: 1.对对象进行的计算会先调用对象的valueOf方法,无结果再调用toString方法,这里的两个对象都有valueOf方法,所以调用成功,所以式子(object2 > object1 +-- object1),转化为 (2 > 1 + --1) + true

2.在2 > 1 + --1中,自减符号优先级高,先计算--1,得出结果0,2 > 1结果为true,最后式子变成 (true + 0) + true

3.因为加法运算符,true转化为1,所以结果为2