为什么null在JavaScript中被认为是一个对象?

正在检查

if ( object == null )
      Do something

if ( !object )
      Do something

?

还有:

null和undefined之间的区别是什么?


当前回答

一些精度:

Null和undefined是两个不同的值。一个表示没有名称的值,另一个表示没有名称。


对于if(o), if中发生的事情如下所示:

括号o中的表达式被求值,然后if语句开始对括号中的表达式的值进行类型强制——在我们的例子中是o。

JavaScript中的Falsy(将被强制为false)值为:",null, undefined, 0和false。

其他回答

摘自Nicholas C. Zakas的《面向对象的Javascript原理》

但是为什么对象类型是空的呢?(事实上,TC39(设计和维护JavaScript的委员会)已经承认这是一个错误。你可以推断null是一个空对象指针,使“object”成为一个逻辑返回值,但这仍然令人困惑。)

尼古拉斯·扎卡斯(2014-02-07)。面向对象JavaScript的原则(Kindle位置226-227)。没有淀粉机。Kindle版。

也就是说:

var game = null; //typeof(game) is "object"

game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {}; 
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;

未定义的例子:

var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.

Null和undefined对于值相等都是false (Null ==undefined):它们都崩溃为布尔值false。它们不是同一个对象(null!==undefined)。

Undefined是全局对象(浏览器中的“window”)的一个属性,但它是一个基本类型,而不是对象本身。它是未初始化的变量和函数的默认值,没有返回语句。

null是Object的一个实例。null用于返回集合对象以指示空结果的DOM方法,该方法提供false值而不指示错误。

为了补充“undefined和null之间的区别是什么”的答案,请参阅JavaScript权威指南第6版,本页第41页:

你可能认为undefined表示系统级的,意外的, 或者类似错误的无值和null表示程序级, 正常的,或预期的价值缺失。如果你需要分配一个 将这些值传递给变量或属性或将其中一个值传递给 一个函数,null几乎总是正确的选择。

null和undefined之间的区别是什么??

没有定义的属性是未定义的。null是一个对象。它的类型是object。Null是一个特殊值,表示“没有值”。Undefined不是一个对象,它的类型是Undefined。

你可以声明一个变量,将其设置为null,除了你会看到“null”和“undefined”打印出来之外,行为是相同的。你甚至可以将一个未定义的变量与null进行比较,反之亦然,条件将为真:

 undefined == null
 null == undefined

更多细节请参考JavaScript null和undefined之间的差异。

还有你的新编辑,是的

if (object == null)  does mean the same  if(!object)

当测试object是否为false时,它们都只满足测试是否为false时的条件,而不满足测试是否为true时的条件

检查这里:Javascript抓住你了

typeof null;      // object
typeof undefined; // undefined

null值表示有意不存在任何对象值。它是JavaScript的基本值之一,在布尔操作中被视为假值。

var x = null;
var y;

X被声明并定义为null

Y声明了,但没有定义。它声明时没有值,所以没有定义。

Z没有被声明,所以如果你试图使用Z,它也是未定义的。