Вы можете клонировать массив с помощью 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
s, вы должны удалить их после завершения отладки.