null
和undefined
有什么区别?null
和undefined
有什么区别? 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之间的主要区别。
两个特殊值都表示空状态。
主要区别在于,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'
let nothing = undefined;
let missingObject = null;
nothing === missingObject; // => false
另外注意比较的不同之处:
10 > undefined
false
10 < undefined
false
10 < null
false
10 > null
true
const data = { banners: null }
const { banners = [] } = data;
console.log(data) // null
const data = { banners: undefined }
const { banners = [] } = data;
console.log(data) // []
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
let a = null;
console.log(a); // null
let b;
console.log(b); // undefined
console.log(typeof null); //Object
console.log(typeof undefined); //undefined
console.log(10+null); // 10
console.log(10+undefined); //NaN
如果一个变量没有被初始化,那么它就是未定义的。 未定义不是一个对象。 例如:var MyName; console.log(typeof MyName);
在开发工具中检查控制台日志,它将被打印为未定义。
null是一个对象。如果你想让某个变量为空,则使用null。null变量存在,但值未知。它应该通过编程方式分配给一个变量。null不会自动初始化。
例如:var MyName = null; console.log(typeof MyName); 在开发工具中检查控制台日志,它将是一个对象。
空值始终是存在于内存中的未知对象,而未定义则不是。
仅附上我的看法 -
在编译语言(如C ++)中,一个仅被声明但从未在任何地方使用的变量会被优化编译器删除[或在IDE中标记警告]。这最终意味着该变量不存在,因为它的内存从未分配。
对于javascript解释器,[我猜]变量只有在赋值后才被视为存在。在此之前,它的类型为"undefined",并且没有为其分配任何内存。因此,它的类型是undefined。
Javascript中的null 是表示地址的值,但是该地址尚未指向任何内容[不存在的引用]。 尽管如此,它也是一种值。
undefined
也是一个值,并且它是未初始化变量的默认值。 - Bergitypeof
对于这两种情况具有相同的输出并不意味着任何事情(尽管它可能暗示了网景的原始实现)。诚然,优化编译器可能不会分配堆栈变量,直到它们被赋值,但我不认为各种实现中非优化的编译器(注意:语言没有单一解释器)会这样做——毕竟,ES规范说变量环境在调用时初始化。 - Bergi
null
表示你有意将其设置为空,而undefined
是因为没有被设置而为空。或者说null
是故意设置为空,而undefined
则仍然为空。基本上这展示了意图。 - Muhammad Umer