1

次のコードを検討してください。

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')orを呼び出すと、 ortoggle('d', 'e')のブール値がそれぞれ反転します。a.b.ca.d.e

eval悪であること以外に、ここで使用することの欠点はありますかeval(もちろん、そうではありません:))?

もしそうなら、代替手段は何ですか?

4

1 に答える 1

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]];
}
于 2013-07-29T18:54:42.920 に答える