Hızlı cevap
Bir JavaScript nesnesinde veya dizisinde belirli bir anahtarın olup olmadığını nasıl kontrol edebilirim? Bir anahtar yoksa ve erişmeye çalışırsam yanlış döndürür mü? Veya bir hata mı atacaksınız?
(İlişkisel) dizi stili veya nesne stili kullanılarak doğrudan eksik bir özelliğe erişmek tanımsız bir sabit döndürür .
Yavaş ve güvenilir olarak operatör ve hasOwnProperty yöntemi
Burada daha önce bahsedildiği gibi, "tanımsız" bir sabitle ilişkilendirilmiş bir özelliğe sahip bir nesneniz olabilir.
var bizzareObj = {valid_key: undefined};
Bu durumda, kullanmak zorunda kalacak hasOwnProperty veya içinde anahtar gerçekten olup olmadığını bilmek operatörü. Ama, ama ne pahasına?
size söylüyorum ...
içinde operatör ve hasOwnProperty (Java dilinde Java yansıması benzer) JavaScript Mülkiyet Tanımlayıcı mekanizmasını kullanın "yöntemleri" dir.
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Özellik Tanımlayıcı türü, adlandırılmış özellik niteliklerinin değiştirilmesini ve yeniden birleştirilmesini açıklamak için kullanılır. Özellik Tanımlayıcı türünün değerleri, her alanın adının bir öznitelik adı ve değerinin 8.6.1'de belirtilen karşılık gelen bir öznitelik değeri olduğu adlandırılmış alanlardan oluşan kayıtlardır. Ek olarak, herhangi bir alan mevcut olabilir veya olmayabilir.
Öte yandan, bir nesne yöntemini veya anahtarını çağırmak Javascript [[Get]] mekanizmasını kullanacaktır. Bu çok daha hızlı!
kıyaslama
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Kullanılması
halinde operatörü
var result = "Impression" in array;
Sonuç şuydu
12,931,832 ±0.21% ops/sec 92% slower
HasOwnProperty kullanma
var result = array.hasOwnProperty("Impression")
Sonuç şuydu
16,021,758 ±0.45% ops/sec 91% slower
Elemanlara doğrudan erişim (parantez stili)
var result = array["Impression"] === undefined
Sonuç şuydu
168,270,439 ±0.13 ops/sec 0.02% slower
Öğelere doğrudan erişme (nesne stili)
var result = array.Impression === undefined;
Sonuç şuydu
168,303,172 ±0.20% fastest
DÜZENLEME: Bir mülke undefined
değer atama nedeni nedir ?
Bu soru beni şaşırtıyor. Javascript'te, bu tür problemlerden kaçınmak için eksik nesneler için en az iki referans vardır: null
ve undefined
.
null
herhangi bir nesne değerinin kasıtlı yokluğunu veya kısa vadede onaylanmış değer eksikliğini temsil eden ilkel değerdir. Öte yandan, undefined
bilinmeyen bir değerdir (tanımlanmamıştır). Daha sonra uygun bir değerle kullanılacak bir özellik varsa , ilk anda özelliğin bir değerinin olmadığı doğrulandığı için null
başvuruyu kullanmayı düşünün .undefined
Karşılaştırmak:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
Öğüt vermek
Değerli nesnelerden kaçının undefined
. Mümkün olduğunda doğrudan kontrol edin ve null
özellik değerlerini başlatmak için kullanın . Aksi takdirde, yavaş in
işleci veya hasOwnProperty()
yöntemi kullanın.
DÜZENLEME: 12/04/2018 - HERHANGİ BİR İLGİLİ DEĞİL
İnsanların yorumladığı gibi, Javascript motorlarının modern sürümleri (firefox hariç) erişim özellikleri için yaklaşımı değiştirdi. Mevcut uygulama, bu özel durum için öncekinden daha yavaş olmakla birlikte, erişim anahtarı ve nesne arasındaki fark göz ardı edilebilir.