Jak sprawdzić, czy obiekt ma określoną właściwość w JavaScript?

1486

Jak sprawdzić, czy obiekt ma określoną właściwość w JavaScript?

Rozważać:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

Czy to najlepszy sposób, aby to zrobić?

płaszcze
źródło
21
Napisałem test jsperf z odpowiedziami wszystkich, aby zobaczyć, który jest najszybszy: jsperf.com/dictionary-contains-key
styfle
('propertyName' w Object)? „Właściwość jest tam”: „Właściwość nie istnieje”
Mohan Ram
1
@styfle dzięki za test jsperf. ini hasOwnPropertywyszło mi znacznie wolniej niż inne (98% wolniej). Nie jestem zaskoczony hasOwnPropertywolnością, ale jestem zaskoczony in.
evanrmurphy

Odpowiedzi:

1423

Naprawdę jestem zdezorientowany otrzymanymi odpowiedziami - większość z nich jest po prostu błędna. Oczywiście możesz mieć właściwości obiektu, które mają niezdefiniowane, zerowe lub fałszywe wartości. Po prostu zmniejszenie kontroli własności do typeof this[property], a nawet gorzej, x.keyda całkowicie mylące wyniki.

To zależy od tego, czego szukasz. Jeśli chcesz wiedzieć, czy obiekt fizycznie zawiera właściwość (i nie pochodzi ona skądś z łańcucha prototypów), to object.hasOwnPropertyjest to właściwa droga. Wszystkie nowoczesne przeglądarki obsługują to. (Brakowało go w starszych wersjach Safari - 2.0.1 i starszych - ale te wersje przeglądarki są już rzadko używane).

Jeśli szukasz tego, czy obiekt ma właściwość iterowalną (pojawi się iteracja po właściwościach obiektu), wówczas wykonanie: prop in objectda pożądany efekt.

Ponieważ używanie hasOwnPropertyjest prawdopodobnie tym, czego chcesz, a biorąc pod uwagę, że możesz chcieć metody rezerwowej, przedstawiam ci następujące rozwiązanie:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

Powyższe jest działającym rozwiązaniem dla różnych przeglądarek hasOwnPropertyz jednym zastrzeżeniem: nie jest w stanie rozróżnić przypadków, w których identyczna właściwość znajduje się w prototypie i instancji - po prostu zakłada, że ​​pochodzi ona z prototypu. Możesz zmienić to na łagodniejsze lub bardziej surowe, w zależności od twojej sytuacji, ale przynajmniej powinno to być bardziej pomocne.

John Resig
źródło
5
@grantwparks Jeśli budujesz prostą wtyczkę z suwakiem i chcesz sprawdzić, czy istnieje element opcji, może to być więcej niż potrzebne. Możesz po prostu zrobić coś takiego var w = opts.w || 100;. Ale jeśli masz coś w rodzaju biblioteki, być może będziesz musiał zajrzeć trochę dalej.
Halil Özgür,
@ kralco626: Tak, obecnie wydaje mi się, że korzystanie z hasOwnProperty () jest całkiem bezpieczne - ale jeśli chodzi o naprawdę bezpieczne rozwiązanie dla różnych przeglądarek, skorzystaj z John's.
Jacob
Co z tymczasową zmianą __proto__na zero? Prosty impl: function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }(Case with obj.constructor.prototypenależy dodać).
średni Joe
2
@Kasztan __proto__jest niestandardowy i nie działa w niektórych starszych przeglądarkach. I nawet po ostatnim dodaniu Object.getPrototypeOfstandardu mówi, że nadal nie można zmienić prototypu istniejącego obiektu.
Matt Browne,
13
for(prop in object)Pętli iteracje właściwości tylko przeliczalnego. prop in objectSprawdza jednak, czy objectma właściwość propgdzieś w łańcuchu prototypowym, niezależnie od tego, czy jest ona wyliczalna, czy nie.
Oriol
283

Z Underscore.jslub ( jeszcze lepiej ) lodash:

_.has(x, 'key');

Które wywołania Object.prototype.hasOwnProperty, ale (a) jest krótszy do wpisania, a (b) używa „bezpiecznego odniesienia do hasOwnProperty” (tzn. Działa, nawet jeśli hasOwnPropertyzostanie zastąpione).

