2017-12-18 225 views
0

我遇到undefined"undefined"之间的这种差异,我试图理解它。检查对象属性时与undefined或“undefined”进行比较。有什么不同?

我正在检查对象中的属性是否已定义。 在第一个例子中,我检查属性是否未定义。以下所有测试评估为真。无论我使用的是"undefined"还是undefined

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.x != "undefined") console.log('test.x != "undefined"'); //TRUE 
 
if (test.x !== "undefined") console.log('test.x !== "undefined"'); //TRUE 
 
if (test.x != undefined) console.log('test.x != undefined'); //TRUE 
 
if (test.x !== undefined) console.log('test.x !== undefined'); //TRUE

然后我用这不仅defined.It计算结果为真,如果我使用undefined(不是字符串文本)或typeof财产尝试过。

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.z === undefined) console.log("test.z === undefined"); //TRUE 
 
if (test.z == undefined) console.log("test.z == undefined"); //TRUE 
 
if (test.z === "undefined") console.log("test.z === 'undefined'"); //FALSE 
 
if (test.z == "undefined") console.log("test.z == 'undefined'"); //FALSE 
 
if (typeof test.z === "undefined") console.log("typeof test.z === 'undefined'"); //TRUE

所以我的问题是:为什么差别(我想我不明白的东西......)。我使用比较“undefined”/ undefined而不是.hasOwnProperty()这是不好的做法吗?

+0

这取决于你想要检查的内容。大多数时候,你可以简单地使用像这样的东西:'if(test.x){...}'或'if(!text.z){...}'。这些类型的条件检查很多东西,例如'undefined',* empty string *,'0','null','false'。 – Titus

+0

@Titus:我不想检查它是否存在;下一阶段是switch(),具体取决于属性。 –

+1

在这种情况下,你可以直接写'switch'语句,不需要先检查。 – Titus

回答

1

undefined"undefined"是不同的值。前者是undefined,后者是字符串。

你可能看到的不是x === "undefined"x === undefined,而是typeof x === "undefined"x === undefined。请注意0​​。你看到前者的原因之一(与typeof)是历史性的,不再相关,但不是所有的原因。

假设声明标识符xundefined一直没有阴影,这两种说法实际上是相同的以外的第一个必须做一个却有点更多的工作:

typeof x === "undefined" 
x === undefined 

但如果x不是声明,前者将评估为真,而后者将失败并出现ReferenceError。 (在一般情况下,你可能的的ReferenceError,因为它提醒您未申报idenfier,但也有使用案例前者。)

undefined不幸的是,不是关键字(如null);这是一个全球常数。这意味着,undefined可以阴影

function foo(undefined) { 
 
    var x; // x defaults to the value undefined 
 
    console.log(typeof x === "undefined"); // true 
 
    console.log(x === undefined);   // false?!?! 
 
} 
 
foo(42);

在实践中,如果你发现有人阴影undefined,并给予它比undefined以外的值,带他们出去回来,对击败他们用湿面条直到他们看到感觉为止。但是...

从历史上看,很多年前在一个窗口中undefined的值不是===undefined的值。因此,如果您的代码可能是跨窗口处理的,则与=== undefined进行比较并不是检查undefined的可靠方法。几年前,我查看了所有甚至是最近的浏览器,这不是一个问题(我怀疑它并没有比这更长的时间)。

1

当您检查"undefined"(用引号括起)时,您正在检查值为"undefined"的字符串。

鉴于当您检查undefined然后检查属性或变量是否定义。因此,您可以使用它来检查属性是否已定义。