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

关于console对象的log方法
Var a = 0,
b = [] ,
c ={},
d =‘’;
Console.log(!a);
Console.log(!b);
Console.log(!c);
Console.log(!d);
Console.log(a&&b&&c&&d);
Console.log(a||b||c||d);
Console.log(!~b.push(a));


输出结果是?
在firebug里调试为nothing。
Firebug JS

------解决方案--------------------
!a 等  都把它转换为boolean型了吧
------解决方案--------------------
!~ 话说这种 处理的确不是正常 的js开发人员的思维....
以下是在firefox22beta里面测试的结果

Console.log(!a); true  因 0==false js就这么规定的...你只能咬他...
Console.log(!b); false b虽然是一个空的数组,但是它仍然是一个存在的数组,空盘子也是盘子
Console.log(!c); false 原因同上,是个空的json对象,但是它仍然存在
Console.log(!d); true  原因同第一个,0== '' ==false 这个跟其它的语言可能不太一样 
Console.log(a&&b&&c&&d); 0 按理这里应该输出的是个false,不清持为毛显示0,当然如果用if语句判断,这个肯定会走false对应的分支.
Console.log(a
------解决方案--------------------
b
------解决方案--------------------
c
------解决方案--------------------
d);[] 按理这里应该输出的是个true,不清楚为毛显示[],当然如果用if判断会走true分支.
Console.log(!~b.push(a));false  b.push(a) 就是给数组b加了一个元素a,但是这个时候用~操作符按位取反,那么数组b将被转换为字符串,执行数组的toStirng方法得到0,按位取反得到-1,  -1被!操作符操作时,被强转为boolean 值是 true,然后执行!操作,结果是false...


api里面有如下的表述:
1、所有一元运算符,如 ~ 运算符,以如下规则来求表达式的值: 

如果将它用于 undefined 或 null 表达式,则产生一个运行时错误。 
对象被转换成字符串。 
如果可能,字符串被转换为数字。如果不能,则产生一个运行时错误。 
Boolean 值被当作数字(如果是 false 则为 0,如果是 true 则为 1)。 


2、JScript 使用下面的规则,来把非 Boolean 值转换为 Boolean 值: 

所有对象都被认为是 true。 
字符串当且仅当为空时被认为是 false。 
null 和 undefined 被认为是 false。 
数字当且仅当为零时是 false。