Javascript未定义条件

问题描述 投票:6回答:6

谁能给我解释一下这两者之间的区别?if(obj.x == undefined)if(typeof obj.x == 'undefined')

在某些情况下,第一种方式可以正常工作,但在其他情况下,我需要使用第二种方式。

疑问

1-这两种情况有什么区别?

2 - 有什么最佳实践吗?

javascript
6个回答
7
投票

最好的做法是不要只检查 真实性严格平等

例子

if (obj.x === undefined) {}

这曾经是一个问题,因为 undefined (一个全局属性)使用是可写的,从1.8.5开始是不可写的,为您在ES5规范环境中提供安全的比较。

MDN


1
投票

如果你把等价运算符换成了 == 与严格的平等运算符 ===. 所以... obj.x === undefinedtypeof obj.x == "undefined" 通常是等价的。

然而,在ECMAScript 5之前的环境中(一般来说,这仍然是大多数的web请求)。undefined 是全局对象的一个可写属性,这意味着 undefined 可以被用作变量名,或者全局属性可以被分配一个不同的值。ECMAScript 5使全局属性成为只读,但即使如此。undefined 仍然可以在函数中作为变量名使用,这意味着 typeof 检查总是比较安全的。

还有一点支持 typeof 因为它可以用来检查一个可能没有被声明的变量,而直接比较会抛出一个 ReferenceError 如果变量没有被声明。比如说。

typeof foo == "undefined" // true
foo === undefined // ReferenceError

然而,这是个不寻常的做法,而且一般来说没有什么用处。


1
投票

由于javascript对特殊值的处理相当曲折,所以这两个测试并不等同。在具体的

undefined == null

是真的,但 typeof undefined"undefined"typeof null"object".

这些特殊值的规则相当复杂,而且我认为是不合逻辑的,所以我认为没有 "一般规则"。你可能会发现一些常见的形式,例如

var value = obj.x || default_value;

如果你确定obj永远不会成为 undefinednull (因为在这种情况下会抛出一个异常),并假设 0, NaN 或一个空字符串应被视为没有提供任何值(因为它们都是 "逻辑上的假 "值)。而一个空数组或空javascript对象则被认为是 "逻辑上的真"。

为什么会这样呢?为什么 (null).x 抛出异常 null 根据 typeof 显然是一个对象,搜索对象中不存在的字段通常会返回 undefined 而不是?

我也不知道

我从来没有试图找到一个逻辑 在所有这些奇怪的规则。其实我也不是百分百确定有这样的逻辑。

我的建议只是研究和实验它们。


0
投票

第二种比第一种更容易,更快。第一种需要额外的设置,定义未定义,并检查obj是否包含x作为一个属性或方法。

PS.: undefined将被评估为null,所以obj.x == undefined等同于obj.x == null。


0
投票

测试条件性的最好方法是使用 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
}

0
投票

这两个条件的主要区别是类型的

类型 操作数用于获取操作数的数据类型(返回一个字符串)。操作数可以是一个文字,也可以是一个数据结构,如变量、函数或对象。操作符返回数据类型。

if (typeof obj.x === 'undefined') {
    txt = "x is undefined";
  } else {
    txt = "x is defined";
  }
© www.soinside.com 2019 - 2024. All rights reserved.