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

rah*_*hul 855 javascript null typeof object undefined

为什么被null认为是objectJavaScript?

正在检查

if ( object == null )
      Do something
Run Code Online (Sandbox Code Playgroud)

同样的

if ( !object )
      Do something
Run Code Online (Sandbox Code Playgroud)

并且:

null和之间有什么区别undefined

Rob*_*Rob 1476

(name is undefined)
Run Code Online (Sandbox Code Playgroud)

你:是什么name(*)
的JavaScript: name?什么是name?我不知道你在说什么.你之前没有提过任何一个name.您是否在(客户端)方面看到了其他一些脚本语言?

name = null;
Run Code Online (Sandbox Code Playgroud)

你:是什么name
JavaScript:我不知道.

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

要记住的一件事是,即使它们在类型铸造之后等同,即null概念上也不是false""等等

name = false;
Run Code Online (Sandbox Code Playgroud)

你:是什么name
JavaScript: Boolean false.

name = '';
Run Code Online (Sandbox Code Playgroud)

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


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

  • 空字符串不是布尔值false,但在条件的上下文中,它被解释为false(y)值(强制). (113认同)
  • 喜欢那种回答的风格.一般来说,*"你之前没有提到任何*`name`**是真的.但是,声明一个变量而不为它赋值(`var somevar;`),令人惊讶的是仍然会导致`undefined`. (48认同)
  • 对于第二种情况,name = null,而不是'我不知道',JavaScript可以回答:null对象.除此之外,我喜欢答案的风格. (21认同)
  • 而不是"我不知道",我会说"null"的答案是"没有".Null被精确定义为没有价值.虚空,无,虚无.没有. (15认同)
  • 但是在JavaScript中,空字符串''仍然是布尔值false. (13认同)
  • @MC Emperor - 另外,你可以显式地将声明的变量设置为`undefined`,所以我同意_"你之前没有提到任何`name`,"_有点误导. (9认同)
  • >您是否在(客户端)方面看到了其他一些脚本语言?哈哈哈哈 (6认同)
  • 这不回答以下问题:"(object == null)与(!object)相同" (4认同)
  • 我相信你的解释并不完全正确(但我也可能是错的).未定义是在未知值时应使用的值.`car is undefined`意味着Javascript不知道汽车的*值*,它确实知道汽车是什么.Null表示没有值,没有相关值.`car = null`意味着根本就没有汽车.所以你定义为null的实际上是未定义的,而null是完全不同的东西. (2认同)
  • @AndreasGrech 在 Javascript 中,空字符串不是布尔假。当您使用强制转换时,它只是简单地计算为布尔假。 (2认同)

ken*_*ura 141

差异可以归纳为这个片段:

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

alert(null !== undefined) //true
alert(null == undefined)  //true
Run Code Online (Sandbox Code Playgroud)

检查

object == null是不同的检查if ( !object ).

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

因为Boolean(null)等于假!false === true.

因此,如果您的对象不为null,但为 false0"",则检查将通过,因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false
Run Code Online (Sandbox Code Playgroud)

  • +1,用于解释!Boolean(对象) (9认同)
  • 请记住“typeof”是一个运算符。您不会将操作数括在括号中,其原因与您不会编写“var sum = 1 +(1);”的原因相同。 (2认同)

Axe*_*yer 122

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

null和之间的区别undefined如下:

  • undefined:由JavaScript使用,意味着"没有价值".未初始化的变量,缺少的参数和未知的变量具有该值.

    > var noValueYet;
    > console.log(noValueYet);
    undefined
    
    > function foo(x) { console.log(x) }
    > foo()
    undefined
    
    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined
    
    Run Code Online (Sandbox Code Playgroud)

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

    > unknownVariable
    ReferenceError: unknownVariable is not defined
    
    Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

作为一般规则,您应始终在JavaScript中使用===和never ==(==执行可能产生意外结果的各种转换).检查x == null是一个边缘情况,因为它适用于nullundefined:

