2016-03-09 15 views
5

Tôi vừa mới bắt đầu làm việc trong một dự án mới làm việc với TypeScript. Tôi đang đến từ một dự án khác cũng làm việc với TypeScript. Kể từ khi bản địa của vòng lặp trong TypeScript là avaible chúng tôi quyết định (nhóm dự án cũ) để sử dụng này. Espacialy cho tôi nó thuận tiện hơn nhiều để viết cho vòng lặp, liên quan đến nền java của tôi.Chúng ta có nên sử dụng _.foreach() hoặc tốt hơn bản địa của vòng lặp trong TypeScript

Bây giờ trong dự án mới, họ sử dụng mọi nơi trong vòng lặp _.foreach() để lặp qua các mảng.

Những gì tôi đang tự hỏi, liệu có một sự khác biệt về hiệu năng giữa các nguyên cảo bản địa cho các và _.foreach()

tôi đã tạo một thử nghiệm nhỏ trong jsperf họ đường may là nhiều hay ít chính xác cùng một tốc độ ...

https://jsperf.com/foreach-vs-forof/12

nguyên cảo Đối với các

for (let num: string of list){ 
    console.log(num); 
} 

trong JavaScript

var list = "9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9".split(); 

//Transpiled TypeScript for of  | **19,937 ±5.04% 
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 
    var num = list_1[_i]; 
    console.log("" + num); 
} 

//lodash       | 20,520 ±1.22% 
_.forEach(list, function(item) { 
    console.log("" + item) 
}); 

Imho tôi muốn "bản địa" cho từ TypeScript khiến nó dễ đọc hơn đối với tôi.

Các bạn gợi ý điều gì để sử dụng? Có các điểm khác để sử dụng cho hoặc tốt hơn _.forEach

Trả lời

2

Tôi không thể nhận xét về lodash, tôi chưa sử dụng nó. Nhưng dưới đây là một số nền tảng có thể hữu ích.

'For of' được giới thiệu trong TypeScript 1.5 để lặp xung quanh từng phần tử, ví dụ: một danh sách mảng. Nếu bạn kiểm tra đầu ra JS (và tùy thuộc vào nếu bạn đang nhắm mục tiêu ECMA Script 5 hoặc 6), bạn sẽ thấy rằng trong trường hợp của ECMASCript5 đầu ra của cả hai bên dưới sẽ giống nhau. See this article for associated background reading và cách nhắm mục tiêu ES6/2015 sẽ ảnh hưởng đến đầu ra.

Đối với việc triển khai Typecript của ForEach, có một cuộc thảo luận thú vị về GitHub here về điều này. Đặc biệt là xung quanh có điều kiện thoát ra khỏi vòng lặp.

for (let line of v.lineEntry) { 

} 

for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 

} 
2

Dựa trên thử nghiệm của bạn tôi đã thêm khác, bằng cách sử dụng bản địa Array.prototype.forEach:

list.forEach(function(item) { 
    console.log("" + item) 
}); 

Đây là Infact cách ưa thích của tôi vì nó là thực sự dễ dàng hơn nhiều để gõ. Ngoài ra, nó gần với những thứ khác bạn có thể muốn làm với mảng, ví dụ: map/filter v.v.

Lưu ý rằng tất cả ba không có sự khác biệt về hiệu suất chính đáng.

2

Tôi không có bất kỳ kinh nghiệm nào với các bản đánh máy ngoài việc đọc nhưng tôi có khá nhiều kinh nghiệm với ES6/ES2015. for of đã và vẫn là một phần của thông số ES2015 đã được hoàn thành. Tôi sẽ đọc this bài viết trên for of từ MDN.

Dưới đây là một số điểm tương đồng và khác biệt của for offorEach (và đây chỉ là như xa như tôi đã tìm thấy và biết hiện tại):

  • forEach trong lodash hoạt động trên các bộ sưu tập mà Mảng, đối tượng, hoặc Chuỗi.

  • native forEach hoạt động trên Mảng, Bản đồ và Bộ.

  • for of hoạt động trên tất cả Iterables: Mảng, Chuỗi, TypedArrays, Bản đồ, Bộ, bộ sưu tập DOM và máy phát.

