先不要在计算机上测试var hasplugins = window.navigator.plugins && window.navigator.plugins.length;window.navigator.plugins的运算结果是一个非空的object
window.navigator.plugins.length的运算结果是一个大于0的值解法:
因为window.navigator.plugins非空,所以在boolean运算中会转换成true
window.navigator.plugins.length大于0的值,在boolean运算中会转换成true
所以结果是 true && true 结果为true.请问大家上面的说法是否正确?推演的运算结果是否正确??

解决方案 »

  1.   

    LZ大概是没理解JS的某些特性(虽然我也不是很清楚)
    不过JS在处理非BOOL型的比较时,返回的是比较运算里的结果。var hasplugins = window.navigator.plugins && window.navigator.plugins.length;
    首先这句我还想说一点。window.navigator.plugins.length在不同浏览器下是不一样的。然后来说JS下的 &&运算.
    在遇到运算结果为FLASH为止,都会一直处理下去,直到为FALSE或到最后.
    则  1&&2&&3  结果为3   1&&0&&2 结果为0
    然后是||运算
    直到最后或者有一个为TRUE为止. 返回那个结果
    则 0||0||1 结果为1    0||2||3 结果为2.如果你需要得到BOOL型  可以用2个 !! 来强转  alert(!!0);
      

  2.   


    alert({}&&10);
    alert(12&&{});
      

  3.   

    再转个
    1、     &&    如果将逻辑与运算符用在判断真假,与其他强类型语言是没什么不同的。JS的&&运算符在返回值上值得注意。    第一个操作数为假或可以转换为假时,表达式返回第一个操作数的值,而不是返回false。    第一个操作数为真或可以转换为真时,返回第二个操作数的值。        var i = 0;
            var x = (i++ && false);
            alert(x);
            alert(typeof x);
            // 0
            // 'number'
    2、 ||    同样,逻辑或在返回值上也与其他强类型语言不同。    第一个操作数为真或可以转换为真时,表达式返回第一个操作数的值,而不是返回 true。    第一个操作数为假或可以转换为假时,表达式返回第二个操作数的值,而不论第二个操作数经过转换后是不是为假。
      

  4.   

    to:cb1156感谢你的回复。
    引用你的话:
    window.navigator.plugins.length在不同浏览器下是不一样的
    你说的是对的,我知道在不同的浏览器中返回结果不一样,我忘了说,这里我们就当做这个
    window.navigator.plugins.length返回固定的大于0的值,好吗?我的问题是,你是否同意上面的推演,如果不同意,请你说出一些有说服力的证明!!
      

  5.   

    IE6下window.navigator.plugins.length为0
    所以说了。 JS里的比较是返回运算的值   2个true返回的是true
     但是你那个不是2个true 是2个值。。
      要得到TRUE必须用 !!转换过.
      

  6.   

    如果推演是这样的话,的确是对的。
    经过阅读1楼的和自己测试,发现“所以在boolean运算中会转换成true”这句话有问题,
    的确在JS中的bool运算中它不是返回true 或者false ,如果是&&运算的话,它是找到第一个可以确定这个运算结果的对象,并且返回这个对象。同样的或运算也是,返回第一个可以确定运算结果的对象。
    学习了
      

  7.   

    to:knightzhuwei感谢你的回复。
    引用你的话:
    与其他强类型语言是没什么不同的
    这个肯定是不对的,至少在.net中,bool运算的结果不可能返回一个Object类型感谢你的第一个举例,一开始没有开明白,后来就想通了。
    (0 && false),0转换为false,所以返回第一个操作数 0另外,这个例子似乎和我上面的有些出入,不能说明我上面的问题.你看你是否同意上面的推演,如果不同意,请你说出一些有说服力的证明!!
      

  8.   


    呵,哥们,我说了假设window.navigator.plugins.length返回大于0的值,实际上在非IE中这个值都是大于0的大于0的值是不是会转换成true?
    看这个var a = 1;
        if (a)
            alert("true");
        else
            alert("false");
    这个肯定是true
    alert(Boolean(window.navigator.plugins));所以 true && true
      

  9.   

    alert(Boolean(window.navigator.plugins));所以 true && true如果你用BOOLEAN转过了.  那就是TRUE了.
     没转过就返回运算结果(对象)
      

  10.   

    http://www.laone.net/post/2011/01/14/201101141214334760.aspx
      

  11.   

    LZ大概是没理解JS的某些特性(虽然我也不是很清楚)
    不过JS在处理非BOOL型的比较时,返回的是比较运算里的结果。var hasplugins = window.navigator.plugins && window.navigator.plugins.length;
    首先这句我还想说一点。window.navigator.plugins.length在不同浏览器下是不一样的。然后来说JS下的 &&运算.
    在遇到运算结果为FLASH为止,都会一直处理下去,直到为FALSE或到最后.
    则 1&&2&&3 结果为3 1&&0&&2 结果为0
    然后是||运算
    直到最后或者有一个为TRUE为止. 返回那个结果
    则 0||0||1 结果为1 0||2||3 结果为2.如果你需要得到BOOL型 可以用2个 !! 来强转 alert(!!0);