为什么null是一个对象,null和undefined之间有什么区别?

时间:2009-04-29 05:47:09

标签: javascript object null undefined typeof

为什么null在JavaScript中被视为object

正在检查

if ( object == null )
      Do something

相同
if ( !object )
      Do something

还有:

nullundefined之间的区别是什么?

22 个答案:

答案 0 :(得分:1461)

(name is undefined)

您:什么是name(*)
JavaScript: name?什么是name?我不知道你在说什么。您以前从未提及任何name。您是否在(客户端)方面看到了其他一些脚本语言?

name = null;

您:什么是name
JavaScript:我不知道。

总之; undefined是不存在任何概念的地方;它没有类型,并且在该范围之前从未被引用过; null是已知存在的东西,但不知道它的价值是什么。

要记住的一点是null在概念上与false""等不同,即使它们在类型转换后等同,即

name = false;

您:什么是name
JavaScript:布尔值false。

name = '';

您:什么是name
JavaScript:空字符串


*:name在此上下文中是指从未定义过的变量。它可以是任何未定义的变量,但是,name是几乎任何HTML表单元素的属性。它顺便说一下,并且在id之前很好地制定了。它很有用,因为id必须是唯一的,但名称不一定是。 功能

答案 1 :(得分:141)

差异可归纳为此片段:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined) //true
alert(null == undefined)  //true

检查

object == null与检查if ( !object )不同。

后者等于! Boolean(object),因为一元!运算符会自动将右操作数转换为布尔值。

由于Boolean(null)等于false,因此!false === true

因此,如果您的对象不为空 false 0 “”< / strong>,支票将通过 这是因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

答案 2 :(得分:118)

nullnot an object,它是原始值。例如,您无法向其添加属性。有时人们错误地认为它是一个对象,因为typeof null返回"object"。但这实际上是一个错误(甚至可能在ECMAScript 6中修复)。

nullundefined之间的差异如下:

  • undefined:由JavaScript使用,表示“无价值”。未初始化的变量,缺失的参数和未知的变量具有该值。

    > var noValueYet;
    > console.log(noValueYet);
    undefined
    
    > function foo(x) { console.log(x) }
    > foo()
    undefined
    
    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined
    

    但是,访问未知变量会产生异常:

    > unknownVariable
    ReferenceError: unknownVariable is not defined
    
  • null:程序员用来表示“没有价值”,例如作为函数的参数。

检查变量:

console.log(typeof unknownVariable === "undefined"); // true

var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true

var bar = null;
console.log(bar === null); // true

作为一般规则,您应始终在JavaScript中使用===和never ==(==执行all kinds of conversions会产生意外结果)。支票x == null是一个边缘案例,因为它适用于nullundefined

> null == null
true
> undefined == null
true

检查变量是否具有值的常用方法是将其转换为布尔值并查看它是否为true。该转换由if语句和布尔运算符执行! (“非”)。

function foo(param) {
    if (param) {
        // ...
    }
}
function foo(param) {
    if (! param) param = "abc";
}
function foo(param) {
    // || returns first operand that can't be converted to false
    param = param || "abc";
}