tôi sẽ đọc chương này trên for of từ Exploring ES6 (Khám phá ES6 là một đọc tuyệt vời. Nó rất kỹ lưỡng. Nó hoàn toàn miễn phí trực tuyến là tốt.) Một số điều từ nó mà nổi bật với tôi như khác nhau về for of rằng aren 't in forEach.

nghỉ ngơi và tiếp tục công việc bên cho-of vòng

breakcontinue không được tiếp xúc trong forEach. Điều gần nhất bạn có thể truy cập vào continue trong forEach đang sử dụng return thực sự là điều tương tự. Đối với break mặc dù tôi thấy không có thay thế (nhưng không giảm giá lodash, bởi vì hầu hết những thứ cần phá vỡ như tìm kiếm và trả lại một mục duy nhất đã được bao phủ trong nhiều thư viện của lodash).

Nếu Object.entries đến trong ES2017 như được đề xuất, bạn thậm chí có thể lặp lại các đối tượng có thuộc tính và giá trị đầy đủ dễ dàng và chính xác. Nếu bạn muốn sử dụng nó ngay bây giờ bạn có thể với một trong các polyfills here. Đây là một ví dụ về những gì sẽ trông như thế nào.

var obj = {foo: "bar", baz: "qux"}; 

for (let x of Object.entries(obj)) { // OK 
    console.log(x); // ["foo", "bar"], ["baz", "qux"] 
} 

here 's triển khai với một polyfill nhanh tôi đã viết. Bạn thường sẽ sử dụng phá hủy mảng cũng như sẽ tách riêng khóa và giá trị thành các biến riêng của nó.

forEach 's var mặc định là loại chức năng bạn sẽ nhận được từ let trong một for hoặc for of loop đó là một điều tốt. Những gì tôi có nghĩa là bởi nếu có bất cứ điều gì không đồng bộ xảy ra bên trong biến cho lặp đó sẽ được scoped đến chỉ là một phần cụ thể của vòng lặp đó. Thuộc tính này của forEach không thực sự liên quan đến việc cho phép, nhưng với phạm vi và đóng trong JavaScript.

giữa forEachfor of bạn chỉ cần phải quyết định cái nào là tốt nhất cho công việc hiện tại (ví dụ Bạn có cần break s hoặc cần phải sử dụng Maps, Bộ hoặc phát điện sử dụng for of). Bên cạnh đó tôi cảm thấy như không có lý do đặc biệt mạnh mẽ cho một trong hai bộ sưu tập mà cả hai đều hoạt động với các chức năng cốt lõi của họ. Ngoài ra khi giao dịch với các bộ sưu tập có thể sử dụng forEach hoặc for of, chủ yếu chỉ tùy theo sở thích cá nhân khi chúng thực hiện tương tự ở tốc độ tương tự (và tốc độ có thể thay đổi bất kỳ lúc nào theo thông dịch viên).Tôi cảm thấy những lợi thế đặc biệt của lodash là cho các chức năng khác nhau của nó mà thực sự có thể giúp bạn tiết kiệm rất nhiều thời gian từ việc viết mã như bản đồ, giảm, lọc và tìm. Vì bạn cảm thấy thoải mái nhất khi viết for of Tôi khuyên bạn nên tiếp tục viết theo cách đó nhưng một khi bạn bắt đầu viết lodash bằng các chức năng khác, bạn có thể bắt đầu cảm thấy thoải mái hơn khi viết nó theo cách lodash.

Edit:

Nhìn qua mã của bạn, tôi nhận thấy một lỗi với tạo danh sách của bạn. Cuối cùng bạn chỉ có .split() và bạn đã có .split(","). Bạn đã tạo một danh sách độ dài 1 của toàn bộ chuỗi và lặp lại một lần trên chuỗi đó là lý do tại sao các dấu ngoặc đơn rất giống nhau. Tôi đọc lại các bài kiểm tra. Here. Tôi vẫn sẽ không lo lắng về hiệu suất mà nó dường như thay đổi mỗi khi nó chạy.

Các vấn đề liên quan