Pytanie Sprawdzanie, czy klucz istnieje w obiekcie JavaScript?


Jak sprawdzić, czy dany klucz istnieje w obiekcie lub tablicy JavaScript?

Jeśli klucz nie istnieje i spróbuję uzyskać do niego dostęp, czy zwróci false? Lub rzucić błąd?


2228
2017-07-08 13:21


pochodzenie


Wszystko (prawie wszystko) w JavaScript jest Obiektem lub może być rzucone jako jedno. W tym miejscu rodzą się pseudo-asocjacyjne tablice, takie jak @PatrickM. - Andrew Larsson
ten benchmark jsben.ch/#/WqlIl daje przegląd najczęstszych sposobów na uzyskanie tego czeku. - EscapeNetscape


Odpowiedzi:


Sprawdzanie niezdefiniowanej nie jest dokładnym sposobem sprawdzenia, czy klucz istnieje. Co jeśli klucz istnieje, ale wartość jest rzeczywiście undefined?

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

Zamiast tego powinieneś użyć in operator:

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

Jeśli chcesz sprawdzić, czy klucz nie istnieje, pamiętaj, aby użyć nawiasu:

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

Lub, jeśli chcesz w szczególności przetestować właściwości instancji obiektu (i nie odziedziczonych właściwości), użyj hasOwnProperty:

obj.hasOwnProperty("key") // true

Do porównania wydajności między metodami, które są in, hasOwnProperty i klucz jest undefined, Zobacz reper


3087
2017-07-08 15:51



Posiadanie właściwości z ręcznie zdefiniowaną wartością undefined nie ma absolutnie żadnego sensu. Byłby to naprawdę oksymoron. - joebert
Jestem przekonany, że istnieją przypadki użycia dla właściwości celowo ustawionych na niezdefiniowane. - Ates Goral
Ważny przypadek użycia: Gecko 1.9.1 [Firefox 3.5] nie ma właściwości window.onhashchange. Gecko 1.9.2 [Firefox 3.6] ma tę właściwość ustawioną na undefined (do czasu zmiany hasza). Aby wykryć historię haszu lub wersję przeglądarki, należy użyć window.hasOwnProperty ("onhashchange"); - SamGoody
Podobny problem występuje w PHP, gdzie null == nonexistent: stackoverflow.com/q/418066/372654 i niestety, null też tam jest. - Halil Özgür
@joebert Tylko dlatego, że coś jest nonsensem, nie oznacza, że ​​nie spotkasz go w kodzie produkcyjnym. Istnieje wiele bibliotek, które robią rzeczy bezsensowne. - Crashworks


szybka odpowiedź

Jak sprawdzić, czy dany klucz istnieje w obiekcie lub tablicy JavaScript?   Jeśli klucz nie istnieje i próbuję uzyskać do niego dostęp, czy zwróci false? Lub rzucić błąd?

Bezpośrednie uzyskanie brakującej właściwości za pomocą (asocjacyjnego) stylu tablicy lub stylu obiektu spowoduje zwrócenie wartości niezdefiniowany stały.

Powolny i niezawodny w operator i hasOwnProperty metoda

Jak już wspomniano, możesz mieć obiekt z właściwością związaną ze stałą "niezdefiniowaną".

 var bizzareObj = {valid_key:  undefined};

W takim przypadku będziesz musiał użyć hasOwnProperty lub w operator, aby dowiedzieć się, czy klucz naprawdę istnieje. Ale, ale za jaką cenę?

więc mówię ci ...

w operator i hasOwnProperty są "metodami", które używają mechanizmu deskryptora właściwości w JavaScript (podobnie jak odbicie Java w języku Java).

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

Typ deskryptora właściwości służy do wyjaśnienia manipulacji i reifikacji nazwanych atrybutów właściwości. Wartości typu Deskryptor właściwości są rekordami złożonymi z nazwanych pól, w których nazwa każdego pola jest nazwą atrybutu, a jego wartością jest odpowiednia wartość atrybutu określona w 8.6.1. Ponadto dowolne pole może być obecne lub nieobecne.

