Javascript 检查不存在的变量时控制流模式
我看到了以下模式,并尝试根据自己的使用情况进行调整:Javascript 检查不存在的变量时控制流模式,javascript,Javascript,我看到了以下模式,并尝试根据自己的使用情况进行调整: var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest; 简化: var request = window.ActiveXObject ? "is ActiveX" : "not ActiveX"; document.write(request + "<br>"); // I ge
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 request=window.ActiveXObject?
“是ActiveX”:“不是ActiveX”;
文件。写入(请求+“
”);
//我没有得到ActiveX(Chrome)
现在,当我尝试:
var notX = "x";
var j = x ? "has x" : "no x";
document.write(j + "<br>");
// console error: x is not defined
var notX=“x”;
var j=x?“has x”:“no x”;
文件。写(j+“
”);
//控制台错误:未定义x
没有输出任何内容。是什么使window.ActiveXObject
不同于x
,程序继续文档。写入,但在x
的情况下不写入
——更重要的是
我可以用什么样的健壮模式来替换上述内容?当您仅按原样使用未定义的变量来检查它时,这是一个错误。原始代码没有错误,因为它正在将其作为窗口
对象的属性进行访问;获取未定义的属性不是错误,而是导致JavaScript中的undefined
要检查变量,可以改用typeof
var j = typeof x !== 'undefined' ? "has x" : "no x";
变量和属性之间有很大的区别(即使变量始终是某个对象的属性;有时该对象没有名称,您无法直接访问它,例如调用函数时使用的变量绑定对象)。当您这样做时:
if (thingy.x) {
// ...
}
…你在查房子。如果属性不存在,那不是错误,只是返回的值是未定义的
相反,如果您这样做:
if (x) {
// ...
}
…您正在检查名为x
的变量。如果x
根本不存在,则这是一个错误(特别是ReferenceError
),因为符号x
是完全未定义的(而不是值为未定义的属性)
在处理全局变量时,这会变得有点模糊,因为全局变量是全局对象的属性,在浏览器中是window
。因此,如果你有:
var x;
…在全局范围内,if(x)
将起作用,if(window.x)
,因为x
是window
(全局对象)的属性。但是有一个很大的区别,如果x
没有定义,if(x)
将抛出一个错误,但是if(window.x)
将是错误的(因为表达式window.x
导致未定义的)
全局作用域是发生这种情况的唯一作用域,除非您使用with
语句(出于某些原因,我建议避免使用该语句)。(我并不总是同意Crockford的观点,事实上我可能会说这只是50%的事情,但他在和
方面有很多优点)
您可以可靠地将typeof
用于任何引用,即使是未定义的引用,因此:
if (typeof x !== "undefined") {
}
…即使在x
完全未定义的情况下仍然有效,因此这通常是检查是否存在某些内容的最佳方法。是,并且var j=window.x?“has x”:“no x”
将正常工作。感谢您提供的答案和变量模式。离题了,我想你的抽搐会随着网格线的出现而改善。我被空白处绊倒了。(使用铬)。令人印象深刻:)@Miadiorenzo:我会加上这些,谢谢你玩:)[不过我的抽搐脚趾实际上已经断了。我很惊讶你能得到它,我还以为服务器坏了…]谢谢你加上这些细节!我很难接受谁并选择了第一个答案。@Miadiorenzo:不用担心,很高兴这有帮助。