天在join(“”)一个Array的时候遇到一个问题:
当Array中还有Array的时候,嵌套的Array仍然会用逗号连接,而不是指定的空字符。比如
[1,[2,3],4].join("")
的结果是12,34
这不是我想要的。我希望得到1234
首先想到的解决办法就是递归遍历数组,如果元素是数组则对其调用join(“”)。
然后转念一想,递归调用的过程就是Array.prototype.join
本身啊。我只需改写Array.prototype.toString
就OK了
这是第一个版本:其问题是,如果忘记调用restore或连续调用两次Bakup就完蛋了。
var Bakup = (function(G) {
var old = null;
return function(who, name, to) {
old = who.prototype[name];
who.prototype[name] = to;
arguments.callee.restore = function() {
who.prototype[name] = old;
};
};
})();
var tag = ["<", "a ", ["href", "=\"", "http://localhost", "\""], ">"];
Bakup(Array, "toString", function() {
return this.join("");
});
print(tag);
Bakup.restore();
print(tag);
Bakup(Array, "toString", function() {
return this.join("-");
});
print(tag);
Bakup.restore();
print(tag);
这是第二个版本:
function Bakup(who, name, to, callback) {
var old = who.prototype[name];
who.prototype[name] = to;
callback();
who.prototype[name] = old
}
var tag = ["<", "a ", ["href", "=\"", "http://localhost", "\""], ">"];
Bakup(Array, "toString", function() {
return this.join("");
}, function() {
print(tag);
});
print(tag);
Bakup(Array, "toString", function() {
return this.join("-");
}, function() {
print(tag);
});
print(tag);
