首页  >  问答  >  正文

javascript - function(){} == true || function(){} != true;function(){}不为true?

1 描述:

今天看到看到红宝书第27页有写到: 任何对象转换为true;那么实验了一下:

好像没错, function(){} 为 true!

2 后来:

呵呵,好像并不是这样,闲的蛋疼的我又来了一波:

3 问题:

那么问题是
function(){} 为什么用双等判断的时候 为false!

PHP中文网PHP中文网2750 天前1168

全部回复(4)我来回复

  • PHP中文网

    PHP中文网2017-04-10 17:54:34

    懂了:

    在if语句中:

    ECMAScript 会自动调用Boolean() 转换函数将这个表达式转换为一个布尔值(强转);
    如果此值的结果为true,则执行语句,如果为false则。。。。
    

    在==操作符中:

    如果有一个操作数为对象,另一个不是,则调用对象的valueOf()方法,得到后进行比较;
    如果2个都为对象,则比较它们是不是同一个对象,如果为同一个对象,则返回true,否则返回false
    

    赞! 感谢指导

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 17:54:34

    值等于是比较值的。
    所以浏览器会先将运算符两边的变量/表达式的值先算出来,并转换成同类型(基本类型)的形式进行比较。
    (function(){})表达式的值通过valueOf()/toString()来计算,
    你可以看一下这两个返回的值是什么,并且看一下返回值可否转换成为true。
    抱歉打脸,今天有的别的事情。
    -----------------update-----------------
    更新:
    @Starch
    像这种比较运算符或者一些基本概念问题,我有一个推荐:
    JavaScript 5
    http://ecma-international.org...
    JavaScript 6
    http://ecma-international.org...
    你可以到对应版本的JavaScript中寻找你需要的解释。
    回到本题,先来看一下 == 运算符它的原理吧:


    这个就是浏览器在遇到 == 时采取的操作步骤,我来翻译一下是什么意思:

    ==运算符是这样被计算的:
    1 让左引用(lref: left reference)成为正在计算的表达式左侧的值。
    2 将左值(lval:left value)赋值为 GetValue(lval)。
    3 让右引用(rref: right reference)成为正在计算的表达式右侧的值。
    4 将右值(rval:left value)赋值为 GetValue(rval)。
    5 返回执行rval == lval 抽象值比较的结果(参见 11.9.3)

    那么在11.9.3,又是怎么规定abstract equality comparison 的呢?


    这就比较长了,但是也很详细。这就不一条一条的解释了。
    直接看第七条就好了:
    If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
    那么结果就变成了:
    function() {} == 1
    然后再看第9条:
    If Type(x) is Object and Type(y) is either String or Number,
    return the result of the comparison ToPrimitive(x) == y.
    最后参考我一开始写的就好了。

    答案就是false。

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-10 17:54:34

    当 JavaScript 需要一个布尔值时(例如:if 语句),任何值都可以被使用。
    最终这些值将被转换为 true 或 false
    比如使用Boolean(function(){})返回true,在if语句中也会这样判断,因为它需要的是布尔值。

    而==是判断类型返回布尔

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:54:34

    并不是说function(){}为true, 你看看你的if判断里面只要不为null空 undefined 程序都能走通,所以这里并不能说明 function(){}==true;

    回复
    0
  • 取消回复