考虑以下代码:
var a = {
b: {
c: true
},
d: {
e: false
}
};
function toggle() {
var prop='';
for (var i = 0; i<arguments.length; i++) {
prop += '.' + arguments[i];
}
eval('a'+prop+"=!a"+prop);
}
toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('b', 'c');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
toggle('d', 'e');
console.log('a.b.c : ', a.b.c);
console.log('a.d.e : ', a.d.e);
调用toggle('b', 'c')
或toggle('d', 'e')
将分别翻转a.b.c
或a.d.e
的布尔值。
在这里使用eval
是否有任何不足之处,除了eval
是邪恶的(当然,这不是:))?
如果是这样,还有什么选择?
答案 0 :(得分:3)
您可以使用数组表示法来访问属性,而不是使用点表示法。
function toggle() {
var obj = a;
for (var i = 0; i<arguments.length-1; i++) {
obj = obj[arguments[i]];
}
obj[arguments[i]] = !obj[arguments[i]];
}