日期:2014-05-16  浏览次数:20355 次

----------------一个会让你纠结很久的问题.-----------------------
先不要在计算机上测试。。。

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.

请问大家上面的说法是否正确?推演的运算结果是否正确??

------解决方案--------------------
JScript code

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

------解决方案--------------------
再转个
1、 &&

    如果将逻辑与运算符用在判断真假,与其他强类型语言是没什么不同的。JS的&&运算符在返回值上值得注意。

    第一个操作数为假或可以转换为假时,表达式返回第一个操作数的值,而不是返回false。

    第一个操作数为真或可以转换为真时,返回第二个操作数的值。

var i = 0;
var x = (i++ && false);
alert(x);
alert(typeof x);
// 0
// 'number'
2、 ||

    同样,逻辑或在返回值上也与其他强类型语言不同。

    第一个操作数为真或可以转换为真时,表达式返回第一个操作数的值,而不是返回 true。

    第一个操作数为假或可以转换为假时,表达式返回第二个操作数的值,而不论第二个操作数经过转换后是不是为假。


------解决方案--------------------
真是不错
------解决方案--------------------
IE6下window.navigator.plugins.length为0


所以说了。 JS里的比较是返回运算的值 2个true返回的是true
 但是你那个不是2个true 是2个值。。
要得到TRUE必须用 !!转换过.
------解决方案--------------------
如果推演是这样的话,的确是对的。
经过阅读1楼的和自己测试,发现“所以在boolean运算中会转换成true”这句话有问题,
的确在JS中的bool运算中它不是返回true 或者false ,如果是&&运算的话,它是找到第一个可以确定这个运算结果的对象,并且返回这个对象。同样的或运算也是,返回第一个可以确定运算结果的对象。
学习了
------解决方案--------------------
alert(Boolean(window.navigator.plugins));

所以 true && true



如果你用BOOLEAN转过了. 那就是TRUE了.
 没转过就返回运算结果(对象)
------解决方案--------------------
http://www.laone.net/post/2011/01/14/201101141214334760.aspx
------解决方案--------------------
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);