2012-09-23 9 views
10

Firefox'un *something* if *expression*; satırları boyunca bir tür JavaScript sözdizimini desteklediğini gösteren bazı örnekler gördüm. Ben neden bahsettiğimi bir örnek olarak * bir şey * eğer * expression * sözdizimi JavaScript (FF) içinde

aşağıdaki örnek içerir this MDN article, bkz:
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)]; 

Benim sorulara

şunlardır:

verilecek ne ad

bu tür tarif etmek sözdizimi? Temel olarak bunu bilmek istiyorum, böylece Google'ı kullanabilir ve daha fazlasını okuyabilirim. Elimden gelenin en iyisini yapmaya çalıştım, ancak yararlı sonuçları elde etmek için doğru terimleri bir araya getiremedik. Bu sözdizimi bir dizi anlama dışında diğer yerlerde

var olabilir mi? Bir dizinin dışında kullanılan (örneğin, yukarıdaki örnekte olduğu gibi) başka örneklerini görmüştüm ama emin değilim.

Bu sözdizimi hakkında daha fazla bilgiyi nerede bulabilirim?

başka tarayıcılar Firefox yanında bu destekliyor musunuz?

Bu özellik ES5'te mi veya ES uyumu için planlanmış mı?

+0

_ "Bu tür bir sözdizimini açıklamak için hangi isim verilebilir?" _ - Bağladığınız makale "Array Anlaşmaları" olarak adlandırılır. – nnnnnn

+0

Yanılıyor olabilirim, ama bu terimin bir dizinin içindeki "her" için atıfta bulunduğunu düşünüyorum. Sanırım diziler dışında kullanılan bu farklı “if” sözdizimini görmüştüm ama emin değilim. ? –

+0

_Not dizisi sadece çok daha kompakttır, ancak okunması daha kolaydır, ** kavramı tanıdık bir kez **. Herkesin sözdizimini bildiğinden emin olduğumda bunu kullanmaya cesaret edebilirdim. Şiddetli bir psikopat olan bakıcı ve tüm ... – Laoujin

cevap

4

, bu "Dizi comprehensions" olarak adlandırılan ve birçok biri olan, pek çok özelliği ECMAScript Harmony için önerilen Aslında, son sürümde gerçekte yer alıp almayacağı konusunda gerçek bir fikir olduğunu sanmıyorum. Firefox'ta "JavaScript 1.7" (bir "standardı" standardı "gerçekten'un yalnızca Mozilla tabanlı öğeler için geçerli olduğu) bir parçası olarak kullanabilirsiniz; Ancak, özellikle diğer tarayıcılarda sözdizimi hatası verdiğinde, FF'ye özgü sözdiziminden kaçınmanız daha iyidir.

Sen "Dizi Kapsam," için bir Google araması yaparak bu konuda daha fazla bilgi bulabilirsiniz ama belirtildiği gibi Mozilla özgü doğası nedeniyle, bu çok yararlı bir araçtır değil.

Sen ES5 tanıtıldı reduce() Dizi yöntemiyle çok daha kodu olmadan benzer bir etkiyi elde edebilirsiniz:

//JavaScript has no "range" function, so let's make one 
var range = function (begin, length) { 
    var i, ret = []; 
    for (i = begin; i < begin + length; i++) { 
     ret.push(i); 
    } 
    return ret; 
}; 

var evens = range(0, 21).reduce(function (arr, cur) { 
    if (cur % 2 === 0) arr.push(cur); 
    return arr; 
}, []); 

olabilir biraz ayrıntılı kıyasla ne bile göz önünde tutarak (aradığını biz range() işlevini oluşturmak zorundaydı). Ancak, çok fazla "kurulum" gerektirmeyen ve esas olarak problemin çözümüne yapışan nispeten kompakt bir çözümdür: bir diziden elemanların bir ikinci dizi oluşturması için filtreleme.

Ben tek satırlık yer azaltmak başardı, ancak korumak biraz unweildy olur, bu yüzden yerine iki satırı sürümü önermek karar verdi.Eğer bir-liner ilgilendiğiniz, işte burada:
//Don't forget to define "range()" 
var evens = range(0, 21).reduce(function (arr, cur) { 
    return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; 
}, []); 

Yine, bu ES5 kodudur. Eski tarayıcılarda çalışmasını istiyorsanız, Array.reduce() için destek sağlamak için bir shim ile gelmeniz gerekir. MDN burada birine sahiptir:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

GÜNCELLEME:

Ben filter() yerine reduce() kullanılmış olmalıdır gibi görünüyor. Kodu daha temiz hale getirir. Önermek için OP teşekkürler! Eğer eski tarayıcılarda düzgün çalışıp çalışmayacağını sağlamak amacıyla bir dolgu gerekir böylece

var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; }); 

Yine filter() ES5 vardır.

+1

+1, ancak "JavaScript 1.7" herhangi bir standart değildir. JavaScript, Mozilla'nın tarayıcılarda kullanım için ECMAScript'in özel uygulamasıdır. Bunun için bir şartname bile mevcut değil, yalnızca gelen dokümantasyon, şu şekilde korunan [on-line Reference] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference). Bir topluluk wiki. – RobG

+0

+1, tüm bilgiler için teşekkürler! ES5 varyantı için 'redüksiyon 'yerine' filter 'kullanıyorum. Ama eğer sadece FF olmakla iyi olduğum bir proje üzerinde çalışıyorsam, JS1.7 özelliklerini kullanarak da iyiyim. –

+0

@RobG Teşekkürler. Güncellenmiş. – Pete