检查JavaScript中是否存在对象

Yar*_*rin 296 javascript variables debugging null undefined

如何在JavaScript中验证对象的存在?

以下作品:

if (!null)
   alert("GOT HERE");
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

if (!maybeObject)
   alert("GOT HERE");
Run Code Online (Sandbox Code Playgroud)

错误:

maybeObject 没有定义.

JAL*_*JAL 548

您可以安全地typeof在未定义的变量上使用运算符.

如果已为其分配任何值(包括null),则typeof将返回undefined以外的值.typeof总是返回一个字符串.

因此

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}
Run Code Online (Sandbox Code Playgroud)

  • 如果它总是一个字符串,你真的可以(应该)做`!==`进行比较. (64认同)
  • 由于这是一个核心的Javascript功能,所以很遗憾没有更好的,更不容易出错的内置功能.字符串比较可以防止编译器100%可靠地告诉我们何时在这些类型的检查中犯了一个小错误(如拼写错误). (7认同)

gbl*_*zex 45

这里有很多半真半假的事情,所以我觉得我做的事情更清楚了.

实际上,您无法准确判断变量是否存在(除非您希望将每一行包装到try-catch块中).

原因是Javascript有这个臭名昭着的价值,undefined这并不意味着变量没有定义,或者它不存在undefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)
Run Code Online (Sandbox Code Playgroud)

因此,存在的变量和不存在的变量都可以向您报告undefined 类型.

至于@凯文的误解,null == undefined.这是由于类型强制,这是Crockford一直告诉每个不确定这种事情的人总是使用严格的相等运算符===来测试可能的假值的主要原因.null !== undefined给你你所期望的.另请注意,foo != null可以检查一个变量既不是一种有效的方法undefined,也没有null.当然,你可以是明确的,因为它可能有助于提高可读性.

如果你限制问题来检查一个对象是否存在,typeof o == "object"可能是个好主意,除非你不考虑数组对象,因为这也会报告这种类型object可能会让你有点困惑.更不用说那typeof null也会给你object哪个是错的.

太极区,您真的应该小心typeof,undefined,null,unknown等misteries是主机对象.他们不可信任.他们可以自由地做任何他们想要的脏东西.所以要小心它们,如果可以的话检查功能,因为它是使用甚至可能不存在的功能的唯一安全方式.

  • 如果没有定义`foo`,那么简单地执行`foo!= null`将产生一个ReferenceError.因此,除非您计划捕获异常,否则最好使用`typeof`. (5认同)
  • 您再次将未定义的术语与"未定义"类型混淆.他们不一样.`(注意)它可以使用!==你应该使用`.阅读时要运用常识.当声明变量(参数列表或其他地方)并且你想检查它是否有值时,`!=`null是完全安全的.这是一个与OP要求不同的用例,这就是为什么我把它作为一个注释引入它的原因.整段是关于@Kevin的帖子和类型强制btw.如果你仔细阅读,你会注意到. (2认同)

Cal*_*vin 12

您可以使用:

if (typeof objectName == 'object') {
    //do something
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*bak 7

如果这是一个全局对象,您可以使用 if (!window.maybeObject)

  • 我发现如果它是全局对象,则 `window.hasOwnProperty('maybeObject')` 更具可读性 (2认同)

sup*_*ary 7

两种方式.

typeof用于局部变量

您可以使用typeof测试本地对象:

if (typeof object !== "undefined") {}
Run Code Online (Sandbox Code Playgroud)

全局变量的窗口

您可以通过检查窗口对象来测试全局对象(在全局范围上定义的对象):

if (window.FormData) {}
Run Code Online (Sandbox Code Playgroud)


ale*_*tti 7

如果您只关心它的存在(是否已声明?),则批准的答案就足够了:

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}
Run Code Online (Sandbox Code Playgroud)

如果您关心它是否具有实际价值,您应该添加:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}
Run Code Online (Sandbox Code Playgroud)

作为typeof( null ) == "object"

例如bar = { x: 1, y: 2, z: null}

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以检查它是否不是nullor undefined,并且由于typeof如果值不存在并且&&短路也不会出错,因此您永远不会收到运行时错误。

就我个人而言,我建议在某处添加一个助手 fn (我们不要信任typeof()):

function exists(data){
   data !== null && data !== undefined
}

if( exists( maybeObject ) ){
    alert("Got here!"); 
}
Run Code Online (Sandbox Code Playgroud)


Rus*_*sti 5

您可以使用“ typeof”。

if(typeof maybeObject != "undefined")
    alert("GOT HERE");
Run Code Online (Sandbox Code Playgroud)


小智 5

我曾经if(maybeObject)在我的javascripts中做空检查。

if(maybeObject){
    alert("GOT HERE");
}
Run Code Online (Sandbox Code Playgroud)

所以只有当maybeObject- 是一个对象时,才会显示警报。我的网站上有一个例子。

https://sites.google.com/site/javaerrorsandsolutions/home/javascript-dynamic-checkboxes


Gre*_*lst 5

该线程很久以前就被打开了。我认为同时使用三元运算符是最简单的选择:

maybeObject ? console.log(maybeObject.id) : ""
Run Code Online (Sandbox Code Playgroud)