W szczególności lodash definiuje się _.hasjako:

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty
Brian M. Hunt
źródło
52
Sądzę, że to dlatego, że „dodaj tę bibliotekę” rzadko jest popularnym rozwiązaniem, nawet jeśli pytanie dotyczy złożonej manipulacji DOM, a odpowiedź brzmi „idź użyć jQuery”.
Winfield Trail
11
Rozumiem twój punkt @sudowned, dzięki. Nawiasem mówiąc, jeśli ktoś byłby przeciwny włączeniu całej biblioteki lodash, można skompilować podskładniki lub ujawnić npm install lodash.hasmoduł npm z hasfunkcją, która kompiluje do 175 bajtów po zminimalizowaniu. Warto również przyjrzeć lodash.has/index.jssię, jak działa bardzo popularna i zaufana biblioteka.
Brian M. Hunt
9
i lodashwersje działają z tym: .has(undefined, 'someKey') => falsepodczas underscorepowrotuundefined
Brad Parks
13
Dla wszystkich narzekających na dodanie lodashjako „kolejnej” zależności: jest to dość powszechna (jeśli nie najczęstsza) biblioteka do tego rodzaju rzeczy. Miłej zabawy wymyślanie koła na nowo.
Priidu Neemre,
11
Nawet jeśli chcesz wynaleźć koło na nowo, sprawdzenie istniejących kół nie jest złym pomysłem.
AturSams,
147

