2013-02-18 69 views
29

的ECMAScript 5的array.forEach(callback[, thisArg])是迭代陣列上非常方便,擁有了對語法的許多優勢:爲什麼ECMAScript 5中的對象沒有forEach方法?

  • 它更簡潔。
  • 它不會創建我們只需要用於迭代的變量。
  • 它爲循環的局部變量創建可見性範圍。
  • 它提高了性能。

是有一個原因是沒有object.forEach更換for(var key in object)

當然,我們可以使用JavaScript實現,如_.each或$ .each,但這些都是性能殺手。

+1

這個問題更適合參與ES5/ES6討論的人員。 – alex 2013-02-18 05:11:21

+0

爲什麼'for-in'需要更換?爲什麼'Object.forEach'不會成爲一個性能殺手?命中主要來自調用回調函數。 – 2013-02-18 05:23:48

回答

62

呃,自己裝配很容易。爲什麼會進一步污染原型?

Object.keys(obj).forEach(function(key) { 
    var value = obj[key]; 
}); 

我認爲一個很大的原因是,想要避免將內置屬性添加到Object的權力。 Object s是Javascript中的所有東西的構建塊,但也是該語言中的通用鍵/值存儲。將新屬性添加到Object將與您的Javascript程序可能要使用的屬性名稱相沖突。因此,將內置名稱添加到Object時非常謹慎。

數組以索引整數,所以它沒有這個問題。

這也是爲什麼我們有Object.keys(obj)而不是簡單地obj.keys。污染Object構造函數,因爲它通常不是什麼大不了的事情,但只保留實例。

+18

但是'Object.forEach'(不是原型)會很好。 – kirilloid 2014-02-16 03:48:00

+5

它會,我同意:) – 2014-02-16 18:02:51

+1

它不會污染恕我直言。這就是所謂的一致性。其他語言有它,JS是該委員會中最糟糕的一個。 Sim類似的操作和對diff類型的類型進行的轉換在邏輯上有所不同,並且具有完全不同的語法。如果你是頭部組織的話,你必須吃一個最大的廢話,JS會把你搞砸 – DanteTheSmith 2018-01-02 16:13:39

2

您必須記住,JavaScript中的每個對象都繼承自Object。並不是每個javascript對象都需要迭代它的屬性。這些主要侷限於數據模型對象。添加forEach方法只會不必要地每隔對象擴大原型

如果您當前看到對象及其方法,它們僅用於標識對象或區分一個對象。

5
  1. .forEach創建變量只是迭代的目的...創建只是沒有的,你自己。
    如果你正在使用shim,那麼它們就是閉包中的JS變量,否則它們可能是C++或者瀏覽器的本地實現。

  2. ES6正在獲得for ... of它將遍歷通過它的任何內容。

  3. ES6也越來越塊級變量(而不是函數範圍的),採用let,而不是var

  4. 您將可以迭代器添加到特定類型的對象在ES6(即:你構建的對象支持迭代器)。

但這裏的問題是,ES5是爲了維護最ES3(幾個新的關鍵字,並在經常使用的沒有新的關鍵字)的語法。
大部分附加功能必須是方法調用(通常是原型)。
考慮到自從ES3推出以來JS已經看到了多少用途,數組需要大量的工作。

對象不需要.map()/.reduce()的能力,除非你正在構建非常具體的對象,在這種情況下,你自己實現這些。

相關問題