为什么null是一个对象,null和未定义有什么区别?

为什么null在JavaScript中被认为是object

正在检查

if ( object == null )Do something

if ( !object )Do something

?

还有:

nullundefined有什么区别?

603037 次浏览

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

空和未定义有什么区别??

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

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

 undefined == nullnull == undefined

有关更多详细信息,请参阅JavaScript null和untex的区别

和你的新编辑是的

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

当测试object是否为假时,它们都只满足测试if虚假时的条件,但不满足测试true时的条件

点击这里:javascript问题

例如window.someWeirdProperty是未定义的,所以

"window.someWeirdProperty === null"计算为false

"window.someWeirdProperty === undefined"计算为true。

此外,检查if (!o)与检查if (o == null)不一样,因为ofalse

typeof null;      // objecttypeof undefined; // undefined

值null表示有意不存在任何对象值。它是JavaScript的原始值之一,对于布尔操作被视为false sy。

var x = null;var y;

x被声明并定义为null

y被声明但未定义。它被声明为没有值,因此它是未定义的。

z未声明,因此如果您尝试使用z,也将是未定义的。

对于值相等,null和未定义都是假的(null==未定义):它们都折叠为布尔值假。它们不是同一个对象(null!==未定义)。

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

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

差异可以总结到这个片段中:

alert(typeof(null));      // objectalert(typeof(undefined)); // undefined
alert(null !== undefined) //truealert(null == undefined)  //true

正在查

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

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

因为Boolean(null)等于false,所以!false === true

因此,如果您的对象是不为空虚假"",检查将通过因为:

alert(Boolean(null)) //falsealert(Boolean(0))    //falsealert(Boolean(""))   //false
(name is undefined)

你:什么是name (*)
name?什么是name?我不知道你在说什么。你以前从未提到过任何name。你在(客户端-)端看到其他脚本语言了吗?

name = null;

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

简而言之;undefined是不存在事物概念的地方;它没有类型,以前从未在该范围内被引用过;null是已知事物存在的地方,但不知道值是什么。

要记住的一件事是,从概念上讲,nullfalse""或类似的不相同,即使它们在类型转换之后相等,即:

name = false;

你:什么是name
JavaScript:布尔值为false。

name = '';

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


*:name在这种情况下是一个从未定义过的变量。它可以是任何未定义的变量,然而,name是几乎任何超文本标记语言表单元素的属性。它可以追溯到很久以前,并且早在id之前就被建立了。它很有用,因为id必须是唯一的,但名称不必是唯一的。

一些精度:

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


if中发生的事情在if( o )中如下:

计算括号o中的表达式,然后if启动类型-强制括号中表达式的值-在我们的示例o中。

JavaScript中的Falsy(将被强制为false)值是:", null, un憎恨,0,和false

问题的第一部分:

为什么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),则两个检查都是假的。

因此,如果“对象”被解释为表示真正的对象,那么两个检查总是相同的。如果允许原语,那么0、""和false的检查是不同的。

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

问题的第三部分:

还有:

空和未定义有什么区别?

在JavaScript中,一个区别是null是对象类型,而un憎恨是un憎恨类型。

在JavaScript中,null==undefined为true,如果类型被忽略,则认为相等。为什么他们决定,但0、""和false不相等,我不知道。这似乎是一个武断的观点。

在JavaScript中,null===undefined不是true,因为类型必须与===相同。

实际上,null和untex是相同的,因为它们都代表不存在。0也是如此,""也是如此,也许还有空容器[]{}。如此多的相同的无类型会导致错误。一种类型或根本没有更好。我会尽量少用。

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

如果没有给出任何值,则声明的var x类型为未定义,但它应该与x从未声明过相同。另一个bug源是一个空的无容器。所以最好一起声明和定义它,就像var x=1一样。

人们在圈子里转来转去,试图找出所有这些不同类型的虚无,但这都是一样的,穿着复杂的不同衣服。现实是

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

