作者:qtl4431541 | 来源:互联网 | 2023-02-02 13:27
Vara0,b[],c{},d‘’;Console.log(!a);Console.log(!b);Console.log(!c);Console.
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。
14 个解决方案
我从不在这个上面浪费时间
!~b.push(a)
我手下写这样的代码 说不出理由我直接抽
var a = 0;
var b = [];
var c ={};
var 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));
你写的什么啊
好吧,我就是个打酱油的
看到这里这么热闹,进来看看...
!~ 话说这种 处理的确不是正常 的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。
var a = 2,b = [],c = {},d = '';
console.log(a||b||c||d) 测试结果为2
console.log(a&&b&&c&&d) 测试结果为空串
var a =2,b =[];
console.log(a&&b) 结果是[]
还测试了其它的不同的语句,其中有一个object {}
说明这里与和或的并不是布尔值,不等同于一元操作符!。
又测试了一下 发现 我想多了。。。
&& 和 || 执行的之后返回的不是true false 因为这个语句不会强转变量的类型,
它返回的其实是最后一个被执行 true false 判断的变量。。。
[] || '1' || 2 || {} 返回 []
'1' || [] || 2 || {} 返回 '1'
0 || '' || 2 || {} 返回 ''
0 || '1' || 2 || {} 返回 '1'
0 || null || 2 || {} 返回 2
[] && '1' && 2 && {} 返回 {}
[] && '1' && 0 && {} 返回 0
[] && '' && 2 && {} 返回 ''