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 indexOf
düzgün varlığı için test edebilirsiniz çünkü NaN
listede ve bu orta biri olarak eksik dizi elemanları eşleşebilir [1, , 2]
için undefined
. includes
Ayrı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.includes
CanIUse.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
isInList
Dizelere 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, indexOf
her zaman çalışır. Ancak, IE8 ve öncesi için bir çoklu dolguya ihtiyacınız olacak.
Eğer indexOf
getiri -1, öğe listesinde değil. Bununla birlikte, bu yöntemin düzgün bir şekilde kontrol edilmeyeceğini NaN
ve açık bir şekilde eşleşebilmesine undefined
rağmen, eksik bir öğeyi undefined
dizideki gibi eşleştiremeyeceğini unutmayın [1, , 2]
.
IE için indexOf
veya includes
IE'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.prototype
uzun vadede en iyi cevap olduğunu düşünmüyorum . Değiştirme Object
ve Array
JavaScript 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 ... in
yeni 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 of
yerine 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 includes
yukarıda belirtildiği gibi kullanmak isteyeceksiniz .