也许所有人都应该抛出例外。

null不是物体,它是原始值。例如,您不能向其添加属性。有时人们错误地认为它是一个对象,因为typeof null返回"object"。但这实际上是一个bug(这甚至可能在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

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

    > unknownVariableReferenceError: unknownVariable is not defined
  • null: used by programmers to indicate “no value”, e.g. as a parameter to a function.

Examining a variable:

console.log(typeof unknownVariable === "undefined"); // true
var foo;console.log(typeof foo === "undefined"); // trueconsole.log(foo === undefined); // true
var bar = null;console.log(bar === null); // true

作为一般规则,您应该始终在JavaScript中使用===并且永远不要使用==(==执行可能产生意外结果的各种转换)。检查x == null是一种边缘情况,因为它适用于nullundefined

> null == nulltrue> undefined == nulltrue

检查变量是否有值的一种常见方法是将其转换为布尔值并查看它是否为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 falseparam = param || "abc";}

这种方法的缺点:以下所有值的计算结果都为false,因此您必须小心(例如,上述检查无法区分undefined0)。

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

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

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

理解null和untex的一种方法是了解它们发生的位置。

在以下情况下期望一个空返回值:

  • 查询DOM的方法

    console.log(window.document.getElementById("nonExistentElement"));//Prints: null
  • JSON responses received from an Ajax request

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

  • 处于变化状态的新功能。以下返回null:

var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));
// But this returns undefined:
Object.getOwnPropertyDescriptor({}, "a");

所有其他不存在的情况都表示为未定义(如@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());

当然,如果您决定编写var uniti化=null;或自己从方法返回null,那么您在其他情况下会出现null。但这应该是非常明显的。

第三种情况是当你想访问一个变量,但你甚至不知道它是否已经声明。对于这种情况,使用typeof来避免引用错误:

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

当您操作DOM、处理Ajax或使用某些ECMAScript 5功能时,汇总检查是否为null。对于所有其他情况,使用严格相等检查未定义是安全的:

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

要添加到#0和#1有什么区别?的答案,从JavaScript最终指南第6版,本页第41页

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

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

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

// Variables to testvar 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空检查比较图

以下函数显示了原因并能够找出差异:

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

如果你打电话

test();

你越来越

未定义

null

第一个console.log(...)尝试从myObj中获取myProperty,而它尚未定义-因此它返回“未定义”。将null分配给它后,第二个console.log(...)显然返回“null”,因为myProperty存在,但它具有分配给它的值null

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

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

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

