为什么if判断规则和==判断规则不一样?

如下面的代码:

        var a = ""; // false
        var b = " "; // false
        var c = []; // false
        var d = [0]; // false
        var e = [1]; // true
        var f = {}; // false
        var g = {a:0}; // false
        var h = {b:1}; // false
        var j; // false
        var k = null; // false
        if (a) {console.log('a')}
        if (b) {console.log('b')} // 成功打印
        if (c) {console.log('c')} // 成功打印
        if (d) {console.log('d')} // 成功打印
        if (e) {console.log('e')} // 成功打印
        if (f) {console.log('f')} // 成功打印
        if (g) {console.log('g')} // 成功打印
        if (h) {console.log('h')} // 成功打印
        if (j) {console.log('j')}
        if (k) {console.log('k')}
阅读 4.2k
7 个回答

调用if会调用这个ToBoolean,==并不是呀

因为规则就是不一样啊。
==会转化为数字进行比较
[]==true比的其实是0==1;
if则是强行转化为布尔值
[]是个数组,确切存在,所以就是true,可以这么理解。
具体的规则,我也记不大清,你可以去查一下。

if判断的时候,如果传入的不是boolean类型的值(或表达式),js引擎会把你的变量转成boolean类型的变量。比如,if(0)判断是否定的,是因为Boolean(0)的值为false,而if(1),if(2),if(不等于0和NaN的数)都等价于if(true)是应为Boolean(不等于0和NaN)的值为true。但是==操作符则不同,它的规则比较复杂,这里举个简单的例子。if(true==1)会被判定为真,但是if(true==2)就会被判定为假。因为对于==操作符,true和一个Number类型的值比较的话,它只能等于1,而Boolean(a)中只要a不为零即为真。关于==操作符,推荐一篇文章:一张图彻底搞懂JavaScript的==运算,希望能帮到你。

    var a = ""; // 里面没有东西,所以if()判断为假
    var b = " "; // 有东西,空格
    var c = []; // 有东西,空的[]
    var d = [0]; // 有东西,
    var e = [1]; // 有东西
    var f = {}; // 有东西
    var g = {a:0}; // 有东西
    var h = {b:1}; // 有东西
    var j; // 没赋值,默认if()判断为假
    var k = null; // 错误当然是假

==判断会先把各种类型转换成数字类型 而if则会把各种类型转换成布尔值 下图是各类型与数字和布尔值的关系

图片描述

除了NAN, false, "", null, undefined, 其余都是true

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题