[]
bir dizidir.
Bu dizi hiç kullanılmıyor.
Sayfaya yerleştiriliyor, çünkü bir dizi kullanmak size dizi prototiplerine erişmenizi sağlar .forEach
.
Bu sadece yazmaktan daha hızlı Array.prototype.forEach.call(...);
Sonra, forEach
girdi olarak bir işlevi alan bir işlev ...
[1,2,3].forEach(function (num) { console.log(num); });
... ve içindeki her eleman için this
(burada this
dizi benzeri, a'ya sahip olduğu length
ve bölümlerine erişebileceğiniz gibi this[1]
) üç şey aktaracak:
- dizideki öğe
- öğenin dizini (üçüncü öğe geçer
2
)
- diziye bir başvuru
Son olarak, .call
fonksiyonların sahip olduğu bir prototiptir (diğer fonksiyonlarda çağrılan bir fonksiyondur).
.call
ilk argümanını alır ve this
normal fonksiyonun içini call
ilk argüman olarak geçirdiğiniz şeyle değiştirir ( undefined
veya günlük JS'de null
kullanacak window
veya "katı modda" ise geçtiğiniz her şey olacaktır). Değişkenlerin geri kalanı orijinal işleve aktarılacaktır.
[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
console.log(i + ": " + item);
});
// 0: "a"
// 1: "b"
// 2: "c"
Bu nedenle, forEach
işlevi çağırmanın hızlı bir yolunu oluşturuyorsunuz this
ve boş diziden tüm <a>
etiketlerin bir listesine geçiyorsunuz ve her bir <a>
sırayla, sağlanan işlevi çağırıyorsunuz.
DÜZENLE
Mantıksal Sonuç / Temizleme
Aşağıda, işlevsel programlama girişimlerini bir kenara atmamızı ve her seferinde manuel, satır içi döngüye bağlı kalmamızı öneren bir makale bağlantısı var, çünkü bu çözüm hack-ish ve çirkin.
O süre söyleyebilirim .forEach
, benzerlerine göre daha az yararlı olduğunu .map(transformer)
, .filter(predicate)
, .reduce(combiner, initialValue)
ya erişirken, gerçekten yapmak isteyen tüm, dış dünyayı (değil dizi), n-kere değiştirmek olduğunda, hala amaca hizmet arr[i]
veya i
.
Öyleyse, Motto açıkça yetenekli ve bilgili bir adam olduğu için eşitsizlikle nasıl başa çıkacağız ve ne yaptığımı / nereye gittiğimi bildiğimi hayal etmek istiyorum (şimdi ve sonra ... ... diğer kez kafa ilk öğrenme)?
Cevap aslında oldukça basit ve Bob Amca ve Sör Crockford'un gözetim nedeniyle yüz yüze geleceği bir şey:
temizle .
function toArray (arrLike) { // or asArray(), or array(), or *whatever*
return [].slice.call(arrLike);
}
var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);
Şimdi, bunu kendiniz yapmanız gerekip gerekmediğini soruyorsanız, cevap hayır olabilir ...
Bu kesin şey ... ... bugünlerde üst düzey özelliklere sahip her (?) Kütüphane tarafından yapılıyor.
Lodash veya alt çizgi veya hatta jQuery kullanıyorsanız, hepsinin bir dizi öğeyi alıp n kez bir eylem gerçekleştirme yolu olacaktır.
Böyle bir şey kullanmıyorsanız, elbette, kendiniz yazın.
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);
};
ES6 (ES2015) ve Ötesi için Güncelleme
Bir slice( )
/ array( )
/ etc yardımcı yöntemi, listeleri tıpkı dizileri kullandıkları gibi (olması gerektiği gibi) kullanmak isteyenler için hayatı kolaylaştırmakla kalmaz, aynı zamanda görece yakınların ES6 + tarayıcılarında çalıştırma lüksüne sahip kişiler için de hayatı kolaylaştırır. Gelecek ya da bugün Babel'de "transpiling" için, bu tür şeyleri gereksiz kılan yerleşik dil özelliklerine sahipsiniz.
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 ];
Süper temiz ve çok kullanışlı.
Look up istirahat ve Yayılması operatörleri; bunları BabelJS sitesinde deneyin; teknoloji yığınınız sıralıysa, bunları Babel ile üretimde ve bir oluşturma adımında kullanın.
Diziye olmayan diziden dönüşümü kullanmak mümkün değil iyi bir neden yoktur ... ... sadece hiçbir şey yapmadan Kodunuzun karmaşa yapmazlar ama her yerde aynı çirkin çizgi olduğunu yapıştırarak.