> null == null
true
> undefined == null
true
Run Code Online (Sandbox Code Playgroud)

检查变量是否具有值的常用方法是将其转换为布尔值并查看它是否为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";
}
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点:以下所有值都要评估false,所以你必须要小心(例如,上面的检查无法区分undefined0).

  • undefined, null
  • 布尔: false
  • 编号:+0,-0,NaN
  • 字符串: ""

您可以使用Booleanas作为函数来测试转换为boolean (通常它是一个构造函数,用于new):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
Run Code Online (Sandbox Code Playgroud)

  • 可能是因为你仍然可以区分`+ 0`和`-0`:`1/+ 0!== 1/-0`. (6认同)
  • "但这实际上是一个错误(甚至可能在ECMAScript 6中修复)" - 来源? (5认同)
  • 这个答案链接到一个帖子,该帖子链接回这个答案作为来源...可能意味着链接到这个http://www.2ality.com/2013/10/typeof-null.html (2认同)

TSt*_*per 25

null和undefined有什么区别?

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

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

 undefined == null
 null == undefined
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅JavaScript与null和undefined之间的区别.

和你的新编辑 是的

if (object == null)  does mean the same  if(!object)
Run Code Online (Sandbox Code Playgroud)

当测试object是否为false时,它们在测试时只满足条件,如果为false,则不满足true

点击这里:Javascript gotcha

  • !object与"object == null"不一样......实际上,它们是完全不同的.如果对象为0,空字符串,布尔值为false,未定义或为null,则对象将返回true. (6认同)
  • 你应该使用===,然后使用undefined!== null:D (4认同)
  • null真的是一个对象吗?您提供的第一个链接按typeof检查null,但由于语言设计错误,typeof(null)计算为'object'. (3认同)
  • `null`不是一个对象.那个`typeof null =='object';`返回true是因为一个无法在JavaScript中修复的错误(目前,但将来可能会改变). (2认同)

小智 20

问题的第一部分:

为什么null被认为是JavaScript中的对象?

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

问题的第二部分:

检查


if (object == null)
Do something

是一样的

if (!object)
Do something

除以下情况外,这两项检查都是假的:

  • object是undefined或null:都是true.

  • object是原始的,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如果忽略type ,则为true,并认为是相等的.为什么他们决定,但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
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案,但它与[]有点太过分了:"_实际上,null和undefined是相同的......也许是空容器[]和{} ._"你可能会让我思考{}应该是一些无效的味道,但我的直觉是它不应该.但争议较少,**一个空数组`[]`可以理解为有一个`.push()`函数**,所以没有好的参数[]为空.$ 0.02. (8认同)

Cha*_*ant 10

var x = null;
Run Code Online (Sandbox Code Playgroud)

x定义为null

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

if (!x)
Run Code Online (Sandbox Code Playgroud)

null被评估为false


Noe*_*ams 7

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

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


    {
      name: "Bob",
      address: null
    }
Run Code Online (Sandbox Code Playgroud)
  • RegEx.exec.

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


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

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");
Run Code Online (Sandbox Code Playgroud)

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

    var uninitalised;
    console.log(uninitalised);

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

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

    missingParam();

    var arr = [];
    console.log(arr.pop());        
Run Code Online (Sandbox Code Playgroud)

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

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

if(typeof unknown !== "undefined"){
    //use unknown
}
Run Code Online (Sandbox Code Playgroud)

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

