คุณสามารถโคลนอาร์เรย์ด้วย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
คุณต้องถอดมันออกหลังจากที่คุณแก้ไขจุดบกพร่องเสร็จแล้ว