在JavaScript中,null和undefined之间有什么区别?

1645
在JavaScript中,nullundefined有什么区别?

32
我一直认为:null 表示你有意将其设置为空,而 undefined 是因为没有被设置而为空。或者说 null 是故意设置为空,而 undefined 则仍然为空。基本上这展示了意图。 - Muhammad Umer
64
看看这个。console.log(null-undefined)。null和undefined的区别是NaN。(请注意,这是一次幽默尝试,不要因为误解问题而批评我。) - Ivan
了解undefined及其与作用域的关系 https://codepen.io/grumpy/post/undefined-scope-in-javascript - AL-zami
1
值得一提的是,尽管“null”的发明者Tony Hoare称其为他的“十亿美元错误”,JavaScript却愉快地将这个错误乘以了2。祝你调试愉快! - Chris Collett
显示剩余5条评论
39个回答

2
基本上,Undefined是JavaScript在运行时创建的全局变量,而null则表示未向变量分配任何值(实际上,null本身就是一个对象)。
让我们来看一个例子:
        var x;  //we declared a variable x, but no value has been assigned to it.
        document.write(x) //let's print the variable x

未定义,这就是你将会得到的输出结果。

现在,

        x=5;
        y=null;
        z=x+y;

你会得到5作为输出。这就是未定义 (Undefined)null之间的主要区别。


2

两个特殊值都表示空状态。

主要区别在于,undefined 表示尚未初始化的变量值,而 null 表示对象有意缺失。

变量 number 已定义,但是没有赋初值:

let number;
number; // => undefined

数字变量未定义,这明确表明它是一个未初始化的变量。

当访问不存在的对象属性时,同样会出现未初始化的概念:

const obj = { firstName: 'Dmitri' };
obj.lastName; // => undefined

因为obj对象中不存在lastName属性,JavaScript将其正确计算为undefined。

在其他情况下,您知道一个变量应该保存一个对象或函数返回一个对象。但由于某种原因,您无法实例化该对象。在这种情况下,null是缺少对象的有意义指示。

例如,clone()是一个克隆纯JavaScript对象的函数。该函数期望返回一个对象:

function clone(obj) {
  if (typeof obj === 'object' && obj !== null) {
    return Object.assign({}, obj);
  }
  return null;
}
clone({name: 'John'}); // => {name: 'John'}
clone(15);             // => null
clone(null);           // => null

然而,clone()函数可能会接受非对象参数: 15、null(或通常的原始值、null或未定义)。在这种情况下,该函数无法创建克隆,因此返回null——表示缺少对象的指示符。

typeof操作符可以区分这两个值:

typeof undefined; // => 'undefined'
typeof null;      // => 'object'

严格的质量运算符 === 可以正确区分 undefined 和 null:
let nothing = undefined;
let missingObject = null;
nothing === missingObject; // => false

1

另外注意比较的不同之处:

10 > undefined
false

10 < undefined
false

10 < null
false

10 > null
true

0
const data  = { banners: null }
const { banners = [] } = data;
console.log(data)      // null


const data  = { banners: undefined }
const { banners = [] } = data;
console.log(data)      // []

0

null 的类型是 Object,而 undefined 的类型是 undefined。 Null 表示“没有值”,而 undefined 表示“不存在”。

typeof undefined; //undefined
typeof null; // Object
undefined !== null; //true
undefined == null; //true
undefined === null; //false
var var1;
var1; //undefined 
var var2 = null;
var2; //null

-1
在Javascript中,null是一个空值或不存在的值,必须进行赋值。但Undefined表示变量已经声明,但没有定义值。
let a = null;  
console.log(a);    // null
let b;         
console.log(b);    // undefined

在JS中,null和undefined都是原始值。此外,您可以查看以下代码行。
console.log(typeof null); //Object
console.log(typeof undefined); //undefined
console.log(10+null); // 10
console.log(10+undefined); //NaN

1
未声明的变量也具有未定义的类型。typeof undefined 是 "undefined",而不是 "object"。 - Linostar

-2

如果一个变量没有被初始化,那么它就是未定义的。 未定义不是一个对象。 例如:var MyName; console.log(typeof MyName);

在开发工具中检查控制台日志,它将被打印为未定义。

null是一个对象。如果你想让某个变量为空,则使用null。null变量存在,但值未知。它应该通过编程方式分配给一个变量。null不会自动初始化。

例如:var MyName = null; console.log(typeof MyName); 在开发工具中检查控制台日志,它将是一个对象。


-4

空值始终是存在于内存中的未知对象,而未定义则不是。


-4

仅附上我的看法 -

在编译语言(如C ++)中,一个仅被声明但从未在任何地方使用的变量会被优化编译器删除[或在IDE中标记警告]。这最终意味着该变量不存在,因为它的内存从未分配。

对于javascript解释器,[我猜]变量只有在赋值后才被视为存在。在此之前,它的类型为"undefined",并且没有为其分配任何内存。因此,它的类型是undefined。

Javascript中的null 表示地址的值,但是该地址尚未指向任何内容[不存在的引用]。 尽管如此,它也是一种值。


不行,必须分配一些内存来区分已声明(但“未定义”)的变量和未声明的变量。undefined也是一个值,并且它是未初始化变量的默认值。 - Bergi
我不了解js解释器的工作原理,但猜测是基于typeof运算符应用于不存在变量和仅声明变量产生相同的“undefined”字符串。我对未声明变量是否获得默认原始值undefined[也许有内部知识的人可以澄清]存在疑虑,即使比较返回true。在ECMA-262之前没有undefined值? - Hoven
typeof 对于这两种情况具有相同的输出并不意味着任何事情(尽管它可能暗示了网景的原始实现)。诚然,优化编译器可能不会分配堆栈变量,直到它们被赋值,但我不认为各种实现中非优化的编译器(注意:语言没有单一解释器)会这样做——毕竟,ES规范说变量环境在调用时初始化。 - Bergi
1
经过研究,我发现我的观点是不正确的。请参考12.2节ECMA标准 - http://www.ecma-international.org/ecma-262/5.1/#sec-12.2 引用:变量语句声明按10.5中定义创建的变量。变量在创建时初始化为未定义。而且,在以下链接中,第2点澄清了未声明的变量实际上只在初始化时创建,否则不会创建 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var - Hoven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接