Zakas,Nicholas C.(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 objectgame instanceof Object; //true, yay!!!game.score = 100;

未定义的情况:

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

考虑“null”的最好方法是回想一下类似的概念是如何在数据库中使用的,它表明一个字段包含“根本没有值”。

  • 是的,项目的值是已知的;它“定义”。它已经已初始化。
  • 该项目的值是:“没有任何价值”。

对于编写更容易调试的程序来说,这是一个非常有用的技巧。一个“未定义”的变量可能是bug……(你怎么知道?)……的结果,但是如果变量包含值“null”,你就知道“有人,在这个程序的某个地方,设置它到‘null’。”因此,我建议,当你需要删除一个变量的值时,不要“删除”……将其设置为“null”。旧的值将被孤立,很快就会被垃圾收集;新的值是,“没有值(现在)。”在这两种情况下,变量的状态都是确定的:“它显然是故意的,这样做了。”

与未定义相比,null的另一个有趣之处在于它可以递增。

x = undefinedx++y = nully++console.log(x) // NaNconsole.log(y) // 0

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

  1. 未定义表示变量已声明但尚未分配任何值,而Null可以分配给表示“无值”的变量。(Null是赋值操作符)

2.未定义是一个类型本身,而Null是一个对象。

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

javascript中,null不是object类型,而是primitave类型。

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

看看这个:

   <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

TLDR

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

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

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

详情

undefined是一个原始值,代表是隐式不存在值。请注意,undefined直到1998年的JavaScript 1.3才可直接访问。这告诉我们,null是程序员在显式指示不存在值时使用的值。未初始化的变量自动具有值undefinedundefined是ECMAScript规范中的独一无二的类型

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

JavaScript中的null旨在实现与Java无论是从“外观”的角度,还是从编程的角度(例如计划于1996年Java /JS桥)的互操作性。Brendan Eich和其他人都对包含两个“没有价值”值表示厌恶,但在1995年,Eich是根据命令“让[JavaScript]看起来像Java”。

Brendan Eich

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

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

typeof操作员是在在javascript 1.1之后不久添加的,于1996年8月19日发布。

的v8博客

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

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

因此,null表示“没有对象值”,而undefined表示“没有”值”。

输入图片描述

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

输入图片描述

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

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

请注意,这都是合乎逻辑的、合理的和可以辩护的。typeof null === "object"不是bug,而是必须适应Java互操作性的二阶效应。

出现了许多不完美的向后合理化和/或约定,包括undefined表示隐式不存在值,null表示故意不存在值;或者undefined是不存在值,而null具体是不存在对象值。

与Brendan Eich的相关对话,为子孙后代截屏:

输入图片描述

使用null将某些东西定义为没有值,当您期望某些东西可能根本没有定义时使用未定义。

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

var weDontHaveAValue = null;

如果您期望某些东西可能根本没有定义,例如可选的选项参数,请使用untex。

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

什么是类型?

类型是对进行分类的一种方式。这是一个表格,其中包含有问题的类型及其typeof结果。

类型值类型包含typeof结果typeof是谎言吗?
未定义仅:undefined"undefined"
Null仅:null"object"
对象无限数量的值:{}{a: "b"},…"object"

null没有一个对象,它是一个Null类型的值。

typeof运算符是撒谎!它为null返回"object"是JavaScript语言中的一个错误。

我在我的开源电子书中写了一章。你可以在这里阅读https://github.com/carltheperson/advanced-js-objects

null和未定义的主要区别在于null代表缺少对象,而未定义表示变量的未初始化状态。

您可以将null视为未定义的对象,但未定义只会是未定义的因为它的类型是未定义的。

let a;console.log(a); //undefined, since it is declared but not initialized
console.log(null == undefined) //trueconsole.log(null === undefined) // false
console.log(typeof null) //objectconsole.log(typeof undefined) //undefined

控制台

未定义未定义不是同一件事。

age;

你:age的值是多少?

计算机:好的,让我检查一下我的内存/参考表……在这一点上(你问的时候),我没有看到任何名为age的标识符,不在这个范围/上下文或任何父范围/上下文中;age对我来说是不知道的。也许以后我会遇到一条将该标识符添加到内存的指令,但它现在不存在。

var age;

你:age的值是多少;

计算机:好的,检查我的内存……我在我的参考表中看到一个名为age的标识符,但在我添加它的时候没有值或指针或任何东西被分配给它,所以我不知道;你可以认为它(age)是空的/没有/无用的。

var age = null;

你:age的值是多少;

计算机:好的,检查我的内存……我在我的参考表中看到age:它是null。基本上,它什么都没有/空,你不能用这个值做任何事情;这是故意的。

现在,我可能不应该这样解释,但希望它会有意义。

我可以看到为什么null被设计成JS中的对象,我个人喜欢这样。

nullundefined实际上的意思相同:空/无。区别在于它在概念上的使用方式。

我将null视为开发人员意图的虚无;某些null是故意做的,以表示任何东西。我将未定义视为计算机意图的虚无;由于开发人员/用户的意外而没有价值的东西。

例如,如果你从库/sdk调用一个函数并返回null,你几乎可以肯定这是开发人员/作者故意设计的;他们特别想指示虚无。

另见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/null