检查JavaScript中是否存在对象


313

如何验证JavaScript中是否存在对象?

以下作品:

if (!null)
   alert("GOT HERE");

但这会引发错误:

if (!maybeObject)
   alert("GOT HERE");

错误:

maybeObject 没有定义。

Answers:


578

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

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

因此

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

73
如果它始终是字符串,则您确实可以(应该)!==进行比较。
米卡

9
由于这是Javascript的核心功能,因此没有更好且更少出错的内置组件是可耻的。字符串比较可防止编译器100%可靠地告诉我们,当我们在此类检查中犯了小错误(如拼写错误)时。

就我而言,即时通讯正在寻找该对象,所以这没有帮助。我想要一个可以在控制台中用作解决方案的解决方案,以查看对象是否在domtree中是否没有任何咔嗒
声。.– blamb

@TJCrowder这些示例似乎不再可用。
Stefan van den Akker,

1
@StefanvandenAkker:错误示例的链接应该是jsbin.com/ibeho3/1。很好的例子很好:jsbin.com/ibeho3/2。(可悲的是,JSBin重定向到了最新版本,并且人们一直在对其进行编辑,以使其达到其生命的一英寸之内。)
TJ Crowder

48

这里有很多真相,所以我想我把一些事情弄清楚了。

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

原因是Javascript具有如此臭名昭著的价值,undefined其惊人的含义并不意味着未定义变量或变量不存在。undefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

因此,一个存在的变量和另一个不存在的变量都无法报告undefined 类型。

至于@Kevin的误解,null == undefined。这是由于类型强制导致的,这是Crockford不断告诉每个不确定此类事情的人始终使用严格的相等运算符===来测试可能为假的值的主要原因。null !== undefined给您您可能期望的。另请注意,这foo != null可能是检查变量既不是undefined也不是的有效方法null。当然,您可以明确一些,因为这可能有助于提高可读性。

如果将问题限制为检查对象是否存在,则typeof o == "object"可能是一个好主意,除非您不考虑数组对象,因为据报道这也是其类型object,可能会使您有些困惑。更何况这typeof null也会给您object带来根本的错误。

太极区,您真的应该小心typeofundefinednullunknown等misteries是主机对象。他们不能被信任。他们几乎可以随意做任何他们想做的肮脏的事情。因此,请小心使用它们,如果可以的话,请检查其功能,因为这是使用甚至不存在的功能的唯一安全方法。


5
foo!=null如果foo未定义,仅执行此操作将产生ReferenceError 。因此,最好使用typeof,除非您打算捕获异常。
日,日本

1
我再次为您写下:undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null'。我没有说过!= null检查它是否存在。您将其与上下文无关。(我也提到过,这只是一个旁注,与OP的问题并不严格相关)
gblazex 2010年

2
您再次将未定义的术语与type混淆undefined。他们不一样。(note) it can be used !== you should use。阅读时使用常识。当声明了变量(参数列表或其他地方)并且您想检查它是否有值时,!=null是完全安全的。这是与OP要求不同的用例,这就是为什么我将其引入注释的原因。整个段落是关于@Kevin的帖子和类型强制btw。如您所见,请仔细阅读。
gblazex

@JAL 当您知道已经声明了变量时,就缺少了不会冒错误风险的部分!= null。这对于检查函数参数非常有用,请考虑:var hasValue = function(foo) {return foo != null}
tybro0103 2013年

@ tybro0103是正确的,但是整个问题是“如何验证JavaScript中对象的存在?”。如果您确定已经声明,那就是另一种情况。
2013年

12

您可以使用:

if (typeof objectName == 'object') {
    //do something
}

8

两种方式。

局部变量的typeof

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

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

全局变量的窗口

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

if (window.FormData) {}



4

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

maybeObject ? console.log(maybeObject.id) : ""

是的,有些类似的东西,var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;然后检查是否false
Hmerman6006

3

我曾经if(maybeObject)在我的JavaScript中只做一个空检查。

if(maybeObject){
    alert("GOT HERE");
}

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

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


问题是,如果未声明maybeObject,它将引发错误: 可能未定义对象
Juanma Menendez,

如果maybeObject0, 0.0, or "",它将检查为假
alejandrociatti

3

我刚刚从上面测试了typeOf示例,但没有一个适合我,因此我使用了以下示例:

    btnAdd = document.getElementById("elementNotLoadedYet");
    if (btnAdd) {
       btnAdd.textContent = "Some text here";
    } else {
      alert("not detected!");
    }


1

除了检查对象/变量的存在之外,您可能还想提供“最坏情况”输出,或者至少将其捕获到警报中,以免引起注意。

检查,提供替代方法并捕获错误的函数示例。

function fillForm(obj) {
  try {
    var output;
    output = (typeof obj !== 'undefined') ? obj : '';
    return (output);
  } 
  catch (err) {
    // If an error was thrown, sent it as an alert
    // to help with debugging any problems
    alert(err.toString());
    // If the obj doesn't exist or it's empty 
    // I want to fill the form with ""
    return ('');
  } // catch End
} // fillForm End

我之所以创建它也是因为,如果xm不存在,我传递给它的对象可能是x,xm,xm [z]和typeof xm [z]会因错误而失败。

希望对您有所帮助。(顺便说一句,我是JS新手)


1

对我来说,这适用于DOM对象:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}

1

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

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

如果您关心它的实际值,则应添加:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}

typeof( null ) == "object"

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

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 

这样,您可以检查它是否不是nullundefined,并且typeof如果值不存在加上&&短路也不会出错,那么您将永远不会遇到运行时错误。

就个人而言,我建议在某处添加一个辅助函数fn(并且不要信任typeof()):

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

if( exists( maybeObject ) ){
    alert("Got here!"); 
}

0
if (n === Object(n)) {
   // code
}

5
尽管此代码块可以回答OP的问题,但如果您解释此代码与问题中的代码有何不同,更改的内容,更改的原因以及解决问题的原因,那么此答案将更加有用。不介绍其他人。
Mifeet 2015年


-1

使用div alignmnt选项卡式面板将Textbox值设置为一帧以内联框架。因此,首先,在设置该值之前,我们需要使用以下代码检查选定的选项卡式面板框架是否可用:

JavaScript代码:

/////////////////////////////////////////
<script>

function set_TextID()
            {
                try
                    {
                        if(!parent.frames["entry"])
                            {
                            alert("Frame object not found");    
                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["entry"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["education"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["education"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["contact"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["contact"].document.getElementById("form_id").value=setText;
                            }

                        }catch(exception){}
                }

</script>

-1

0和null是隐式指针。如果您不进行算术运算,比较或在屏幕上打印“ 0”,则无需实际输入。其隐式。如暗示。出于相同的原因,也不需要Typeof。看。

if(obj)console.log(“ exists”);

我没有看到不要求的请求,否则就没有包含。我非常喜欢多余的内容,这些内容都不适合这个问题。让我们保持简单。


我看到的不是问题:if (!maybeObject)-但实际上,标题要求相反。
阿玛利

-4

认为这样最简单

if(myobject_or_myvar)
    alert('it exists');
else
   alert("what the hell you'll talking about");

-10

或者,您所有人都可以改用我的独占存在()方法,并能够执行被认为不可能的事情。即:

事情是这样:exists("blabla")或甚至: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")也可以...


4
那方法在哪里呢?
v010dya,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.