Traversing variable-length argument lists

from jquery ninja book

by dandoyon

HTML

<ul id="results"></ul>

CSS

#results li.pass { color: green; }
#results li.fail { color: red; }

JavaScript

function assert(value, desc) {
    var li = document.createElement("li");
    li.className = value ? "pass" : "fail";
    li.appendChild(document.createTextNode(desc));
    document.getElementById("results").appendChild(li);
}


function merge(root) {
    // notice starting at one, thus skipping 'root'
    for (var i = 1; i < arguments.length; i++) {
        for (var key in arguments[i]) {
            root[key] = arguments[i][key];
        }
    }
    return root;
}

var merged = merge({
    name: "Batou",
    bird: "Cockatoo"
}, {
    city: "Niihama",
    bird: "Parrot"
});
assert(merged.name == "Batou", "The original name is intact.");
assert(merged.city == "Niihama", "And the city has been copied over.");
assert(merged.bird == "Parrot", "Bird replaced");