Bạn có thể sao chép một mảng với Array#slice
:
console.log(s); // ["bye"], i.e. incorrect
console.log(s.slice()); // ["hi"], i.e. correct
Một chức năng mà bạn có thể sử dụng thay vì console.log
rằng không có vấn đề này như sau:
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);
};
Đối với trường hợp của các đối tượng, thật không may, phương pháp tốt nhất dường như là để gỡ lỗi đầu tiên với một trình duyệt không phải WebKit, hoặc để viết một chức năng phức tạp để sao chép. Nếu bạn chỉ làm việc với các đối tượng đơn giản, nơi để các phím không quan trọng và không có chức năng này, bạn luôn có thể làm:
console.logSanitizedCopy = function() {
var args = Array.prototype.slice.call(arguments);
var sanitizedArgs = JSON.parse(JSON.stringify(args));
return console.log.apply(console, sanitizedArgs);
};
Tất cả những phương pháp này rõ ràng là rất chậm, vì vậy ngay cả nhiều hơn so với bình thường console.log
s, bạn phải loại bỏ chúng sau khi bạn hoàn tất gỡ lỗi.
tôi quan sát các hành vi tương tự trong Safari - vì vậy nó có thể là một điều webkit. Khá đáng ngạc nhiên. Tôi gọi nó là một lỗi. – Lee
@mplungjan - điều đó không đúng. dòng đầu tiên khai báo một mảng "thuần cũ" với một phần tử duy nhất tại chỉ mục 0. Dòng thứ ba chỉ đơn giản gán một giá trị mới cho phần tử đó. cả hai trường hợp đều làm việc với một mảng được lập chỉ mục bằng số. – Lee
nếu đây là lỗi, tại sao lỗi này không được tìm thấy và cố định vượt quá khả năng hiểu của tôi. –