Co powiesz na?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}
Whisher
źródło
13
Należy zauważyć, że działa z „obiektami” w wąskim znaczeniu, więc zadeklarowanym jako {} lub utworzonym za pomocą konstruktora, nie akceptuje tablic ani prymitywów. Nie dlatego, że wymagało tego PO, ale niektóre inne odpowiedzi przedstawiają techniki, które są szersze (praca z tablicami, łańcuchami itp.)
Danubian Sailor
@ РСТȢѸФХѾЦЧШЩЪЫЬѢѤЮѦѪѨѬѠѺѮѰѲѴ dziękuję za zwrócenie na to uwagi (zaakceptowana odpowiedź nie zawiera szczegółowych informacji na temat tego, dlaczego należy korzystać z inoperatora, czy nie. Należy również pamiętać, że inoperator ma doskonałą obsługę przeglądarki IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ stackoverflow.com/questions/2920765/…
Adrien Be
2
Operator insprawdza również właściwości prototypu, a hasOwnPropertyiteruje tylko właściwości zdefiniowane przez użytkownika. Odniesienie: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
adi518
2
'key' in x zrobić pracę z tablicami. Dowód: stackoverflow.com/questions/33592385/…
CosmoMyzrailGorynych
Wydaje się, że najlepsza i najkrótsza opcja
użytkownik365314
132

Uwaga : poniższe opcje są obecnie w dużej mierze przestarzałe dzięki trybowi ścisłemu i hasOwnProperty. Poprawnym rozwiązaniem jest użycie trybu ścisłego i sprawdzenie obecności właściwości za pomocą obj.hasOwnProperty. Ta odpowiedź poprzedza obie te rzeczy, przynajmniej jako szeroko zaimplementowane (tak, to jest tak stare). Weź pod uwagę następujące uwagi historyczne.


Należy pamiętać, że undefinedjest (niestety) nie słowem zarezerwowanym w JavaScript, jeśli nie jesteś w trybie ścisłym. Dlatego ktoś (oczywiście ktoś inny) może mieć świetny pomysł na redefiniowanie go, złamanie kodu.

Bardziej niezawodna metoda jest zatem następująca:

if (typeof(x.attribute) !== 'undefined')

Z drugiej strony ta metoda jest bardziej szczegółowa, a także wolniejsza. : - /

Częstą alternatywą jest upewnienie się, że undefinedjest faktycznie niezdefiniowana, np. Poprzez wstawienie kodu do funkcji, która akceptuje dodatkowy parametr, zwany undefined, który nie przekazuje wartości. Aby upewnić się, że nie przekroczyła wartości, możesz po prostu nazwać ją od razu, np .:

(function (undefined) {
     your code 
    if (x.attribute !== undefined)
         mode code 
})();
Konrad Rudolph
źródło
6
Po prostu ciekawy, skoro void 0zdefiniowano, aby zwrócić kanonikę undefined, czy można to zrobić x.attribute !== void 0?
Brian M. Hunt
1
Brian: Nie jestem ekspertem, ale to z pewnością wydaje się sprytnym sposobem, aby zrobić to dobrze.
Christopher Smith
37
Jeśli słynny „ktoś inny” przedefiniuje to, co niezdefiniowane, myślę, że najlepszym rozwiązaniem byłoby przepisanie TEGO kodu.
Oskar Holmkratz
3
Najlepiej mieć solidny, nieokreślony var, pracować w zamknięciu i mieć niezrównaną sygnaturę funkcji:(function (undefined) { // undefined is actually undefined here })();
bgusach
1
@evanrmurphy Nie używaj tego, jest poważnie przestarzały (patrz uwaga na początku mojej odpowiedzi).
Konrad Rudolph,
55
if (x.key !== undefined)

Wydaje się, że Armin Ronacher już mnie pobił , ale:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

Bezpieczniejsze, ale wolniejsze rozwiązanie, jak wskazano przez Konrad Rudolph i Armin Ronacher będzie:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};
enobrev
źródło
2
Nie sądzę, żeby to wystarczyło. x.hasOwnProperty('toString') === true;
Joe Simmons,
Nie prosząc, aby się nie zgodzić, ale zrozumieć. Czy jest jakiś punkt, w którym x.hasOwnProperty zwróciłoby cokolwiek poza wartością logiczną prawda lub fałsz? Jeśli nie, opublikowany kod powinien działać za każdym razem. Przypuszczam, że może gdyby metoda została zastąpiona, ale opieranie się na wyniku nigdy nie byłoby wiarygodne, chyba że znasz metodę zastępowania.
enobrev
1
Myślę, że mamy nieporozumienia. Mam na myśli, że przy użyciu tej metody można powiedzieć, że „toString” jest własną własnością, ale tak nie jest.
Joe Simmons
3
Object.prototypejuż ma wbudowane, poprawne hasOwnProperty. Zastąpienie go niepoprawną implementacją (1. Właściwości mogą mieć wartość undefined, 2. To da fałszywe alarmy dla odziedziczonych właściwości) to po prostu strasznie zły pomysł. Niepoprawne odpowiedzi można i należy usunąć. Nie wiem, czy mógłbyś to zrobić we wrześniu '08, kiedy zobaczyłeś odpowiedź Resiga , więc komentuj, by zasugerować, by zrobić to teraz.
TJ Crowder,
36

Za pomocą inoperatora można sprawdzić, czy właściwość istnieje na obiekcie:

x = {'key': 1};
alert("key" in x);

Możesz również wykonać pętlę przez wszystkie właściwości obiektu za pomocą for - inpętli, a następnie sprawdzić określoną właściwość:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

Należy rozważyć, czy ta właściwość obiektu jest policzalna, czy nie, ponieważ właściwości niepoliczalne nie pojawią się w for-inpętli. Ponadto, jeśli właściwość wyliczalna przesłania właściwość prototypu, której nie można wyliczyć, nie pojawi się w programie Internet Explorer 8 i wcześniejszych wersjach.

Jeśli chcesz wyświetlić listę wszystkich właściwości instancji, niezależnie od tego, czy są one wyliczalne, czy nie, możesz użyć

Object.getOwnPropertyNames(x);

Zwróci tablicę nazw wszystkich właściwości istniejących na obiekcie.

Na koniec możesz użyć operatora typeof, aby bezpośrednio sprawdzić typ danych właściwości obiektu:

if (typeof x.key == "undefined") {
    alert("undefined");
}

Jeśli właściwość nie istnieje na obiekcie, zwróci ciąg niezdefiniowany. W przeciwnym razie zwróci odpowiedni typ właściwości. Należy jednak pamiętać, że nie zawsze jest to prawidłowy sposób sprawdzania, czy obiekt ma właściwość, czy nie, ponieważ można mieć właściwość ustawioną na wartość niezdefiniowaną, w którym to przypadku użycie typeof x.keynadal zwróciłoby wartość true (nawet jeśli klucz jest nadal w obiekcie).

Aktualizacja: możesz sprawdzić, czy właściwość istnieje, porównując ją z niezdefiniowaną właściwością javascript

if (x.key === undefined) {
    alert("undefined");
}

Powinno to działać, chyba że klucz został specjalnie ustawiony undefinedna obiekcie x

goonerify
źródło
Twoja część aktualizacji jest nieprawidłowa. Proszę spojrzeć tutaj: jsfiddle.net/sbgg04yg
Number945
Zaktualizowano, aby pokazać scenariusze, w których porównanie z niezdefiniowaną właściwością JavaScript może się nie powieść
goonerify
31

Przejdźmy przez to zamieszanie. Po pierwsze, uprośćmy, zakładając, że hasOwnPropertyjuż istnieje; dotyczy to zdecydowanej większości obecnie używanych przeglądarek.

hasOwnPropertyzwraca true, jeśli przekazana do niego nazwa atrybutu została dodana do obiektu. Jest całkowicie niezależny od faktycznie przypisanej wartości, która może być dokładnie undefined.

W związku z tym:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

Jednak:

var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

Problem polega na tym, co dzieje się, gdy obiekt w łańcuchu prototypów ma atrybut o wartości niezdefiniowanej? hasOwnPropertybędzie dla niego fałszywa i tak też będzie !== undefined. Jednak for..innadal będzie to wymieniać w wyliczeniu.

Najważniejsze jest to, że nie ma sposobu na przeglądarkę (ponieważ Internet Explorer nie ujawnia __prototype__), aby ustalić, że określony identyfikator nie został dołączony do obiektu lub czegokolwiek w jego łańcuchu prototypów.

AnthonyWJones
źródło
24

Jeśli szukasz nieruchomości, wybierz „NIE”. Chcesz:

if ('prop' in obj) { }

Zasadniczo nie należy się przejmować, czy właściwość pochodzi od prototypu czy obiektu.

Ponieważ jednak użyłeś „klucza” w przykładowym kodzie, wygląda na to, że traktujesz obiekt jako skrót, w którym to przypadku Twoja odpowiedź miałaby sens. Wszystkie klucze skrótu byłyby właściwościami w obiekcie, a unikasz dodatkowych właściwości prototypu.

Odpowiedź Johna Resiga była bardzo wyczerpująca, ale myślałem, że nie była jasna. Zwłaszcza kiedy należy użyć „prop” w obj.

Gerard ONeill
źródło
1
Należy pamiętać, że inoperator ma doskonałą obsługę przeglądarki IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ stackoverflow.com/questions/2920765/…
Adrien Be
Jak wskazano w innym komentarzu dotyczącym używania inoperatora: „działa z„ obiektami ”w wąskim znaczeniu, tak zadeklarowanym jako {} lub utworzonym za pomocą konstruktora, nie akceptuje tablic ani prymitywów. niektóre inne odpowiedzi przedstawiają techniki, które są szersze (praca z tablicami, łańcuchami itp.) ”
Adrien Be
1
Komentowanie, ponieważ zostałem dwukrotnie oceniony bez komentarza. Ale nadal podoba mi się moja odpowiedź. Być może ktokolwiek to zrobił, potrzebował „kompleksowej” odpowiedzi na wszystkie sposoby testowania wszystkich rodzajów właściwości. Ale moja odpowiedź jest pojęciowa i na to zwięzła. Re: Adrien Be, niezliczona właściwość to taka, która nie jest przeznaczona dla ogólnego zakresu użytkowników, więc koncepcyjnie „w” jest w porządku;)
Gerard ONeill
16

Do testowania prostych obiektów użyj: if (obj[x] !== undefined)

Jeśli nie wiesz, jaki typ obiektu jest używany, użyj: if (obj.hasOwnProperty(x))

Wszystkie inne opcje są wolniejsze ..

Detale

Ocena wydajności 100 000 000 cykli w ramach Nodejsa do 5 opcji sugerowanych przez innych tutaj:

function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }

