我在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
然后我尝试使用未定义的属性。如果我使用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 :(得分:1)
当您检查"undefined"
(引号)时,您正在检查值为"undefined"
的字符串。
当您检查undefined
时,会检查属性或变量是否已定义。因此,您可以使用它来检查属性是否已定义。
答案 1 :(得分:1)
undefined
和"undefined"
是不同的值。前者是undefined
,后者是字符串。
您可能看到的不是x === "undefined"
和x === undefined
,而是typeof x === "undefined"
和x === undefined
。请注意typeof
。您看到前者(使用typeof
)的原因之一是历史性的,不再相关,但不是所有原因都是。
假设声明的标识符x
且undefined
未被阴影,这两个声明实际上是相同的,除了第一个必须多做几十个工作:
typeof x === "undefined"
x === undefined
但如果x
未声明,则前者将评估为true,后者将因ReferenceError而失败。 (在一般情况下,您可能想要 ReferenceError,因为它会提醒您未申报的标识符,但前者有用例。)
但遗憾的是,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
的可靠方法。几年前我检查了所有甚至是模糊的最近的浏览器,这不是一个问题(我怀疑它还没有那么久)。