单线检查对象及其方法是不是都已定义[重复]

Posted

技术标签:

【中文标题】单线检查对象及其方法是不是都已定义[重复]【英文标题】:One-liner to check if object and its method are both defined [duplicate]单线检查对象及其方法是否都已定义[重复] 【发布时间】:2012-10-25 06:55:38 【问题描述】:

可能重复:In javascript, test for property deeply nested in object graph?

我只想在 obj.method1.mthod2 为真时运行此代码块。 但是当 obj 本身未定义时,可能会出现这种情况。或 method1 未定义。

if (obj.method1.method2) 


那么我应该这样做吗?

if (typeof(obj)!="undefined" && typeof(obj.method1)!="undefined" && typeof(obj.method1.method2)!="undefined" && obj.method1.method2) 


看起来很丑!有什么办法可以缩短吗? 我已经看到了这个Detecting an undefined object property 链接,但它没有帮助。

【问题讨论】:

typeof 不需要括号,因为它是运算符而不是函数,因此每次使用时都会为您节省一个字符。 (例如,if (typeof obj!="undefined")。) In javascript, test for property deeply nested in object graph? 和 Shorthand function for checking whether a property exists 和其他人的可能重复。 【参考方案1】:

我通常是这样写的:

if (typeof(obj) != "undefined" && obj.method1 && obj.method1.method2)
    // The magic

不过,我主要使用函数来执行此操作,因为我很确定某些原始类型的实例会评估为 false,即使它们不是未定义的。

edit:正如 lanzz 在评论中指出的那样,obj 需要一个 typeof。

【讨论】:

在 Chrome 中引用未定义的 obj 会抛出 ReferenceError: obj is not defined 好。每个 IF 语句至少只有一种 typeof :) 不应该是typeof(obj) !== "undefined"吗?【参考方案2】:

更简洁:

  if (obj && obj.method1 && obj.method1.method2) 
    ...
  

【讨论】:

【参考方案3】:

试试try

try 
    if(obj.method1.method2) 
         alert("ok!");
    
catch(e) 
    alert("obj or some property not defined");

【讨论】:

以上是关于单线检查对象及其方法是不是都已定义[重复]的主要内容,如果未能解决你的问题,请参考以下文章

即使未定义,也检查嵌套键是不是存在[重复]

JS检查深层对象属性是不是存在[重复]

检查元素是不是是javascript中的对象[重复]

检查未知对象中的对象是不是存在的最有效的Javascript方法[重复]

检查自定义类列表中是不是存在变量[重复]

Python:检查范围内是不是存在对象[重复]