if(value === undefined){
  // stuff
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*man 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...
Run Code Online (Sandbox Code Playgroud)

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

JavaScript空检查比较图表


nop*_*ole 6

要添加到的答案之间有什么differrenceundefinednull,从JavaScript的权威指南第6版,在此页第41页

您可能会考虑undefined表示系统级别的、意外的或类似错误的值null缺失,并表示程序级别的、正常的或预期的值缺失。如果您需要将这些值之一分配给变量或属性或将这些值之一传递给函数,null几乎总是正确的选择。


Ben*_*Ben 6

TLDR

undefined是 JavaScript 中的原始值,表示值的隐式缺失。未初始化的变量自动具有此值,并且没有显式return语句 return 的函数undefined

null也是 JavaScript 中的原始值。它表示有意缺少对象值nullin JavaScript 旨在实现与Java 的互操作性。

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

细节

undefined是一个原始值,表示值的隐式缺失。请注意,undefined直到1998年的JavaScript 1.3才可以直接访问它。这告诉我们,null当明确表示没有值时,它旨在成为程序员使用的值。未初始化的变量自动具有值undefinedundefined是ECMAScript 规范中独一无二的类型

null是一个原始值,表示有意缺少对象值。null也是ECMAScript 规范中独一无二的类型

nullJavaScript 中的 in JavaScript 旨在实现与Java 的互操作性,无论是从“外观”角度还是从编程角度(例如,1996 年计划的 LiveConnect Java/JS 桥)。无论布兰登·艾克和其他人因为表达了对列入厌恶2 “没有价值”的价值观,但在1995年艾希是下订单“让[JavaScript的]看起来像Java”。

布伦丹·艾希

如果我没有“让它看起来像 Java”作为管理层的命令, 并且我有更多的时间(很难消除这两个因果因素),那么我会更喜欢类似 Self 的“一切都是对象”的方法:没有布尔值、数字、字符串包装器。没有未定义和空值。叹。

为了适应 Java 的概念null,由于Java 的强类型性质,只能分配给类型为引用类型(而不是原语)的变量,Eich 选择将特殊null值放置在对象原型链的顶部(即引用类型的顶部),并将null类型作为“对象类型原语”集的一部分包含在内。

typeof此后不久,1996 年 8 月 19 日发布的JavaScript 1.1 中添加了该运算符。

来自V8 博客

typeof null返回object,而不是null,尽管null是它自己的类型。要理解为什么,请考虑将所有 JavaScript 类型的集合分为两组:

  1. 对象(即对象类型)
  2. 原语(即任何非对象值)

因此,null意味着“没有对象价值”,而undefined意味着“没有价值”。

在此处输入图片说明

遵循这一思路,Brendan Eich 设计了 ​​JavaScript,typeof本着 Java 的精神,对右侧的所有值(即所有对象和空值)进行返回“对象”。这就是为什么 typeof null === 'object'尽管规范具有单独的null类型。

在此处输入图片说明

因此 Eich 设计了原始类型的层次结构,以实现与 Java 的互操作性。这导致他null在层次结构中与“对象类型原语”一起定位。为了反映这一点,当typeof此后不久被添加到语言中时,他选择typeof null了返回"object"

JavaScript 开发人员在 上表达的惊讶typeof null === "object"是具有null和的弱类型语言 (JavaScript)与undefined仅具有 和 的另一种强类型语言 (Java)之间的阻抗不匹配(或抽象泄漏)的结果,null其中null严格定义为引用引用类型(不是原始类型)。

请注意,这一切都是合乎逻辑的、合理的和有道理的。typeof null === "object"不是错误,而是必须适应 Java 互操作性的二阶效应。

出现了许多不完美的向后合理化和/或惯例,包括undefined表示隐含的价值缺失,以及null表示有意缺失价值;或者undefined就是没有值,null特别是没有对象值。

与 Brendan Eich 的相关对话,截图供后代使用:

在此处输入图片说明


Ano*_*ous 5

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

undefined是全局对象的属性(浏览器中的"窗口"),但它是基本类型而不是对象本身.它是未初始化变量的默认值,并且函数以return语句结束.

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


小智 5

一些精度:

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


发生的if事情如下if( o )

对括号 o 中的表达式进行计算,然后if对括号中表达式的值进行类型强制转换 - 在我们的例子中o

JavaScript 中的假(将被强制为假)值是:''、null、undefined、0 和 false