gpt4 book ai didi

javascript - 检查不存在的变量时控制流模式

转载 作者:行者123 更新时间:2023-11-30 13:20:31 27 4
gpt4 key购买 nike

我看到了以下模式并尝试将其改编为我自己的用途:

var request = window.ActiveXObject ?
new ActiveXObject('Microsoft.XMLHTTP') :
new XMLHttpRequest;

简化:

var request = window.ActiveXObject ?
"is ActiveX" : "not ActiveX";
document.write(request + "<br>");
// I get not ActiveX (Chrome)

现在当我尝试时:

var notX = "x"; 
var j = x ? "has x" : "no x";
document.write(j + "<br>");
// console error: x is not defined

http://jsfiddle.net/4mn8n/1/

没有输出。 window.ActiveXObjectx 的不同之处在于程序继续 document.write 而不是 x >?

-- 更重要的是

我可以使用什么稳健的模式来替换上述内容?

最佳答案

变量和属性之间有很大的区别(即使变量总是某些对象的属性;有时该对象没有名称,您无法直接访问它,例如调用函数时使用的变量绑定(bind)对象)。当你这样做时:

if (thingy.x) {
// ...
}

...您正在检查一个属性。如果该属性不存在,则不是错误,只是您返回的值为 undefined

相反,如果你这样做:

if (x) {
// ...
}

...您正在检查名为 x变量。如果 x 根本不存在,这是一个错误(特别是 ReferenceError),因为符号x 是完全未定义的(与具有 undefined 的属性相反)。

当你处理全局变量时,这会变得有点模糊,因为全局变量是全局对象的属性,在浏览器中是 window。所以如果你有:

var x;

...在全局范围内,if (x) 将起作用,if (window.x) 也会起作用,因为 xwindow(全局对象)的属性。但是有很大的不同,如果 x 没有定义,if (x) 会抛出一个错误,但是 if (window .x) 将为假(因为表达式 window.x 导致 undefined)。

全局范围是唯一发生这种情况的范围,除非您使用 with 语句(我建议避免使用,原因是 Crockford discusses here )。 (我并不总是同意 Crockford 的观点,事实上我可能会说这只是 50% 的事情,但他对 with 有很好的看法。)

您可以可靠地对任何引用使用typeof,即使是 undefined reference ,所以:

if (typeof x !== "undefined") {
}

...即使 x 完全未定义也能正常工作,因此这通常是检查是否存在某物的最佳方式。

关于javascript - 检查不存在的变量时控制流模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com