我有一个带有可变数量参数的JS对象。有没有办法看到在特定时间传递了哪些参数?
示例:
function getElement() {
var scope = document;
this.by = function(data){
if (data.id) scope = scope.getElementById(data.id);
if (data.tag) scope = scope.getElementsByTagName(data.tag);
return scope;
}
}
我这样运行
var x = new getElement();
vad div = x.by({id : "chosenID"});
获取ID为chosenID
或
var x = new getElement();
vad inputs = x.by({id : "chosenID", tag : "input"});
获取div中inputs
的所有chosenID
;
我想知道我是否传递了一个或两个参数,以及哪些参数。
谢谢!
ps:感谢您抽出时间帮助我,但请不要吝啬jQuery或其他JS框架,因为这仅用于学习目的。很多,索林。
答案 0 :(得分:5)
使用for … in
循环迭代传递的对象的参数,例如:
var prop;
for (prop in data) {
if (data.hasOwnProperty(prop)) {
// do something with data[prop]
}
}
不要忘记使用hasOwnProperty
检查酒店。
答案 1 :(得分:1)
使用对象迭代(key in data
)和数组合...你可以返回许多元素......尽管switch语句使对象迭代变得无用。
function getElement() {
var scope = document;
this.by = function(data){
var key;
var ret=[];
for (key in data) {
if(data.hasOwnProperty(key)) {
switch(key) {
case "id":
ret=ret.concat(scope.getElementById(data[key]));
break;
case "tag":
ret=ret.concat(scope.getElementsByTagName(data[key]));
break;
default:
throw new Error("Unknown property "+key);
}
}
}
return ret;
};
}
答案 2 :(得分:1)
有很多好的一般答案,但请考虑一下:
相反,我将介绍一些具体案例。 首先,我通常从:
开始function f (x) {
x = x || {} // so f() will be accepted as per f({})
...
}
这也为以下内容设置了上下文。
我的正常方法是检查真值y值。真值表示“提供”。然而,这具有不将0或''视为“提供”的缺点。
if (x.id) {
// x.id is any truth-y
}
如果0是接受的输入,那么我加宽了检查,以便将非undefined
值视为“提供”。未设置的属性始终默认为undefined
。 (此方法将接受所有真值y和false-y值,例如0,“”和null
)。
if (x.id !== undefined) {
// x.id is all truth-y and all-but-undefined false-y
}
如果undefined
是可接受的输入(我强烈反对),则检查可以基于hasOwnProperty
。这样做的好处是不会检查[[prototype]]
链。
if (x.hasOwnProperty("id")) {
// x.id set to something, including undefined
}
for(..in..)
构造也可用于迭代对象中的属性(包括[[prototype]]
中的属性,除非它们被特别隐藏)。但是,对于处理输入的一般情况(例如,不创建JSON库),我发现它只是简单而干净,只是为了在上述方法之一中处理输入对象的属性。