Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查不存在的变量时控制流模式_Javascript - Fatal编程技术网

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:不用担心,很高兴这有帮助。