在说document.all之前, 先看看哪些值会转化成falsy.
- undefined
- null
- false
- +0, -0, and NaN
- ""
在这个列表里的值, 在转化为boolean时, 都会成为false, 不在这个表里的值, 都会变为true. 也就是说, 所有对象(即使是空对象), 所有数组(即使是空数组), 所有非空字符串(即使是" ", "0")都是true.
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean("")); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean([])); // true
console.log(Boolean({})); // true
console.log(Boolean("0")); // true
等一下, 这篇文章的标题是什么意思? document.all会被转成false? 这不是一个对象吗, 刚才不是说对象都是true吗? 理论上说是, 但这是个例外, 一般奇葩的设定都会和搅局者IE有关系, 这个也是. document,all最开始是ie的东西, 标准里根本没有, 别的浏览器也不支持, 所以很多老代码判断是不是ie浏览器, 就这样写了
if (document.all) {
// this is ie
} else {
// this isn't ie
}
时间久了之后, 别的浏览器也开始支持这个api了, 那之前的判断代码就不能用了, 但是代码已经写了, 难道要全部都找出来改? 所以干脆就不该了, 改设定, 在ie中, document.all 是truth, 在别的浏览器里是 falsy, 所以就出现了这个奇葩设定. 不过这个对象也不是js自己的, 是浏览器提供的, 所以也不能说js的标准有问题, 是浏览器自己改的设定, 怨不得js.
......为什么我想起了 typeof null // object