Z drugiej strony wywołanie metody obiektu lub klucza spowoduje użycie mechanizmu Javascript [[Get]]. To daleko szybciej!

reper

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

Comparing key access in JS.

Za pomocą w operator
var result = "Impression" in array;

Rezultat był

12,931,832 ±0.21% ops/sec      92% slower 
Używanie hasOwnProperty
var result = array.hasOwnProperty("Impression")

Rezultat był

16,021,758 ±0.45% ops/sec     91% slower
Bezpośredni dostęp do elementów (styl nawiasów)
var result = array["Impression"] === undefined

Rezultat był

168,270,439 ±0.13 ops/sec     0.02% slower 
Bezpośredni dostęp do elementów (styl obiektu)
var result = array.Impression  === undefined;

Rezultat był

168,303,172 ±0.20%     fastest

EDYCJA: Jaki jest powód, aby przypisać do nieruchomości undefined wartość?

To pytanie mnie zastanawia. W JavaScript istnieją co najmniej dwa odwołania do nieobecnych obiektów, aby uniknąć takich problemów: null i undefined.

null jest prymitywną wartością, która reprezentuje umyślną nieobecność jakiejkolwiek wartości obiektu, lub w skrócie: zatwardziały brak wartości. Z drugiej strony, undefined jest nieznaną wartością (nie zdefiniowano). Jeśli istnieje właściwość, która będzie później używana z właściwy wartość rozważ użycie null odniesienie zamiast undefined ponieważ w początkowej chwili nieruchomość jest zatwardziały brakować wartości.

Porównać:

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[].

Doradzać

Unikaj przedmiotów undefined wartości. Sprawdź bezpośrednio, gdy tylko jest to możliwe i użyj null zainicjować wartości właściwości. W przeciwnym razie użyj powolnego in operator lub hasOwnProperty() metoda.

EDYCJA: 12/04/2018 - NIE ODPOWIADA WIĘCEJ

Jak ludzie skomentowali, nowoczesne wersje silników JavaScript (z wyjątkiem firefox) zmieniły podejście do właściwości dostępu. Obecna implementacja jest wolniejsza niż poprzednia w tym konkretnym przypadku, ale różnica między kluczem dostępu a obiektem jest lekceważąca.


224
2018-02-27 16:38



Czy wszystkie te metody są akceptowane we wszystkich powszechnie używanych przeglądarkach, np. IE8 +? - Justin
@Justin Tak. Powinno działać. Możesz testować bezpośrednio jsperf.com/checking-if-a-key-exists-in-a-javascript-array. - rdllopes
+1 dla testu porównawczego. Dziękuję, to właśnie informacje, które miałem nadzieję znaleźć. Zdecydowanie silny argument na pisanie kodu, który nigdy nie przypisuje ani nie oczekuje klucza do wartości niezdefiniowany. - T.J. Compton
Jedną z przyczyn, dla których ustawiłem wartość niezdefiniowaną na wartość mieszającą, jest to, że faktycznie chciałem usunąć ten klucz właściwości z hasza, ale delete hash[key] jest znacznie wolniej niż  hash[key] = undefined. Oczywiście w tym przypadku nie ma sensu, aby potrzebowałem tego in operator, ale działa jako kontrprzykład "powinniśmy zawsze unikać ustawiania wartości na niezdefiniowaną". - Alan Tam
Jak wspomniałem @ HüseyinYağlı, jeśli zaznaczysz jsperf link, wydajność znacznie się zmieniła między różnymi metodami dla większości przeglądarek, ponieważ ta odpowiedź została pierwotnie napisana. Firefox jest jednym z niewielu, które wciąż ma znaczącą przewagę dzięki wykorzystaniu metod tablicowych lub obiektowych, ale w przypadku wielu innych przeglądarek różnice są znikome. - kevinmicke


To powróci undefined.

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

undefined jest specjalną stałą wartością. Możesz więc powiedzieć, np.

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

