[]
là một mảng.
Mảng này không được sử dụng ở tất cả.
Nó đang được đặt trên trang, bởi vì sử dụng một mảng cho phép bạn truy cập vào các nguyên mẫu mảng, như thế nào .forEach
.
Điều này chỉ nhanh hơn gõ Array.prototype.forEach.call(...);
Tiếp theo, forEach
là một chức năng lấy một chức năng làm đầu vào ...
[1,2,3].forEach(function (num) { console.log(num); });
... Và đối với mỗi phần tử trong this
(nơi this
giống như mảng, trong đó nó có một length
và bạn có thể truy cập các phần của nó như thế nào this[1]
), nó sẽ vượt qua ba điều:
- phần tử trong mảng
- chỉ số của phần tử (phần tử thứ ba sẽ vượt qua
2
)
- một tham chiếu đến mảng
Cuối cùng, .call
là một nguyên mẫu mà các chức năng có (đó là một chức năng được gọi trên các chức năng khác).
.call
sẽ lấy đối số đầu tiên của nó và thay thế this
bên trong hàm thông thường bằng bất cứ điều gì bạn đã vượt qua call
, như là đối số đầu tiên ( undefined
hoặc null
sẽ sử dụng window
trong JS hàng ngày hoặc sẽ là bất cứ điều gì bạn đã vượt qua, nếu ở "chế độ nghiêm ngặt"). Phần còn lại của các đối số sẽ được chuyển đến hàm ban đầu.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Do đó, bạn đang tạo một cách nhanh chóng để gọi forEach
hàm và bạn đang thay đổi this
từ mảng trống sang danh sách tất cả <a>
các thẻ và cho từng thẻ<a>
thứ tự, bạn đang gọi hàm được cung cấp.
BIÊN TẬP
Kết luận logic / Dọn dẹp
Bên dưới, có một liên kết đến một bài viết gợi ý rằng chúng tôi loại bỏ các nỗ lực lập trình chức năng và luôn tuân thủ thủ công, lặp nội tuyến, bởi vì giải pháp này là hack-ish và khó coi.
Tôi muốn nói rằng trong khi .forEach
ít hữu ích hơn các đối tác của nó, .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
, nó vẫn phục vụ mục đích khi tất cả các bạn thực sự muốn làm là thay đổi thế giới bên ngoài (không phải mảng), n-lần, trong khi có quyền truy cập vào một trong hai arr[i]
hoặc i
.
Vậy làm thế nào để chúng ta đối phó với sự chênh lệch, vì Motto rõ ràng là một chàng trai tài năng và hiểu biết, và tôi muốn tưởng tượng rằng tôi biết những gì tôi đang làm / nơi tôi đang đi (bây giờ và sau đó ... ... khác lần đầu tiên học tập)?
Câu trả lời thực sự khá đơn giản, và một cái gì đó chú Bob và Sir Crockford sẽ cả hai mặt, do sự giám sát:
làm sạch nó lên .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Bây giờ, nếu bạn đang tự hỏi liệu bạn có cần phải làm điều này không, bản thân bạn, câu trả lời có thể là không ...
Điều này chính xác được thực hiện bởi ... ... mọi thư viện (?) Với các tính năng bậc cao hơn hiện nay.
Nếu bạn đang sử dụng lodash hoặc gạch dưới hoặc thậm chí jQuery, tất cả họ sẽ có cách lấy một tập hợp các phần tử và thực hiện một hành động n lần.
Nếu bạn không sử dụng một thứ như vậy, thì bằng mọi cách, hãy tự viết.
lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
var others = lib.array(arguments, 1);
return others.reduce(appendKeys, subject);
};
Cập nhật cho ES6 (ES2015) và xa hơn
Không chỉ là một phương thức trợ giúp slice( )
/ array( )
/ etc sẽ giúp cuộc sống dễ dàng hơn cho những người muốn sử dụng danh sách giống như họ sử dụng mảng (mà họ nên), mà còn cho những người có khả năng vận hành trong các trình duyệt ES6 + tương đối gần tương lai, hoặc "dịch chuyển" trong Babel ngày nay, bạn có các tính năng ngôn ngữ được tích hợp sẵn, điều này làm cho loại điều này không cần thiết.
function countArgs (...allArgs) {
return allArgs.length;
}
function logArgs (...allArgs) {
return allArgs.forEach(arg => console.log(arg));
}
function extend (subject, ...others) { /* return ... */ }
var nodeArray = [ ...nodeList1, ...nodeList2 ];
Siêu sạch, và rất hữu ích.
Tra cứu các toán tử Rest and Spread ; thử chúng tại trang web BabelJS; nếu ngăn xếp công nghệ của bạn theo thứ tự, hãy sử dụng chúng trong sản xuất với Babel và một bước xây dựng.
Không có lý do chính đáng nào để không thể sử dụng phép chuyển đổi từ mảng không thành mảng ... ... đừng tạo ra một mớ hỗn độn mã của bạn mà không làm gì ngoài việc dán cùng một dòng xấu xí đó, ở mọi nơi.