我想知道JavaScript中null和undefined之间的区别。


当前回答

我将解释undefined、null和UncaughtReferenceError:

1-未捕获引用错误:脚本中未声明变量,没有对此变量的引用2-未定义:变量已声明但未初始化3-null:声明的变量为空值

其他回答

只是为了添加我的观点-

在C++等编译语言的情况下,优化编译器会删除只声明且从不在任何地方使用的变量[或在IDE中标记警告]。这最终意味着变量不存在,因为它的内存从未分配。

在javascript解释器的情况下,[我猜]一个变量仅从被赋予值的那一点起被视为存在。在此之前,它的类型是“undefined”,并且没有为它分配内存。因此,它的名称是undefineed。

javascript中的null是一个表示地址的值,但该地址还没有指向任何内容[不存在的引用]。然而,这是一个价值。

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


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

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

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

但是,变量编号已定义,未分配初始值:

let number;
number; // => undefined

number变量未定义,这明显表示变量未初始化当访问不存在的对象属性时,会发生相同的未初始化概念:

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

由于obj中不存在lastName属性,JavaScript正确地将obj.lastName计算为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或undefined)。在这种情况下,该函数无法创建克隆,因此它返回null-缺少对象的指示符。

typeof运算符区分两个值:

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

严格质量运算符==正确区分undefined和null:

let nothing = undefined;
let missingObject = null;
nothing === missingObject; // => false

好吧,当我们听到null和undefined时,我们可能会感到困惑,但让我们简单地开始吧,它们都是假的,在很多方面都很相似,但JavaScript的奇怪部分,使它们有一些显著的区别,例如,typeof null是“object”,而typeof undefineed是“undefined'。

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

但如果你用下面的==检查它们,你会发现它们都是假的:

null==undefined; //true

此外,您可以将null赋给对象属性或原语,而undefined可以通过不赋给任何对象来实现。

我创建了一个快速的图像,以一目了然地显示差异。

tl;博士

使用null设置一个已知为Object的变量。

使用undefined设置类型混合的变量。


这是我对5个原语和Object类型的用法,这解释了未定义或空的«用例»之间的区别。

一串

如果您知道一个变量在整个生命周期中只是一个字符串,那么按照惯例,您可以将其初始化为“”:

("") ? true : false; // false
typeof ""; // "string";
("Hello World") ? true : false; // true
typeof "Hello World"; // "string"

数字

如果您知道一个变量在所有生命周期中都只是一个数字,那么按照惯例,您可以将其初始化为0(如果0在您的使用中是一个重要值,则为NaN):

(0) ? true : false; // false
typeof 0; // "number";
(16) ? true : false; // true
typeof 16; // "number"

or

(NaN) ? true : false; // false
typeof NaN; // "number";
(16) ? true : false; // true
typeof 16; // "number"

布尔型

如果您知道一个变量只是一个布尔值,而所有生命周期,按照惯例,您可以将其初始化为false:

(false) ? true : false; // false
typeof false; // "boolean";
(true) ? true : false; // true
typeof true; // "boolean"

对象

如果您知道一个变量在所有生命周期中都只是一个Object,那么按照惯例,您可以将其初始化为null:

(null) ? true : false; // false
typeof null; // "object";
({}) ? true : false; // true
typeof {}; // "object"

注意:关闭null的智能用法是Object的错误版本,因为Object始终为true,因为typeof null返回对象。这意味着typeof myVarObject返回Object和null类型的一致值。

All

如果您知道一个变量有一个混合类型(所有生命周期中的任何类型),按照惯例,您可以将其初始化为undefined。