Jest to prawdopodobnie najlepszy sposób na sprawdzenie brakujących kluczy. Jak jednak zaznaczono w komentarzu poniżej, teoretycznie możliwe jest, że chcesz mieć rzeczywistą wartość undefined. Nigdy nie musiałem tego robić i nie potrafię wymyślić od razu przyczyny, dla której kiedykolwiek chciałbym, ale tylko ze względu na kompletność, możesz użyć in operator

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

114
2017-07-08 13:24



Co jeśli klucz istnieje, ale jego wartość jest rzeczywiście niezdefiniowana? - Ates Goral
Powinieneś użyć === zamiast == podczas porównywania z undefined, w przeciwnym razie wartość null będzie porównywalna z undefined. - Matthew Crumley
Eli, twoja odpowiedź nie jest całkowicie dokładna. Ponieważ i tak (i ​​oczywiście to nigdy nie powinno być zrobione) niezdefiniowane nie jest specjalną stałą wartością. W rzeczywistości nie jest to zarezerwowane słowo kluczowe i można go zastąpić, powiedzmy na przykład var undefined = 42;. Podczas testowania niezdefiniowanych rekwizytów zawsze powinieneś używać ((typeof variable) === "undefined"). - ssice
@ssice undefined nie jest zapisywalną własnością według specyfikacji ecma-international.org/ecma-262/5.1/#sec-15.1.1.3 - therealrootuser
We wcześniejszych wersjach JavaScript "niezdefiniowane" i "NaN" były zmiennymi zmiennymi, które można ponownie zdefiniować lub przypisać inne wartości. To była zła rzecz. Zostało to naprawione w ECMAScript 5. - jkdev


The zaakceptowana odpowiedź odnosi się do Obiekt. Uważaj przy użyciu in operator na Szyk znaleźć dane zamiast kluczy:

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

Aby przetestować istniejące elementy w tablicy: Najlepszy sposób, aby znaleźć element w tablicy JavaScript?


22
2017-07-01 12:45





"key" in obj

Czy prawdopodobne jest testowanie wartości atrybutów obiektu, które są bardzo różne od kluczy tablicowych


20
2018-04-25 15:45



Kod ten będzie prawdziwy także dla klucza zdefiniowanego w prototypie klasy: funkcja A () {}; A.prototype.b = 2; var a = new A (); Wtedy "b" w a jest prawdziwe. Chociaż a.hasOwnProperty ("b") jest oczywiście nieprawdziwe. - Alexander


Trzy sposoby sprawdzenia, czy właściwość jest obecna w obiekcie javascript:

  1. !! obj.theProperty
    Zamieni wartość na bool. zwraca TRUE dla wszystkich z wyjątkiem wartości "false"
  2. "Właściwość" w obj
    Zwróci wartość true, jeśli właściwość istnieje, bez względu na jej wartość (nawet pustą)
  3. obj.hasOwnProperty ("theProperty")
    Nie sprawdza łańcucha prototypów. (ponieważ wszystkie obiekty mają metodę "toString", 1 i 2 zwrócą wartość true, a 3 może zwrócić wartość false).

Odniesienie:

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


20
2017-11-12 09:19





Jeśli używasz underscore.js biblioteka następnie operacje obiekt / tablica stają się proste.

W twoim przypadku można użyć metody. Przykład:

yourArray = {age: "10"}

_.has(yourArray, "age")

zwraca prawdziwe 

Ale,

_.has(yourArray, "invalidKey")

zwraca fałszywy


13
2018-05-29 19:37





Odpowiedź:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

Wyjaśnienie:

The in operator sprawdzi, czy klucz istnieje w obiekcie. Jeśli zaznaczyłeś, czy wartość była niezdefiniowana: if (myObj["key"] === 'undefined'), możesz napotkać problemy, ponieważ klucz może istnieć w twoim obiekcie z undefined wartość.

Z tego powodu znacznie lepiej jest najpierw użyć in operator, a następnie porównaj wartość znajdującą się wewnątrz klucza, gdy już wiesz, że istnieje.


10
2018-06-22 02:29