如何检查一个变量,如果是
null
或undefined
,是什么之间的差异null
和undefined
?==
和===
(很难在 Google 上搜索“===”)有什么区别?
JavaScript 检查 null 与 undefined 以及 == 和 === 之间的区别
我如何检查一个变量,如果它是
null
或undefined
...
是变量null
:
if (a === null)
// or
if (a == null) // but see note below
...但请注意,如果a
is ,后者也将成立undefined
。
是吗undefined
:
if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below
...但同样,请注意最后一个是模糊的;如果a
是,它也将是真的null
。
现在,尽管有上述情况, 检查这些的通常方法是使用它们是false的事实:
if (!a) {
// `a` is falsey, which includes `undefined` and `null`
// (and `""`, and `0`, and `NaN`, and [of course] `false`)
}
......是什么之间的差异
null
和undefined
?
它们都是通常用于表示缺少某些东西的值。undefined
是更通用的一个,用作变量的默认值,直到为它们分配其他值,作为调用函数时未提供的函数参数的值,以及当您询问对象时获得的值对于它没有的属性。但它也可以明确用于所有这些情况。(不具有属性的对象与具有具有值的属性undefined
之间存在差异;调用undefined
具有参数值的函数与完全不使用该参数之间存在差异。)
null
比以下更具体undefined
:它是一个空白对象引用。当然,JavaScript 是松散类型的,但并非所有与 JavaScript 交互的东西都是松散类型的。如果像浏览器中的 DOM 这样的 API 需要一个空白的对象引用,我们使用null
,而不是undefined
。同样,DOM 的getElementById
操作返回一个对象引用——一个有效的(如果它找到了 DOM 元素),或者null
(如果它没有)。
有趣的是(或不是),他们是他们自己的类型。也就是说,null
是Null 类型undefined
的唯一值,也是Undefined 类型的唯一值。
“==”和“===”有什么区别
它们之间的唯一区别是==
会进行类型强制以尝试使值匹配,而===
不会。所以例如"1" == 1
是真的,因为"1"
强制到1
. 但"1" === 1
是false,因为类型不匹配。("1" !== 1
是真的。)第一个(真正的)步骤===
是“操作数的类型是否相同?” 如果答案为“否”,则结果为false
。如果类型相同,则它的作用完全相同==
。
类型强制使用相当复杂的规则并且可能产生令人惊讶的结果(例如,"" == 0
为真)。
规范中的更多内容:
区别很微妙。
在 JavaScript 中,undefined
变量是从未被声明或从未赋值的变量。var a;
例如,假设您声明了,然后a
将是undefined
,因为它从未被分配任何值。
但是,如果您然后分配a = null;
那么a
现在将是null
. 在 JavaScript 中null
是一个对象(typeof null
如果您不相信我,请在 JavaScript 控制台中尝试),这意味着 null 是一个值(实际上甚至undefined
是一个值)。
例子:
var a;
typeof a; # => "undefined"
a = null;
typeof null; # => "object"
这可以证明在函数参数中很有用。您可能希望有一个默认值,但认为 null 是可以接受的。在这种情况下,您可以这样做:
function doSomething(first, second, optional) {
if (typeof optional === "undefined") {
optional = "three";
}
// do something
}
如果省略optional
参数doSomething(1, 2) then
optional 将是"three"
字符串,但如果您通过,doSomething(1, 2, null)
则可选将是null
.
至于相等==
和严格相等===
比较器,第一个是弱类型,而严格相等也检查值的类型。这意味着0 == "0"
将返回 true;while0 === "0"
将返回 false,因为数字不是字符串。
您可以使用这些运营商之间要检查undefined
的null
。例如:
null === null # => true
undefined === undefined # => true
undefined === null # => false
undefined == null # => true
最后一种情况很有趣,因为它允许您检查变量是否未定义或为空,而没有其他任何内容:
function test(val) {
return val == null;
}
test(null); # => true
test(undefined); # => true
规范是为这些问题提供完整答案的地方。这是一个总结:
- 对于变量
x
,您可以:
- 检查是否
null
通过直接比较使用===
. 例子:x === null
- 检查它是否是
undefined
通过两种基本方法之一:与undefined
或直接比较typeof
。由于种种原因,我更喜欢typeof x === "undefined"
。 - 检查它是否是一个
null
与undefined
利用==
和依托略有神秘的强制类型转换规则,意味着x == null
你想要做什么。
- 检查是否
==
and之间的基本区别在于===
,如果操作数是不同类型,===
则将始终返回,false
而==
将使用导致一些稍微不直观的行为的规则将一个或两个操作数转换为相同类型。如果操作数是相同类型的(例如,二者都是字符串,如在typeof
上述比较),==
并且===
将表现完全相同。
更多阅读:
- Angus Croll 的真理、平等和 JavaScript
- Andrea Giammarchi 的JavaScript Coercion揭秘
- comp.lang.javascript 常见问题解答:JavaScript 类型转换
如何检查变量是否为空或未定义
只需检查变量是否具有这样的有效值:
if(variable)
如果变量不包含,它将返回真:
- 空值
- 不明确的
- 0
- 错误的
- ""(空字符串)
- NaN
不明确的
这意味着变量尚未初始化。
例子 :
var x;
if(x){ //you can check like this
//code.
}
等于(==)
它只检查 value 是否等于而不是 datatype 。
例子 :
var x = true;
var y = new Boolean(true);
x == y ; //returns true
因为它只检查 value 。
严格等于(===)
检查值和数据类型是否应该相同。
例子 :
var x = true;
var y = new Boolean(true);
x===y; //returns false.
因为它检查数据类型 x 是原始类型而 y 是布尔对象。