Ocena mówi nam, że jeśli nie chcemy konkretnie sprawdzić łańcucha prototypowego obiektu, a także samego obiektu, nie powinniśmy używać wspólnej formy: if (X in Obj)... jest on od 2 do 6 razy wolniejszy w zależności od przypadku użycia

hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms

Podsumowując, jeśli Twój Obj niekoniecznie jest prostym obiektem i chcesz uniknąć sprawdzania łańcucha prototypowego obiektu i upewnić się, że x jest własnością Obj bezpośrednio, użyj „if (obj.hasOwnProperty (x)) ...”.

W przeciwnym razie, gdy używasz prostego obiektu i nie martwisz się łańcuchem prototypowym obiektu, używanie if (typeof(obj[x]) !== 'undefined')...jest najbezpieczniejszym i najszybszym sposobem.

Jeśli użyjesz prostego obiektu jako tabeli mieszającej i nigdy nie zrobisz nic dziwnego, użyłbym tego, if (obj[x])...ponieważ uważam, że jest on dużo bardziej czytelny.

Baw się dobrze.

davidhadas
źródło
15

Tak to jest :) Myślę, że możesz też zrobić, Object.prototype.hasOwnProperty.call(x, 'key')co powinno również działać, jeśli xma właściwość o nazwie hasOwnProperty:)