此方法的缺点:以下所有值都评估为false,因此您必须小心(例如,上述检查无法区分undefined0

  • undefinednull
  • 布尔人:false
  • 数字:+0-0NaN
  • 字符串:""

您可以使用Boolean作为函数来测试转换为布尔值(通常它是一个构造函数,与new一起使用):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

答案 3 :(得分:25)

  

null和undefined有什么区别??

没有定义的属性未定义。 null是一个对象。它的类型是对象。 null是一个特殊值,意思是“没有值.undefined不是一个对象,它的类型是未定义的。

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

 undefined == null
 null == undefined

有关详细信息,请参阅JavaScript Difference between null and undefined

并使用新的修改

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

当测试对象是否为false时,它们仅在测试 false 时才满足条件,但在真实时不符合

点击此处:Javascript gotcha

答案 4 :(得分:20)

问题的第一部分:

  

为什么将null视为JavaScript中的对象?

这是一个他们现在无法解决的JavaScript设计错误。它应该是null类型,而不是类型对象,或者根本不具有它。在检测真实物体时需要额外检查(有时会被遗忘)并且是虫子的来源。

问题的第二部分:

  

正在检查
  

  if (object == null)
  Do something
  
  与
相同   
  if (!object)
  Do something

除了以下两项检查都是假的

  • 对象未定义或为null:均为true。

  • 对象是原始的,0,""或false:首先检查false,第二个为true。

如果对象不是基元,而是真实的对象,如new Number(0)new String("")new Boolean(false),则两个检查均为假。

因此,如果'object'被解释为一个真正的Object,那么两个检查总是相同的。如果允许原语,那么对于0,""和false,检查是不同的。

在像object==null这样的情况下,不明显的结果可能是错误的来源。建议不要使用==,而是使用===

问题的第三部分:

  

还有:
  
  null和undefined有什么区别?

在JavaScript中,一个区别是null是object类型,undefined是undefined类型。

在JavaScript中,null==undefined为true,如果忽略type,则视为相等。为什么他们决定,但0,""和假不相等,我不知道。这似乎是一种随意的观点。

在JavaScript中,null===undefined不正确,因为===中的类型必须相同。

实际上,null和undefined是相同的,因为它们都代表不存在。所以0和""也是如此,也许是空容器[]{}。这么多类型的相同的东西都是bug的秘诀。一种类型或根本没有更好。我会尝试尽可能少地使用。

'false','true'和'!'是另一个可以简化的蠕虫包,例如,仅if(!x)if(x)就足够了,你不需要真假。

如果没有给出值,则声明的var x类型为undefined,但它应该与从未声明x的情况相同。另一个bug源是一个空的无容器。因此,最好一起声明和定义它,例如var x=1

人们围成一圈又一圈地试图找出所有这些不同类型的东西,但在复杂的不同衣服中它们都是一样的。现实是

undefined===undeclared===null===0===""===[]==={}===nothing

也许所有人都应该抛出异常。

答案 5 :(得分:10)

var x = null;

x定义为null

y未定义; //因为我没有定义它

if (!x)

null被评估为false

答案 6 :(得分:7)

JavaScript中许多不同的空检查的比较:

http://jsfiddle.net/aaronhoffman/DdRHB/5/

// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;

...trim...

http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html

JavaScript Null Check Comparison Chart

答案 7 :(得分:7)

理解null和undefined的一种方法是了解每个发生的位置。

在以下情况下,期望返回值为null:

  • 查询DOM的方法

    console.log(window.document.getElementById("nonExistentElement"));
    //Prints: null
    
  • 从Ajax请求收到的JSON响应


    {
      name: "Bob",
      address: null
    }
  • RegEx.exec

  • 处于不稳定状态的新功能。以下命令返回null:


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

所有其他不存在的情况用undefined表示(如@Axel所述)。以下每个打印&#34;未定义&#34;:

    var uninitalised;
    console.log(uninitalised);

    var obj = {};
    console.log(obj.nonExistent);

    function missingParam(missing){
        console.log(missing);
    }

    missingParam();

    var arr = [];
    console.log(arr.pop());        

当然如果你决定写var unitialised = null;或者自己从方法返回null然后在其他情况下发生null。但那应该是非常明显的。

第三种情况是您想要访问变量,但您甚至不知道它是否已被声明。对于那种情况,使用typeof来避免引用错误:

if(typeof unknown !== "undefined"){
    //use unknown
}

总结在操作DOM,处理Ajax或使用某些ECMAScript 5功能时检查null。对于所有其他情况,使用严格相等性检查undefined是安全的:

if(value === undefined){
  // stuff
}

答案 8 :(得分:6)

对于值相等,

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

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

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

答案 9 :(得分:4)

从JavaScript权威指南on this page添加 undefinednull 之间的差异是什么:

  

您可能会认为undefined代表系统级,意外,   或类似错误的值和null表示程序级别,   正常或预期没有价值。如果你需要指定一个   这些值到变量或属性或将这些值中的一个传递给   一个函数,null几乎总是正确的选择。

答案 10 :(得分:4)

一些准确性:

null和undefined 两个不同的值。一个代表缺少名称的值,另一个代表缺少名称。


if中发生的情况如下if( o )

评估括号o中的表达式,然后if开始在括号中强制表达式的类型 - 在我们的例子o中。

JavaScript中的Falsy(将被强制为false)值包括:'',null,undefined,0和false

答案 11 :(得分:1)

null是一个对象。它的类型为null。 undefined不是一个对象;它的类型未定义。

答案 12 :(得分:1)

例如window.someWeirdProperty未定义,所以

{p> "window.someWeirdProperty === null"评估为false

"window.someWeirdProperty === undefined"评估为真。

此外,checkif if (!o)与检查if (o == null) o false的{​​{1}}不同。

答案 13 :(得分:1)

以下功能说明了原因并且能够解决差异:

function test() {
        var myObj = {};
        console.log(myObj.myProperty);
        myObj.myProperty = null;
        console.log(myObj.myProperty);
}

如果你打电话

test();

你得到了

  

未定义

     

第一个console.log(...)尝试从myProperty获取myObj,但尚未定义 - 因此它会返回“未定义”。在为其指定null后,第二个console.log(...)显然会返回“null”,因为myProperty存在,但它已赋值null

为了能够查询这种差异,JavaScript有nullundefined:虽然null是 - 就像在其他语言中一样,undefined不能一个对象,因为没有实例(甚至没有null实例)可用。

答案 14 :(得分:1)

与undefined相比,null的另一个有趣的事情是它可以递增。

x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

这对于设置计数器的默认数值很有用。你在声明中将变量设置为-1的次数是多少次?

答案 15 :(得分:1)

Javascript null中,object类型不是primitave类型。

有什么区别? 未定义是指尚未设置的指针。 Null 是指空指针,例如某些东西已手动将变量设置为null类型

答案 16 :(得分:1)

看看这个:

   <script>
function f(a){
  alert(typeof(a));
  if (a==null) alert('null');
  a?alert(true):alert(false);
}
</script>
                                          //return:
<button onclick="f()">nothing</button>    //undefined    null    false
<button onclick="f(null)">null</button>   //object       null    false
<button onclick="f('')">empty</button>    //string               false
<button onclick="f(0)">zero</button>      //number               false
<button onclick="f(1)">int</button>       //number               true
<button onclick="f('x')">str</button>     //string               true

答案 17 :(得分:1)

TLDR

undefined是JavaScript中的原始值,指示隐式缺少值。未初始化的变量会自动具有该值,并且在没有显式return语句的情况下返回undefined

null也是JavaScript中的原始值。它指示the intentional absence of an object value。 JavaScript中的null旨在实现与Java的互操作性。

typeof null之所以返回"object",是因为该语言的设计具有特殊性,源于JavaScript与Java可以互操作的要求。这并不意味着null是对象的实例。这意味着:给定JavaScript中原始类型的树,null是“对象类型原始”子树的一部分。这将在下面更全面地说明。

详细信息

undefined是一个原始值,represents隐式缺少值。请注意,undefined直到1998年的JavaScript 1.3才可以直接访问。这告诉我们null是程序员在明确指示缺少值时使用的值。未初始化的变量将自动具有值undefinedundefined是ECMAScript规范中的one-of-a-kind type

null是一个原始值,represents有意缺少对象值。 null也是ECMAScript规范中的one-of-a-kind type

JavaScript中的

null旨在实现与Javaboth from a "look" perspective, and from a programatic perspective (eg the LiveConnect Java/JS bridge planned for 1996)的互操作性。此后,Brendan Eich和其他人都对包含两个“缺少值”的值表示不满,但1995年Eich under orders提出“使[JavaScript]看起来像Java”。 / p>

Brendan Eich

如果我没有从管理部门那里获得“使它看起来像Java”这样的命令, 我有更多的时间(很难不混淆这两个因果关系),那么我会更喜欢像“自我”这样的“一切都是对象” 方法:没有布尔值,数字,字符串包装器。没有未定义且为null。 叹气。

为了适应Java的null概念,由于Java的强类型性质,它只能分配给键入为引用类型(而不是原语)的变量,Eich选择将特殊的{ {1}}值位于对象原型链的顶部(即引用类型的顶部),并将null类型包括在“对象类型基元”集合中。

null操作符是在in JavaScript 1.1之后不久添加的,该操作符于1996年8月19日发布。

来自the V8 blog

typeof返回typeof null,而不返回object,尽管null是 自己的类型。要了解原因,请考虑所有 JavaScript类型分为两组:

  1. 对象(即对象类型)
  2. 基元(即任何非对象值)

因此,null表示“无对象值”,而null表示“无对象值” 值”。

enter image description here

遵循这种思路,Brendan Eich设计了JavaScript, 使undefined返回右侧的所有值的“对象”, 即按照Java的精神,所有对象和空值。这就是为什么 typeof尽管规范具有单独的typeof null === 'object'类型。

enter image description here

因此,Eich设计了原始类型的层次结构,以实现与Java的互操作性。这导致他将null连同“对象类型基元”一起放在层次结构上。为了避免这种情况,此后不久将null添加到该语言时,他选择typeof返回typeof null

JavaScript开发人员在"object"上表示的惊讶是由于同时具有typeof null === "object"null的弱类型语言(JavaScript)之间的阻抗不匹配(或抽象泄漏)导致的以及另一种仅具有undefined且其中nullstrictly defined的强类型语言(Java)来引用参考类型(不是原始类型)。

请注意,这都是合乎逻辑,合理和合理的。 null不是错误,而是必须适应Java互操作性的第二种效果。

出现了许多不完美的向后合理化和/或约定,包括typeof null === "object"表示隐式缺少值,而undefined表示有意的< / em>没有值;或null是没有值,而undefined是没有 object 值。

与布伦丹·艾希(Brendan Eich)的一次相关对话,为后代截图:

enter image description here

答案 18 :(得分:0)

来自Nicholas C. Zakas的“面向对象的Javascript原理”

  

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

Zakas,Nicholas C.(2014-02-07)。面向对象JavaScript的原理(Kindle Locations 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.

答案 19 :(得分:0)

最好的思考方式&#39; null&#39;是回想一下在数据库中如何使用类似的概念,它表明一个字段包含&#34;根本没有价值。&#34;

  • 是的,该项目的价值是已知的; &#39;已定义。&#39; 已初始化。
  • 该项的值为:&#34;没有值。&#34;

这是一种非常有用的技术,用于编写更容易调试的程序。一个未定义的&#39;变量可能是一个bug的结果...... (你怎么知道?) ...但是如果变量包含值&#39; null,&#39;你知道&#34;有人,在这个程序的某个地方,将它设置为为空。&#39;&#34;因此,我建议,当你需要摆脱变量的价值时,不要删除&#34; ...将其设置为“空”。&#39;旧的价值将成为孤儿,很快将被垃圾收集;新值是,&#34;没有价值(现在)。&#34;在这两种情况下,变量的状态都是肯定的:&#34;显然,故意是这样的。&#34;

答案 20 :(得分:0)

  1. 未定义表示已声明变量但未赋值任何值,而Null可分配给表示“无值”的变量。(Null为赋值运算符)
  2. 2.Undefined是一个类型本身,而Null是一个对象。

    3.Javascript本身可以将任何未分​​配的变量初始化为undefined但它永远不能将变量的值设置为null。这必须以编程方式完成。

答案 21 :(得分:0)

使用null可以将某些内容定义为没有值,如果希望根本无法定义某些内容,请使用undefined。

例如,如果变量没有值,则将其分配为null。

var weDontHaveAValue = null;

如果您希望根本不定义某些内容,例如可选的options参数,请使用undefined。

if (typeof args.optionalParam !== 'undefined') { }