1

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

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.ActiveXObject不同?xdocument.writex

- 更重要的是

我可以用什么强大的模式来代替上述模式?

4

2 回答 2

2

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

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

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

相反,如果你这样做:

if (x) {
    // ...
}

...您正在检查一个名为x. 如果根本x不存在,这是一个错误(特别是 a ),因为该符号是完全未定义的(而不是具有value的属性)。ReferenceErrorx undefined

当您处理全局变量时,这有点模糊,因为全局变量是window浏览器中的全局对象的属性。因此,如果您有:

var x;

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

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

您可以可靠地使用typeof任何参考,甚至是未定义的参考,因此:

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

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

于 2012-04-29T22:14:49.253 回答
1

当您仅按原样使用它来检查未定义的变量时,这是一个错误。原始代码没有错误,因为它将它作为对象的属性进行访问window;获取未定义的属性,而不是错误,会导致undefinedJavaScript。

要检查变量,您可以typeof改用。

var j = typeof x !== 'undefined' ? "has x" : "no x";
于 2012-04-29T22:11:15.893 回答