我先从代码开始:var s = [\'hi\'];console.log(s);s[0] = \'bye\';console.log(s);很简单,对吧?响应此代码,Firefox 控制台显示:[ \'hi\' ][ “...
我将从代码开始:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
很简单,对吧?Firefox 控制台响应此消息并显示:
[ "hi" ]
[ "bye" ]
太棒了,但是 Chrome 的 JavaScript 控制台(7.0.517.41 beta)显示:
[ "bye" ]
[ "bye" ]
是我做错了什么吗,还是 Chrome 的 JavaScript 控制台在评估我的数组时特别懒惰?
您可以使用以下方法克隆数组 Array#slice
:
console.log(s); // ["bye"], i.e. incorrect
console.log(s.slice()); // ["hi"], i.e. correct
您可以使用不存在此问题的函数 console.log
如下:
console.logShallowCopy = function () {
function slicedIfArray(arg) {
return Array.isArray(arg) ? arg.slice() : arg;
}
var argsSnapshot = Array.prototype.map.call(arguments, slicedIfArray);
return console.log.apply(console, argsSnapshot);
};
不幸的是,对于对象的情况,最好的方法似乎是先使用非 WebKit 浏览器进行调试,或者编写一个复杂的函数进行克隆。如果您只处理简单对象,其中键的顺序无关紧要,并且没有函数,您可以随时执行以下操作:
console.logSanitizedCopy = function () {
var args = Array.prototype.slice.call(arguments);
var sanitizedArgs = JSON.parse(JSON.stringify(args));
return console.log.apply(console, sanitizedArgs);
};
所有这些方法显然都非常慢,因此与正常方法相比 console.log
,您必须在调试完成后将其剥离。