谁能给我解释一下这两者之间的区别?if(obj.x == undefined)
和 if(typeof obj.x == 'undefined')
在某些情况下,第一种方式可以正常工作,但在其他情况下,我需要使用第二种方式。
疑问
1-这两种情况有什么区别?
2 - 有什么最佳实践吗?
最好的做法是不要只检查 真实性 而 严格平等
例子
if (obj.x === undefined) {}
这曾经是一个问题,因为 undefined
(一个全局属性)使用是可写的,从1.8.5开始是不可写的,为您在ES5规范环境中提供安全的比较。
每 MDN
如果你把等价运算符换成了 ==
与严格的平等运算符 ===
. 所以... obj.x === undefined
和 typeof obj.x == "undefined"
通常是等价的。
然而,在ECMAScript 5之前的环境中(一般来说,这仍然是大多数的web请求)。undefined
是全局对象的一个可写属性,这意味着 undefined
可以被用作变量名,或者全局属性可以被分配一个不同的值。ECMAScript 5使全局属性成为只读,但即使如此。undefined
仍然可以在函数中作为变量名使用,这意味着 typeof
检查总是比较安全的。
还有一点支持 typeof
因为它可以用来检查一个可能没有被声明的变量,而直接比较会抛出一个 ReferenceError
如果变量没有被声明。比如说。
typeof foo == "undefined" // true
foo === undefined // ReferenceError
然而,这是个不寻常的做法,而且一般来说没有什么用处。
由于javascript对特殊值的处理相当曲折,所以这两个测试并不等同。在具体的
undefined == null
是真的,但 typeof undefined
是 "undefined"
而 typeof null
是 "object"
.
这些特殊值的规则相当复杂,而且我认为是不合逻辑的,所以我认为没有 "一般规则"。你可能会发现一些常见的形式,例如
var value = obj.x || default_value;
如果你确定obj永远不会成为 undefined
或 null
(因为在这种情况下会抛出一个异常),并假设 0
, NaN
或一个空字符串应被视为没有提供任何值(因为它们都是 "逻辑上的假 "值)。而一个空数组或空javascript对象则被认为是 "逻辑上的真"。
为什么会这样呢?为什么 (null).x
抛出异常 null
根据 typeof
显然是一个对象,搜索对象中不存在的字段通常会返回 undefined
而不是?
我也不知道
我从来没有试图找到一个逻辑 在所有这些奇怪的规则。其实我也不是百分百确定有这样的逻辑。
我的建议只是研究和实验它们。
第二种比第一种更容易,更快。第一种需要额外的设置,定义未定义,并检查obj是否包含x作为一个属性或方法。
PS.: undefined将被评估为null,所以obj.x == undefined等同于obj.x == null。
测试条件性的最好方法是使用 obj.x
这将同时检查null-ability和undefined .
因此
if(!obj.x)
{
alert(obj.x);
}
else
{
alert("obj.x is null or undefined"); //obj.x is null or undefined or any false value which is what you want. like obj.x is false or 0
}
这两个条件的主要区别是类型的
该 类型 操作数用于获取操作数的数据类型(返回一个字符串)。操作数可以是一个文字,也可以是一个数据结构,如变量、函数或对象。操作符返回数据类型。
if (typeof obj.x === 'undefined') {
txt = "x is undefined";
} else {
txt = "x is defined";
}