EcmaScript 6
ES6 kullanıyorsanız, öğelerden oluşan bir dizi oluşturabilir ve aşağıdakileri kullanabilirsiniz includes:
['a', 'b', 'c'].includes('b')
Bu üzerinde bir miktar doğal faydası vardır indexOfdüzgün varlığı için test edebilirsiniz çünkü NaNlistede ve bu orta biri olarak eksik dizi elemanları eşleşebilir [1, , 2]için undefined. includesAyrıca JavaScript gibi diziler üzerinde çalışır Uint8Array.
(Örneğin IE veya Kenardan gibi) tarayıcı desteği hakkında endişe ediyorsanız, olabilir kontrol Array.includesCanIUse.Com de ve eksik bir tarayıcı veya tarayıcı sürümünü hedeflemek istiyorsanız includes, tavsiyem polyfill.io polyfilling için.
Dizi Olmadan
isInListDizelere aşağıdaki gibi yeni bir özellik ekleyebilirsiniz :
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
Sonra şöyle kullanın:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
Aynı şeyi için de yapabilirsiniz Number.prototype.
Array.indexOf
Modern bir tarayıcı kullanıyorsanız, indexOfher zaman çalışır. Ancak, IE8 ve öncesi için bir çoklu dolguya ihtiyacınız olacak.
Eğer indexOfgetiri -1, öğe listesinde değil. Bununla birlikte, bu yöntemin düzgün bir şekilde kontrol edilmeyeceğini NaNve açık bir şekilde eşleşebilmesine undefinedrağmen, eksik bir öğeyi undefineddizideki gibi eşleştiremeyeceğini unutmayın [1, , 2].
IE için indexOfveya includesIE'de veya herhangi bir tarayıcı / sürüm eksik desteği için çoklu dolgu
Yukarıda belirtildiği gibi polyfill.io gibi bir hizmet kullanmak istemiyorsanız , her zaman kendi kaynak kodu standartlarınızla uyumlu özel çoklu dolgular ekleyebilirsiniz. Örneğin, Mozilla Geliştirici Ağı için bir tane vardır indexOf.
Internet Explorer 7 için bir çözüm yapmak zorunda kaldığım bu durumda indexOf(), standartlara uygun olmayan işlevin daha basit bir sürümünü "yuvarladım" :
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Ancak, değiştirmenin Array.prototypeuzun vadede en iyi cevap olduğunu düşünmüyorum . Değiştirme Objectve ArrayJavaScript prototip ciddi hatalar yol açabilir. Kendi ortamınızda güvenli olup olmadığına karar vermelisiniz. Birincil not, bir dizinin (Array.prototype özellikleri eklediğinde) yinelenmesinin for ... inyeni işlev adını anahtarlardan biri olarak döndürmesidir:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
Kodunuz şimdi çalışabilir, ancak gelecekte birinin devralınan anahtarlara karşı gayretle koruma sağlamayan bir üçüncü taraf JavaScript kitaplığı veya eklentisi eklediği anda her şey bozulabilir.
Bu kırılmaları önlemek için eski yolu nesne aslında olmayan bir miras ile mülkiyet olarak olup olmadığını görmek için her değerini kontrol etmek, numaralandırma sırasında olduğu if (arr.hasOwnProperty(x))ve ancak o zaman o ile çalışmak x.
Bu ekstra tuş sorunu önlemek için yeni ES6 yolu kullanmaktır ofyerine in, for (let x of arr). Ancak, tüm kodlarınızın ve üçüncü taraf kitaplıklarının kesinlikle bu yönteme bağlı olduğunu garanti edemezseniz, bu sorunun amaçları için muhtemelen includesyukarıda belirtildiği gibi kullanmak isteyeceksiniz .