Soru Bir JavaScript nesnesinde bir anahtar olup olmadığını kontrol etmek?


JavaScript nesnesinde veya dizide belirli bir anahtar olup olmadığını nasıl kontrol ederim?

Bir anahtar yoksa ve ona erişmeye çalışırsam yanlış mı döner? Ya da bir hata atmak?


2228
2017-07-08 13:21


Menşei


JavaScript'teki her şey (hemen hemen her şey) bir Nesne veya tek olarak yayınlanabilir. Pseudo ilişkilendirici dizilerin, tıpkı PatrickM'nin işaret ettiği gibi doğduğu yerdir. - Andrew Larsson
bu kriter jsben.ch/#/WqlIl Bu kontrolün nasıl gerçekleştirileceğine dair en genel yollardan bir genel bakış sunar. - EscapeNetscape


Cevaplar:


Undefined-ness'in kontrol edilmesi, bir anahtarın var olup olmadığını sınamak için doğru bir yol değildir. Anahtar varsa, ancak değer aslında ise undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

Bunun yerine in Şebeke:

"key" in obj // true, regardless of the actual value

Bir anahtarın olup olmadığını kontrol etmek isterseniz, parantezi kullanmayı unutmayın:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

Veya, özellikle nesne örneğinin özelliklerini (ve devralınan özellikleri değil) test etmek isterseniz, hasOwnProperty:

obj.hasOwnProperty("key") // true

Yöntemleri arasındaki performans karşılaştırması için in, hasOwnProperty ve anahtar undefined, bunu gör kıyaslama


3087
2017-07-08 15:51



El ile tanımlanmış bir değere sahip olmayan bir mülke sahip olmak kesinlikle mantıklı değildir. Gerçekten bir oksmoron olurdu. - joebert
Tanımlanamayacak şekilde kasıtlı olarak ayarlanmış özelliklere sahip kullanım durumları olduğuna inanıyorum. - Ates Goral
Geçerli kullanım durumu: Gecko 1.9.1 [Firefox 3.5] 'ın window.onhashchange özelliği yoktur. Gecko 1.9.2 [Firefox 3.6], undefined (karma değişikliklere kadar) için bu özelliğe sahiptir. Karma geçmişi veya tarayıcı sürümünü tespit etmek için, window.hasOwnProperty ("onhashchange") kullanılmalıdır; - SamGoody
PHP'de null == var olmayan bir benzer sorun var: stackoverflow.com/q/418066/372654 ve ne yazık ki, null orada da var. - Halil Özgür
@joebert Bir şey saçmalık olduğu için üretim kodunda karşılaşmayacağınız anlamına gelmez. Saçma sapan şeyler yapan birçok kütüphane var. - Crashworks


Hızlı cevap

JavaScript nesnesinde veya dizide belirli bir anahtar olup olmadığını nasıl kontrol ederim?   Bir anahtar yoksa ve ona erişmeye çalışırsam yanlış mı döner? Ya da bir hata atmak?

(İlişkisel) dizi stilini veya nesne stilini kullanarak bir eksik özelliğe doğrudan erişme bir Tanımsız sabiti.

Yavaş ve güvenilir içinde operatör ve hasOwnProperty yöntem

Burada daha önce bahsettikleri gibi, "tanımsız" bir sabit ile ilişkili bir özellik ile bir nesneye sahip olabilirsiniz.

 var bizzareObj = {valid_key:  undefined};

Bu durumda kullanmak zorunda kalacaksınız. hasOwnProperty veya içinde anahtarın gerçekten orada olup olmadığını öğrenmek için operatör. Fakat, ama hangi fiyata?

ben de sana söyleyeyim

içinde operatör ve hasOwnProperty Javascript'te (Java dilinde Java yansımasına benzer) Özellik Tanımlayıcı mekanizmasını kullanan "yöntemler" dir.

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10

Özellik Tanımlayıcı türü, adlandırılmış özellik özniteliklerinin manipülasyonunu ve yeniden tanımlanmasını açıklamak için kullanılır. Özellik Tanımlayıcısı türünün değerleri, her alanın adının bir özellik adı olduğu ve değerinin 8.6.1'de belirtildiği gibi karşılık gelen bir özellik değeri olduğu adlandırılmış alanlardan oluşan kayıtlardır. Ek olarak, herhangi bir alan mevcut olabilir veya mevcut olmayabilir.

Öte yandan, bir nesne yöntemini veya anahtarını çağırmak Javascript [[Get]] mekanizmasını kullanır. Bu çok daha hızlı!

kıyaslama

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS.

kullanma içinde Şebeke
var result = "Impression" in array;

Sonuç oldu

12,931,832 ±0.21% ops/sec      92% slower 
HasOwnProperty'yi kullanma
var result = array.hasOwnProperty("Impression")

Sonuç oldu

16,021,758 ±0.45% ops/sec     91% slower
Doğrudan öğelere erişme (parantez stili)
var result = array["Impression"] === undefined

Sonuç oldu

168,270,439 ±0.13 ops/sec     0.02% slower 
Doğrudan öğelere erişme (nesne stili)
var result = array.Impression  === undefined;

Sonuç oldu

168,303,172 ±0.20%     fastest

EDIT: Bir mülke atamanın sebebi nedir? undefined değeri?

Bu soru beni şaşırtıyor. Javascript'te, bu tür sorunları önlemek 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 temsil eden ilkel değerdir veya kısa vadede onaylı değer eksikliği. Diğer yandan, undefined bilinmeyen değerdir (tanımlı değil). Daha sonra bir ile kullanılacak bir özellik varsa uygun değer kullanmayı düşünün null referans yerine undefined çünkü ilk anda mülkiyet onaylı değer eksikliği.

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