Ale to sprawdza własne właściwości. Jeśli chcesz sprawdzić, czy ma właściwość, która może być powiązana, możesz użyć typeof x.foo != 'undefined'.

Armin Ronacher
źródło
14
if (typeof x.key != "undefined") {

}

Ponieważ

if (x.key)

kończy się niepowodzeniem, jeśli x.keyrozwiązuje false(na przykład x.key = "").

Peter Mortensen
źródło
Nie będzie poprawny Wypróbuj następujący obiekt, const x = {key: undefined};który zwróci false z tym rozwiązaniem, podczas gdy x.hasOwnProperty('key')); // truei Reflect.has(x, 'key')); // true. Właściwość faktycznie istnieje, ale jej wartość to undefined.
Wilt
14

Możesz także użyć obiektu ES6Reflect :

x = {'key': 1};
Reflect.has( x, 'key'); // returns true

Dokumentację dotyczącą MDN dla Reflect.hasmożna znaleźć tutaj .

Metoda statyczna Reflect.has()działa jak operator in jako funkcja.

Więdnąć
źródło
10

OK, wygląda na to, że mam właściwą odpowiedź, chyba że nie chcesz dziedziczonych właściwości:

if (x.hasOwnProperty('key'))

Oto kilka innych opcji dołączania odziedziczonych właściwości:

if (x.key) // Quick and dirty, but it does the same thing as below.

if (x.key !== undefined)
płaszcze
źródło
4
Zastrzeżenie x.hasOwnProperty („klucz”) może być prawdziwe, podczas gdy x.key! == undefined nie jest prawdziwe.
AnthonyWJones
4
Dla var x = { key: false };tej x.keymetody byłoby błędne.
Mark K Cowan
2
jeśli (x.key) jest niepoprawny, tak jakby x = {klucz: 0}, nie przejdzie sprawdzania.
someUser
10

Nie rób tego object.hasOwnProperty(key)), to naprawdę złe, ponieważ metody te mogą być zaciemnione przez właściwości obiektu, o którym mowa - rozważ { hasOwnProperty: false }- lub obiekt może być obiektem zerowym (Object.create(null)).

Najlepszym sposobem jest zrobienie Object.prototype.hasOwnProperty.call(object, key)lub:

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));
Abdullah Danyal
źródło
3
Zgadzam się z tą metodą i powinna to być zaakceptowana odpowiedź, ponieważ jest to najbezpieczniejszy sposób przy zachowaniu wydajności! eslint.org/docs/rules/no-prototype-builtins mówi: „Na przykład, serwer WWW nie mógłby parsować danych wejściowych JSON od klienta i wywoływać hasOwnProperty bezpośrednio na obiekcie wynikowym, ponieważ złośliwy klient mógłby wysłać wartość JSON jak {"hasOwnProperty": 1} i spowodować awarię serwera. "
Arman,
7

Innym stosunkowo prostym sposobem jest użycie Object.keys. Zwraca to, arrayco oznacza, że ​​masz wszystkie funkcje tablicy.

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

Chociaż jesteśmy w świecie z doskonałą obsługą przeglądarki. Ponieważ to pytanie jest tak stare, pomyślałem, że dodam to: Można go bezpiecznie używać od wersji JS 1.8.5

Jamie Hutber
źródło
Racja, ale co, jeśli chcesz wiedzieć, czy info ma właściwość o nazwie coś jeszcze? To jest myśl, czego szuka OP.
Victorio Berra,
2
Potem zrobiłbyśObject.keys(info).indexOf('someotherthing') !== -1
hippietrail
7

