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