天在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);