hasOwnProperty "można wykorzystać do ustalenia, czy obiekt ma określoną właściwość jako bezpośrednią właściwość tego obiektu; w przeciwieństwie do operatora in , ta metoda nie sprawdza łańcucha prototypów obiektu."

Więc najprawdopodobniej za to, co wydaje się przez swoje pytanie, nie chcesz używać hasOwnProperty, który określa, czy właściwość istnieje jako przyłączone bezpośrednio do samego obiektu ,.

Jeśli chcesz ustalić, czy właściwość istnieje w łańcuchu prototypów, w którym chcesz używać, na przykład:

if( prop in object ){ // do something }

Mam nadzieję, że to pomoże.

rogopag
źródło
Dostaję operator „Cannot use” in ”do wyszukiwania„ prop ”w myObject”
Victorio Berra,
3

Z ryzykiem masowego głosowania w dół, jest inna opcja dla konkretnego przypadku. :)

Jeśli chcesz przetestować członka na obiekcie i chcesz wiedzieć, czy został ustawiony na coś innego niż:

  • ''
  • fałszywe
  • zero
  • nieokreślony
  • 0 ...

wtedy możesz użyć:

var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
        // member is set, do something
}
arkod
źródło
Kompaktowy i wygodny
Frederik Witte
Linterowi się to nie spodoba: eslint.org/docs/rules/no-extra-boolean-cast
Wilt
2

Rozwiązanie ECMA Script 6 z odbiciem. Utwórz opakowanie takie jak:

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg
Zaszkodzić
źródło
Czy to najlepszy sposób, aby to zrobić, gdy kierujesz reklamy na> = ES6?
hippietrail
1
Imho to najkrótsza i najprostsza odpowiedź, ale może nie najszybsza w kodzie wykonawczym. Ale prędkość nie jest już problemem.
Harm
2

Istnieje metoda „hasOwnProperty” istnieje na obiekcie, ale nie zaleca się bezpośredniego wywoływania tej metody, ponieważ czasami obiekt może mieć wartość NULL lub niektóre właściwości istnieją na obiekcie, takie jak: { hasOwnProperty: false }

Lepszym sposobem byłoby:

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));

vikram jeet singh
źródło
2

Możesz użyć następujących metod:

var obj = {a:1}
console.log('a' in obj)               //1
console.log(obj.hasOwnProperty('a'))  //2
console.log(Boolean(obj.a))         //3

Różnice między następującymi podejściami są następujące:

  1. W podejściu pierwszym i trzecim nie tylko szukamy obiektu, ale także jego łańcucha prototypowego. Jeśli obiekt nie ma właściwości, ale właściwość jest obecna w łańcuchu prototypów, da wartość true.

 var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log('b' in obj)
    console.log(Boolean(obj.b))

  1. Drugie podejście sprawdzi tylko swoje właściwości. Ex -

var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log(obj.hasOwnProperty('b'))

  1. Różnica między pierwszym a trzecim polega na tym, że jeśli istnieje właściwość, której wartość jest niezdefiniowana, trzecie podejście da wartość false, a pierwsze da wartość true.

var obj = {
      b : undefined
    }
    console.log(Boolean(obj.b))
    console.log('b' in obj);

Komal Bansal
źródło
1

Musisz użyć tej metody object.hasOwnProperty(property). Zwraca true, jeśli obiekt ma właściwość, i false, jeśli obiekt nie.

John Anisere
źródło
-1

Jeśli sprawdzany klucz jest przechowywany w zmiennej , możesz to sprawdzić w następujący sposób:

x = {'key': 1};
y = 'key';
x[y];
Steven Penny
źródło
Czym różni się to koncepcyjnie od testowania x [„klucza”]? A czym to się różni od x.key? Poza dostępem do tablicy oczywiście ...
Gerard ONeill
-1

Po co nadmiernie komplikować rzeczy, kiedy możesz to zrobić:

var isProperty =  (objectname.keyname || "") ? true : false;

Prosty i przejrzysty w większości przypadków ...

Alex
źródło
Najprostszym z nich jest var isProperty = !! nazwa_obiektu.nazwa;
John
Jeśli obiekt jest następujący const objectName = { keyname: false };, powinien zwrócić wartość true, ponieważ keynamejest to właściwość objectname. Ale ponieważ wartość jest fałszywa, przy tej logice zwróci wartość false.
Wilt