null
和undefined
有什么区别?null
和undefined
有什么区别?undefined
表示一个变量已被声明但尚未被赋值:
var testVar;
console.log(testVar); //shows undefined
console.log(typeof testVar); //shows undefined
null
是一种赋值值。它可以分配给变量,作为没有值的表示:
var testVar = null;
console.log(testVar); //shows null
console.log(typeof testVar); //shows object
从上面的例子可以清楚地看出,undefined
和 null
是两种不同的类型:undefined
是一种类型本身(未定义),而 null
是一个对象。
证明:
console.log(null === undefined) // false (not the same type)
console.log(null == undefined) // true (but the "same value")
console.log(null === null) // true (both type and value are the same)
与
null = 'value' // Uncaught SyntaxError: invalid assignment left-hand side
undefined = 'value' // 'value'
undefined
还是 null
? - Erowlinlet toiletPaperIn2020 = undefined;
可以翻译为:在2020年,厕纸的数量未定义。 - Rainundefined
不能是一个空的容器。在这种表示中,undefined
是一个空的容器,而 null 是带有“空”便利贴的空容器(为了让不幸的用户知道向清洁女工要厕纸是毫无意义的)。这也解释了为什么很多开发人员感到困惑:我应该在未初始化的变量上贴上“空”便利贴,还是每个人都会理解“空”意味着真正的空?例如,缺乏卫生纸是故意的还是不经意的? - Stefaan Vandevelde这段内容是从这里获取的。
未定义(undefined)是一种原始值,当变量没有被赋值时使用。
空值(null)是一种原始值,表示空、不存在或未设置引用。
当你通过var声明一个变量但不给它赋值时,它的值为undefined。单独使用这个值时,如果尝试WScript.Echo()或alert(),将看不到任何东西。然而,如果给它附加一个空字符串,它就会出现:
var s;
WScript.Echo(s);
WScript.Echo("" + s);
你可以声明一个变量,将其设置为null,此时的行为与将其设置为undefined相同,只是你会看到打印出来的值是"null"而不是"undefined"。这确实是一个小差异。
你甚至可以比较一个未定义的变量和null或相反的情况,条件会被判定为真:
undefined == null
null == undefined
然而,它们被认为是两种不同的类型。虽然undefined是一个独立的类型,但null被认为是一种特殊的对象值。您可以通过使用typeof()函数来查看这一点,该函数返回表示变量通用类型的字符串:
var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));
运行上述脚本将产生以下输出:
undefined
object
无论它们是不同类型的,如果您尝试访问任何一个成员,它们都会表现相同,即抛出异常。在WSH中,您将看到可怕的“'varname'为null或不是对象”,这还算幸运(但这是另一篇文章的主题)。var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]);
上述脚本的结果是:0.) a
1.) undefined
2.) c
当尝试读取一个不存在的下标或成员时,你也会得到 undefined 的返回值。
null 和 undefined 的区别在于:JavaScript 永远不会将任何东西设置为 null,通常我们自己这样做。虽然我们可以将变量设置为 undefined,但我们更喜欢 null,因为它不是 JavaScript 自动设置的值。在调试时,这意味着任何设置为 null 的东西都是你自己设置的,而不是由 JavaScript 设置的。除此之外,这两个特殊值几乎是相等的。
null
和undefined
之间区别的所有疑惑。此外,你可以使用本答案末尾的实用函数获取更具体类型的变量。undefined
的变量
4. 赋值为字面量null
的变量
5. 赋值为除undefined
或null
以外的任何其他东西的变量typeof
运算符检查,它返回字符串'undefined'
- 无法使用松散等式运算符(== undefined
),更不用说严格等式运算符(=== undefined
),
以及if语句和三元运算符(? :
)——这些会抛出引用错误。typeof
返回字符串'undefined'
- 使用null
检查的==
返回true
- 使用undefined
检查的==
返回true
- 使用null
检查的===
返回false
- 使用undefined
检查的===
返回true
- 对if语句和三元运算符(? :
)为falsy
3. 赋值为字面量undefined
的变量
- 这些变量与声明但未赋值的变量完全相同。null
的变量typeof
返回字符串 'object'==
与 null
比较返回 true
==
与 undefined
比较返回 true
===
与 null
比较返回 true
===
与 undefined
比较返回 false
? :
)中被认为是falsyundefined
和 null
之外,typeof
返回下列字符串之一: 'bigint', 'boolean', 'function', 'number', 'object', 'string', 'symbol'typeof
并返回该值,如果它不是 'object'null
,因为typeof null
也会返回 'object'Object
的 toString
方法返回类似于'[object ConstructorName]'的字符串。对于所有其他对象(用户定义的对象),它始终返回'[object Object]'true
,它将尝试通过 toString
提取构造函数的名称来获取它的名称。如果无法访问构造函数,则像往常一样返回'object'。如果字符串不包含其名称,则返回'anonymous'(支持 ECMAScript 2020 的所有类型)
function TypeOf(o, returnConstructorBoolean) {
const type = typeof o
if (type !== 'object') return type
if (o === null) return 'null'
const toString = Object.prototype.toString.call(o)
switch (toString) {
// Value types: 6
case '[object BigInt]': return 'bigint'
case '[object Boolean]': return 'boolean'
case '[object Date]': return 'date'
case '[object Number]': return 'number'
case '[object String]': return 'string'
case '[object Symbol]': return 'symbol'
// Error types: 7
case '[object Error]': return 'error'
case '[object EvalError]': return 'evalerror'
case '[object RangeError]': return 'rangeerror'
case '[object ReferenceError]': return 'referenceerror'
case '[object SyntaxError]': return 'syntaxerror'
case '[object TypeError]': return 'typeerror'
case '[object URIError]': return 'urierror'
// Indexed Collection and Helper types: 13
case '[object Array]': return 'array'
case '[object Int8Array]': return 'int8array'
case '[object Uint8Array]': return 'uint8array'
case '[object Uint8ClampedArray]': return 'uint8clampedarray'
case '[object Int16Array]': return 'int16array'
case '[object Uint16Array]': return 'uint16array'
case '[object Int32Array]': return 'int32array'
case '[object Uint32Array]': return 'uint32array'
case '[object Float32Array]': return 'float32array'
case '[object Float64Array]': return 'float64array'
case '[object ArrayBuffer]': return 'arraybuffer'
case '[object SharedArrayBuffer]': return 'sharedarraybuffer'
case '[object DataView]': return 'dataview'
// Keyed Collection types: 2
case '[object Map]': return 'map'
case '[object WeakMap]': return 'weakmap'
// Set types: 2
case '[object Set]': return 'set'
case '[object WeakSet]': return 'weakset'
// Operation types: 3
case '[object RegExp]': return 'regexp'
case '[object Proxy]': return 'proxy'
case '[object Promise]': return 'promise'
// Plain objects
case '[object Object]':
if (!returnConstructorBoolean)
return type
const _prototype = Object.getPrototypeOf(o)
if (!_prototype)
return type
const _constructor = _prototype.constructor
if (!_constructor)
return type
const matches = Function.prototype.toString.call(_constructor).match(/^function\s*([^\s(]+)/)
return matches ? matches[1] : 'anonymous'
default: return toString.split(' ')[1].slice(0, -1)
}
}
null是一个特殊的关键字,表示值的缺失。
可以将其视为一种值,例如:
undefined 属性表示变量未被赋值,包括 null 。
var foo;
定义的空变量是数据类型为undefined
的null
它们都代表一个没有值的变量值
并且null
不代表没有值的字符串,即空字符串。
例如:
var a = '';
console.log(typeof a); // string
console.log(a == null); //false
console.log(a == undefined); // false
现在,如果
var a;
console.log(a == null); //true
console.log(a == undefined); //true
但是
var a;
console.log(a === null); //false
console.log(a === undefined); // true
因此每个人都有自己使用的方式
undefined用于比较变量的数据类型
null用于清空变量的值
var a = 'javascript';
a = null ; // will change the type of variable "a" from string to object
typeof null
返回“对象”,但这实际上是早期ECMAScript版本中已知并记录的一个bug,为了保持向后兼容性而保留至今。您在评论中实际发布的链接在页面中间部分就指出了:“typeof null // object (bug in ECMAScript, should be null)”!因此,在对下降票进行评论之前,请显示一些搜索努力。 - danwellmannull:变量的值不存在;undefined:变量本身不存在。
..其中变量是与一个值相关的符号名称。
虽然JavaScript可以很友善地使用null隐式初始化新声明的变量,但它并没有这样做。
var a = {}; a.n = undefined;' then ..
a.hasOwnProperty('n') == true` ...所以说 变量本身的缺失 不再正确。 - Muhammad Umerundefined
开始。 - Steve Bennettundefined
的意图是变量不存在,而null
的意图是变量存在但没有值。人们通过检查变量的typeof
进入实现特定的细节,但错过了理解计算机科学中最强大的术语之一——“抽象”。 - Aman Godara理解它们之间的区别最好的方法是先把JavaScript内部的工作原理澄清,只需了解以下术语的含义即可:
let supervisor = "None"
// I have a supervisor named "None"
let supervisor = null
// I do NOT have a supervisor. It is a FACT that I do not.
let supervisor = undefined
// I may or may not have a supervisor. I either don't know
// if I do or not, or I am choosing not to tell you. It is
// irrelevant or none of your business.
这三种情况有不同的含义,JavaScript使用null
和undefined
两个不同的值来区分后两种情况。您可以自由地显式使用这些值来传达这些含义。
那么,由于这一哲学基础,会出现哪些特定于JavaScript的问题呢?
A declared variable without an initializer gets the value undefined
because you never said anything about the what the intended value was.
let supervisor;
assert(supervisor === undefined);
A property of an object that has never been set evaluates to undefined
because no one ever said anything about that property.
const dog = { name: 'Sparky', age: 2 };
assert(dog.breed === undefined);
null
and undefined
are "similar" to each other because Brendan Eich said so. But they are emphatically not equal to each other.
assert(null == undefined);
assert(null !== undefined);
null
and undefined
thankfully have different types. null
belongs to the type Null
and undefined
to the type Undefined
. This is in the spec, but you would never know this because of the typeof
weirdness which I will not repeat here.
A function reaching the end of its body without an explicit return statement returns undefined
since you don't know anything about what it returned.
顺便提一下,在JavaScript中还有其他形式的 "nothingness"(学过哲学很有好处....)
NaN
ReferenceError
let
or const
defined local variable in its temporal dead zone and receiving a ReferenceError
Empty cells in sparse arrays. Yes these are not even undefined
although they compare ===
to undefined.
$ node
> const a = [1, undefined, 2]
> const b = [1, , 2]
> a
[ 1, undefined, 2 ]
> b
[ 1, <1 empty item>, 2 ]
let supervisor = undefined
的情况下一样。 - J. Bruniundefined
,是相当流行的,而且真的很难向人们解释清楚(虽然我一直在努力)。很多人因JavaScript同时拥有null
和undefined
这两个值而对它进行了诟病,但是这些值确实有完全不同的含义,并且大部分时候它们都能很好地使用其预定的含义(当然这是我的看法)。 - Ray Toal你可能认为undefined表示系统级别的意外或错误缺失值,而null表示程序级别的正常或预期缺失值。
via JavaScript:权威指南
if (value === undefined) { ... }
)
- 相反,使用间接类型守卫(也称为真值检查),例如if (value) { ... }
- 每当0或空字符串具有意义时,请使用以下方法之一
- 使用显式帮助程序方法,例如Lodash的isNil,或在比较中包含有意义的值(例如if (!value && value !== 0) { ... }
)
- 考虑使用lint规则禁止使用nullif (value)
比 if (value == null)
更好。但如果函数遇到错误时,它会返回什么而不是一个对象呢?我认为 return null
是显而易见的选择,但在这种情况下,“停止在代码中使用‘null’”的建议并不清楚你在暗示什么。 - Nagevundefined
,并将其作为除对象之外的有效返回值(例如,考虑TS签名(): YourType | undefined
)。然后,调用者可以通过简单的真值检查if (...) {}
轻松跳过undefined
。 - NicBrighttry ... catch
很烦人。在许多情况下,返回自定义对象可能过于复杂。而且if (...)
测试对于undefined
和null
同样适用,由于后者实际上是一个对象,所以当对象是返回类型时,使用null
是有意义的。该函数的含义是:抱歉,无法给您想要的对象,这里提供null
代替。 - Nagevnull
是一种特殊的值,表示"没有值"。 null
是一个特殊的对象,因为typeof null
返回'object'。
另一方面,undefined
意味着变量未被声明或未被赋值。
undefined
可能意味着一个变量没有被声明,但并不能保证如此。一个变量可以被声明为var thing;
,它将等于undefined
。 - Yura
null
表示你有意将其设置为空,而undefined
是因为没有被设置而为空。或者说null
是故意设置为空,而undefined
则仍然为空。基本上这展示了意图。 - Muhammad Umer