javascript:检查几个特定对象属性是否存在(也在coffeescript中)

javascript:检查几个特定对象属性是否存在(也在coffeescript中),javascript,object,if-statement,properties,coffeescript,Javascript,Object,If Statement,Properties,Coffeescript,我需要检查对象中是否存在多个特定属性。为此,我有两个问题: 我通常应该如何检查JavaScript中的几个现有属性 在CoffeeScript中有没有一个捷径可以优雅地实现这一点 我的javascript解决方案是: if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff(); 在不短的咖啡脚本中: if obj and obj.pOne and obj.pTwo and obj.pThree

我需要检查对象中是否存在多个特定属性。为此,我有两个问题:

  • 我通常应该如何检查JavaScript中的几个现有属性
  • 在CoffeeScript中有没有一个捷径可以优雅地实现这一点
  • 我的javascript解决方案是:

    if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff();
    
    在不短的咖啡脚本中:

    if obj and obj.pOne and obj.pTwo and obj.pThree then doStuff()
    
    不要被误导,这是行不通的:

    然后我在中遇到了if子句的
    操作符(我从来没有在这样的检查中使用过)。这是实现我想要的目标的正确方法吗?
    或者这是一种禁忌,或者有更好/更干净的解决方案吗

    我的代码将如下所示:

    if(obj && ('pOne' && 'pTwo' && 'pThree' in obj)) doStuff();
    
    if obj and ('pOne' and 'pTwo' and 'pThree' of obj) then doStuff()
    
    咖啡剧本是这样的:

    if(obj && ('pOne' && 'pTwo' && 'pThree' in obj)) doStuff();
    
    if obj and ('pOne' and 'pTwo' and 'pThree' of obj) then doStuff()
    

    车载电话中的电话与
    车载电话不同。例如,对于
    obj={a:0}
    ,obj
    中的
    a是
    true
    ,但是
    obj.a
    是假的

    ('pOne'&&&'pTwo'&&&&pThree'在obj中)
    并不是你所想的意思;它的计算结果为
    ('pOne'&&&'pTwo'&&('pThree')
    ,这与
    true&&true&&('pThree'在obj中)
    相同

    虽然冗长,但如果您想了解伪值和不存在的键之间的差异,这仍然是最好的方法:

    if (obj && 'pOne' in obj && 'pTwo' in obj && 'pThree' in obj)
    

    如果您认为属性可能会被继承,那么使用
    obj.hasOwnProperty('pOne')
    而不是obj
    中的
    'pOne'更好。

    obj中的pOne
    obj.pOne
    不同。例如,对于
    obj={a:0}
    ,obj
    中的
    a是
    true
    ,但是
    obj.a
    是假的

    ('pOne'&&&'pTwo'&&&&pThree'在obj中)
    并不是你所想的意思;它的计算结果为
    ('pOne'&&&'pTwo'&&('pThree')
    ,这与
    true&&true&&('pThree'在obj中)
    相同

    虽然冗长,但如果您想了解伪值和不存在的键之间的差异,这仍然是最好的方法:

    if (obj && 'pOne' in obj && 'pTwo' in obj && 'pThree' in obj)
    

    如果您认为属性可能会被继承,那么在obj
    中使用
    obj.hasOwnProperty('pOne')
    而不是
    'pOne'更好。

    您的第一行就是您想要的。事实上,这没什么问题。如果你认为在调用函数之前需要检查4件事,也许会考虑写不同的函数。
    if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff();
    
    见此:

    PS。你最后的例子是不好的,没有评估的方式,你认为他们做


    考虑重写函数,使其更易于使用

    var doStuff = function(obj) {
      obj        = obj        || {};
      obj.pOne   = obj.pOne   || "pOneDefault";
      obj.pTwo   = obj.pTwo   || "pTwoDefault";
      obj.pThree = obj.pThree || "pThreeDefault";
    
      console.log(obj);
    };
    
    doStuff();
    // {pOne: "pOneDefault", pTwo: "pTwoDefault", pThree: "pThreeDefault"}
    
    doStuff({pOne: "foo"});
    // {pOne: "foo", pTwo: "pTwoDefault", pThree: "pThreeDefault"}
    
    doStuff({pTwo: "bar"});
    // {pTwo: "bar", pOne: "pOneDefault", pThree: "pThreeDefault"}
    
    doStuff({pTwo: "hello", pThree: "world"});
    // {pTwo: "hello", pThree: "world", pOne: "pOneDefault"}
    

    你的第一行就是你想要的。事实上,这没什么问题。如果你认为在调用函数之前需要检查4件事,也许会考虑写不同的函数。
    if(obj && obj.pOne && obj.pTwo && obj.pThree) doStuff();
    
    见此:

    PS。你最后的例子是不好的,没有评估的方式,你认为他们做


    考虑重写函数,使其更易于使用

    var doStuff = function(obj) {
      obj        = obj        || {};
      obj.pOne   = obj.pOne   || "pOneDefault";
      obj.pTwo   = obj.pTwo   || "pTwoDefault";
      obj.pThree = obj.pThree || "pThreeDefault";
    
      console.log(obj);
    };
    
    doStuff();
    // {pOne: "pOneDefault", pTwo: "pTwoDefault", pThree: "pThreeDefault"}
    
    doStuff({pOne: "foo"});
    // {pOne: "foo", pTwo: "pTwoDefault", pThree: "pThreeDefault"}
    
    doStuff({pTwo: "bar"});
    // {pTwo: "bar", pOne: "pOneDefault", pThree: "pThreeDefault"}
    
    doStuff({pTwo: "hello", pThree: "world"});
    // {pTwo: "hello", pThree: "world", pOne: "pOneDefault"}
    

    !!!不要复制我的第二个建议,将
    in
    运算符与
    &
    串联一起使用!!!我刚刚发现,在
    中使用
    的上述解决方案根本无法实现我想要的目标!它只检查最后一个属性,因为这是
    &&
    串联的结果。我早该知道的。。。看来我必须坚持第一个解决方案,对吧?!!!不要复制我的第二个建议,将
    in
    运算符与
    &
    串联一起使用!!!我刚刚发现,在
    中使用
    的上述解决方案根本无法实现我想要的目标!它只检查最后一个属性,因为这是
    &&
    串联的结果。我早该知道的。。。似乎我必须坚持第一种解决方案,对吗?我同意防御性编程文章,但它不适用于这里,因为我收到的对象是用户解析的配置文件。我进行检查,通知他是否定义了所有必要的属性,或者停止程序的执行。我同意防御性编程文章,但它不适用于这里,因为我收到的对象是来自用户的解析配置文件。我做这些检查是为了通知他是否定义了所有必要的属性,还是停止程序的执行。