图片描述`
//这是zepto源码中的一个函数
function compact(array) {
return array.filter(function(item) {
//下面这句话我觉得是否有些冗余??
//undefined==null
//所以是不是可以直接 return item !=null??
return item !== undefined && item !== null
})
}
function compact(array) {
return array.filter(function(item) {
return item != null
})
}
还有,想告诉我 `0==null` 或者 `false==null`的同学,请把你的测试截图发上来。 ![图片描述][1]
PHPz2017-04-10 17:28:14
undefined==null;//true
0==null;//false
0==undefined;//false
null和undefined在执行比较的时候不会做类型转换,也就其不会转成数学或字符串或boolean
!=是==的求反值
element!=null;在element在null/undefined的情况下返回false,其它情况下返回true
所以以上替换是可以的
迷茫2017-04-10 17:28:14
原答案有误,两者应该是等价的。
在使用==
进行相等性判断时,与null
相等的只有undefined
和它自身,与undefined
相等的只有null
和它自身。
所以,如果item != null
,那么说明item一定不是null
且不是undefined
。
所以两者等价。
参考:11.9.3 The Abstract Equality Comparison Algorithm
原答案:不可以。两者并不等价。举个反例就清楚了:比如item
为0
时,原表达式为true
,而你给的表达式为false
。
PHPz2017-04-10 17:28:14
我觉得可以这样写:!!item
这里不能用这种方法。。这种方法用来将一个值或对象转换为布尔值。
item !== undefined && item !== null
这个语句返回一个布尔值,只有item
是undefined
或者null
时,这个语句才会返回false。这样看来的话,这句话只能这么写。
undefined != undefined; //false
undefined != null; //false
undefined != 0; //true
undefined != ''; //true
undefined != false; //true
undefined != new Object(); //true
null != null; //false
null != 0; //true
null != ''; //true
null != false; //true
null != new Object(); //true
实测得到的结果,题主的方法是可以的。
PHPz2017-04-10 17:28:14
在n===undefined的时候,n===null也是成立的,所以按理说直接写item!=null也是可以的。但是由于0==null,所以看来这样写还是有缺陷的,也就是说他那样是有道理的。
ringa_lee2017-04-10 17:28:14
undefined
有两种情况:当访问未定义
的变量时: 表示该变量不存在
,如果在C
语言中访问一个不存在的变量, 会报错, javascript 对待一个不存在的变量为 undefined
.
当定义了变量但未给其赋值时, 例如在Chrome中的测试:
var test2;
console.log(test1); // 变量`test1` 未定义
// 输出为 `undefined`
console.log(test2);
// 输出为`undefined`
// 变量 test1 未定义, 值为 undefined, test2 变量已定义但未赋值, 其值也为 undefined
null
表示一个变量的值为null
var test3 = null;
console.log(test3);
// 输出为`null`
如果你把test1
, test2
, test3
作为变量放入数组中, 其值是有可能为 undefined
或 null
的, 因此上面的判断并非是冗余的.