Nesnelerle kaçının undefined değerler. Mümkün olduğunda doğrudan kontrol edin ve kullanın null özellik değerlerini başlatmak. Aksi halde yavaş kullanın in operatör veya hasOwnProperty() yöntem.

EDİT: 12/04/2018 - HERHANGİ BİR İLGİLİ DEĞİL

İnsanlar yorumladıkça, Javascript motorlarının modern versiyonları (firefox istisnasıyla) erişim özellikleri için yaklaşımı değiştirdi. Mevcut uygulama bu özel durum için bir öncekinden daha yavaştır, ancak erişim anahtarı ile nesne arasındaki fark ihmal edilebilir.


224
2018-02-27 16:38



Tüm bu yöntemler, yaygın olarak kullanılan tüm tarayıcılarda kabul edilebilir, ör. IE8 +? - Justin
@ Justin Evet. İşe yaramalı. Doğrudan test edebilirsiniz jsperf.com/checking-if-a-key-exists-in-a-javascript-array. - rdllopes
Kıyaslama için +1. Teşekkürler, bu tam olarak bulmayı umduğum bilgiler. Kesinlikle, değeri içermeyen bir anahtarı atayan veya beklemeyen kod yazmak için güçlü bir argüman Tanımsız. - T.J. Compton
Bir hash değerine undefined olarak ayarlamanın bir nedeni, aslında bu özellik anahtarını karmadan silmek istediğimdi; delete hash[key] olduğu çok daha yavaş  hash[key] = undefined. Tabii ki bu durumda benim ihtiyacım olan bir şey yok. in Operatör, ancak “undefined değerine her zaman değer vermekten kaçınmalıyız” için bir karşı örnek olarak işlev görür. - Alan Tam
@ HüseyinYağlı'nın dediği gibi, eğer jsperf Bu yanıt orijinal olarak yazıldığından, bağlantı, çoğu tarayıcı için farklı yöntemler arasında önemli ölçüde değişmiştir. Firefox, dizi veya nesne yöntemlerini kullanarak hala önemli bir avantajı olanlardan biridir, ancak diğer birçok tarayıcı için farklar önemsizdir. - kevinmicke


Geri dönecek undefined.

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup box with "undefined"

undefined özel bir sabit değerdir. Yani, örneğin,

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

Bu muhtemelen eksik anahtarları kontrol etmenin en iyi yoludur. Ancak, aşağıdaki bir yorumda belirtildiği gibi, gerçek değere sahip olmak isteyeceğiniz teorik olarak mümkündür. undefined. Bunu yapmak için hiç bir zaman gerekmedim ve neden istediğim için bir neden düşünemedim, ama sadece tamlığı uğruna, in Şebeke

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

114
2017-07-08 13:24



Anahtar varsa, ancak değer gerçekten tanımlanmamışsa ne olur? - Ates Goral
Undefined ile karşılaştırırken === yerine === kullanmalısınız, aksi takdirde null tanımsız olarak eşittir. - Matthew Crumley
Eli cevabınız tamamen doğru değil. Çünkü neyse (ve elbette bu yapılmamalı) undefined özel bir sabit değer değildir. Aslında, ayrılmış bir anahtar kelime değildir ve bunun üzerine yazabilirsiniz, örneğin, var undefined = 42;. Tanımlanmamış tanıtımlar için test yaparken her zaman kullanmalısınız ((typeof variable) === "undefined"). - ssice
@ssice undefined spekülasyona göre yazılabilir bir özellik değildir ecma-international.org/ecma-262/5.1/#sec-15.1.1.3 - therealrootuser
JavaScript'in önceki sürümlerinde, 'undefined' ve 'NaN' değişken değişkenleridir. yeniden tanımlanabilir veya başka değerler atanabilir. Bu kötü bir şeydi. ECMAScript 5'te tespit edildi. - jkdev


kabul edilen cevap ifade eder Nesne. Kullanarak dikkatli olun in Şebeke üzerinde Dizi Anahtar yerine veri bulmak için:

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

Bir dizi içindeki mevcut öğeleri test etmek için: Bir öğenin JavaScript dizisinde olup olmadığını bulmak için en iyi yol?


22
2017-07-01 12:45





"key" in obj

Muhtemelen dizi anahtarlarından çok farklı olan nesne özellik değerlerini test etme olasılığı yüksektir


20
2018-04-25 15:45



Bu kod, aynı zamanda, Class prototipinde tanımlanan bir anahtar için de geçerli olacaktır: function A () {}; A.prototype.b = 2; var a = new A (); Sonra a 'b' doğrudur. A.hasOwnProperty ('b') elbette yanlıştır. - Alexander


Bir javascript nesnesinde bir özelliğin olup olmadığını kontrol etmenin üç yolu:

  1. !! obj.theProperty
    Değeri boole dönüştürür. 'false' değeri dışındaki herkes için TRUE değerini döndürür
  2. 'mülk'
    Özellik mevcutsa, değeri (boş bile olsa) doğrudur
  3. obj.hasOwnProperty ( 'theproperty')
    Prototip zincirini kontrol etmez. (tüm nesneler 'toString' yöntemine sahip olduğu için, 1 ve 2 bunun üzerine doğru döner, 3 tanesi ise false döndürür.)

Referans:

http://book.mixu.net/node/ch5.html


20
2017-11-12 09:19





Eğer kullanıyorsanız underscore.js kütüphane daha sonra nesne / dizi işlemleri basit hale gelir.

Senin durumunda _.has yöntemi kullanılabilir. Örnek:

yourArray = {age: "10"}

_.has(yourArray, "age")

döner doğru 

Fakat,

_.has(yourArray, "invalidKey")

döner yanlış


13
2018-05-29 19:37