Zakładając, że deklaruję
var ad = {};
Jak mogę sprawdzić, czy ten obiekt będzie zawierał właściwości zdefiniowane przez użytkownika?
javascript
Ricky
źródło
źródło
Object.keys
byłoby najłatwiejsze:var a = [1,2,3];a.something=4;console.log(Object.keys(a))
ponieważ jest już częścią ECMA 5, możesz go bezpiecznie dopasować: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})
.Możesz użyć wbudowanej
Object.keys
metody, aby uzyskać listę kluczy obiektu i przetestować jego długość.źródło
var str = "MyString"; Object.keys(str);
, konsola wyświetla 8 kluczy, od 0 do 7, dla każdego znaku. Czy nadal nie rozumiem odpowiedzi.A co z prostą funkcją?
hasOwnProperty
Wywołanie metody bezpośrednio poObject.prototype
to tylko, aby dodać trochę więcej bezpieczeństwa , wyobraź sobie następujące używając normalnegoobj.hasOwnProperty(...)
połączenia:Uwaga: (na przyszłość) Powyższa metoda opiera się na
for...in
instrukcji, a ta instrukcja iteruje tylko po wyliczalnych właściwościach, w obecnie najszerzej zaimplementowanym standardzie ECMAScript (3. edycja) programista nie ma możliwości tworzenia niewliczalnych właściwości .Jednak zmieniło się to teraz wraz z ECMAScript 5th Edition i jesteśmy w stanie tworzyć niewliczalne, niezapisywalne lub nieusuwalne właściwości, więc powyższa metoda może zawieść , np .:
Rozwiązaniem tego problemu w ECMAScript 5 byłoby:
Że
Object.getOwnPropertyNames
metoda zwracaArray
zawierający nazwy wszystkich tych własnych właściwości obiektu, przeliczalnego czy nie , metoda ta jest realizowana obecnie przez producentów przeglądarek, to już na Chrome 5 Beta oraz najnowszy WebKit Nightly buduje.Object.defineProperty
jest również dostępny w tych przeglądarkach i najnowszych wydaniach Firefoksa 3.7 Alpha.źródło
hasOwnProperty
właściwość, funkcja może się zawiesić ... Wiem, że jestem trochę paranoikiem ... ale czasami nie wiesz, w jakim środowisku twój kod będzie używany, ale wiesz, jakiej metody chcesz użyć ...Object.prototype
, nie jest ona wyliczana przezfor...in
. WięcisEmptyObject({toString:1})
zawiedzie. Jest to jeden z nieszczęsnych powodów nie można całkiem używająObject
jako odwzorowanie ogólnego przeznaczenia.Dzięki jQuery możesz użyć:
Od jQuery 1.4 ta metoda sprawdza zarówno właściwości samego obiektu, jak i właściwości odziedziczone po prototypach (w tym sensie, że nie używa hasOwnProperty).
Z ECMAScript 5th Edition w nowoczesnych przeglądarkach (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) możesz skorzystać z wbudowanej metody Object.keys :
Lub zwykły stary JavaScript:
źródło
Najnowsze przeglądarki (i node.js) obsługują Object.keys (), który zwraca tablicę ze wszystkimi kluczami w literale obiektu, więc można wykonać następujące czynności:
Obsługa przeglądarek: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
źródło
Jeśli używasz underscore.js, możesz użyć funkcji _.isEmpty :
źródło
_.isEmpty([]) // true
Jeśli chcesz użyć lodash , możesz użyć tej
some
metody.Zobacz ten mały przykład jsbin
źródło
_.some([1, 2]) // true
Jeśli musisz być bezpieczny i poszukać prototypów Object (są one dodawane przez niektóre biblioteki, a nie są tam domyślnie):
źródło
Składnik oznacza właściwość członka, zmienną składową, jakkolwiek chcesz to nazwać> _>
Powyższy kod zwróci WSZYSTKO, w tym toString ... Jeśli chcesz tylko sprawdzić, czy prototyp obiektu został rozszerzony:
Uwaga A: Sprawdzamy, czy element członkowski obiektu zastępczego ma ten sam typ, co element członkowski obiektu testowego. Jeśli jest to rozszerzenie, typ składowy obiektu dummyobject powinien być „niezdefiniowany”
źródło
Proste, działa w każdej przeglądarce i chociaż technicznie jest to pętla dla wszystkich kluczy w obiekcie, NIE przechodzi przez nie wszystkie ... albo jest 0 i pętla nie działa, albo jest kilka i zrywa się po pierwszym jeden (ponieważ sprawdzamy tylko, czy jest JAKIEKOLWIEK ... więc po co kontynuować?)
źródło
Bardzo późna odpowiedź, ale tak można sobie z tym poradzić w przypadku prototypów.
źródło
Gdy upewnisz się, że obiekt jest obiektem zdefiniowanym przez użytkownika, najłatwiejszym sposobem określenia, czy UDO jest pusty, będzie następujący kod:
Chociaż ta metoda jest (z natury) dedukcyjna, - jest najszybsza i najszybsza z możliwych.
ps:! nie używaj go na obiektach zdefiniowanych w przeglądarce.
źródło
Późna odpowiedź, ale niektóre struktury traktują obiekty jako wyliczalne. Dlatego bob.js może to zrobić w następujący sposób:
źródło
Możesz użyć następujących:
Podwójny huk !! wyszukiwanie właściwości
hasOwnProperty To jest coś, czego używałem:
Jednak JavaScript zdecydował się nie chronić nazwy metody, więc można było przy niej manipulować.
prop w myObject
typ
Jednak nie sprawdza null.
Myślę, że to najlepszy sposób.
w operatorze
wynik:
Oto link, który prowadzi do bardziej szczegółowych informacji na temat operatora in: Określanie, czy właściwość obiektu istnieje
źródło
Funkcja ES6
Przykłady:
źródło
Co powiesz na to?
źródło