Jak sprawdzić, czy wartość jest obiektem w JavaScript?
javascript
object
types
javascript-objects
Danny Fox
źródło
źródło
null
jest obiektem).Odpowiedzi:
AKTUALIZACJA :
Ta odpowiedź jest niepełna i daje mylące wyniki . Na przykład, w JavaScript
null
jest również brany pod uwagę rodzaj tekstuobject
, nie wspominając o kilku innych przypadkach krawędzi. Postępuj zgodnie z poniższymi zaleceniami i przejdź do innej „najbardziej pozytywnej (i poprawnej!) Odpowiedzi” .Oryginalna odpowiedź :
Spróbuj użyć
typeof(var)
i / lubvar instanceof something
.EDIT: Ta odpowiedź daje wyobrażenie o tym, jak zbadać właściwości zmienna, ale to nie recepta kuloodporne (w końcu nie ma przepis w ogóle!) W celu sprawdzenia, czy jest to obiekt, z dala od niego. Ponieważ ludzie zwykle szukają czegoś do skopiowania stąd bez przeprowadzania badań, zdecydowanie polecam skorzystanie z drugiej, najbardziej pozytywnej (i poprawnej!) Odpowiedzi.
źródło
typeof
jest operatorem, więc nie ma takiej potrzeby()
.typeof
zwraca „obiekt” dla wartości null, która nie jest obiektem iinstanceof
nie działa dla obiektów utworzonych przy użyciuObject.create(null)
.Jeśli
typeof yourVariable === 'object'
jest to obiekt lub zero. Jeśli chcesz wykluczyć null, po prostu zrób totypeof yourVariable === 'object' && yourVariable !== null
.źródło
yourVariable !== null
lepsza praktyka?typeof null == 'object'
nie zostanie to naprawione w ES6 . Powiedzieli:This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible.
typeof
ponieważ zawiera ona kilka specjalnych przypadków, które niekoniecznie mają sens. Jeśli próbujesz rozróżnić tablice od obiektów, które nie są tablicami, zdecydowanie nie chcesz używaćtypeof
.Object.prototype.toString.call(yourVar)
, będąc Twoim Variem, co musisz sprawdzić. W przypadku tablicObject.prototype.toString.call([1,2])
zwroty[object Array]
Zdefiniujmy „obiekt” w JavaScript . Według dokumentów MDN każda wartość jest albo obiektem, albo prymitywem:
Co to jest prymitywne?
3
'abc'
true
null
undefined
Co to jest obiekt (tzn. Nie prymityw)?
Object.prototype
Object.prototype
Function.prototype
Object
Function
function C(){}
- funkcje zdefiniowane przez użytkownikaC.prototype
- własność prototypu funkcji zdefiniowanej przez użytkownika: nie jest toC
prototypnew C()
- „nowy” - funkcja zdefiniowana przez użytkownikaMath
Array.prototype
{"a": 1, "b": 2}
- obiekty utworzone za pomocą notacji dosłownejnew Number(3)
- owija się wokół prymitywówObject.create(null)
Object.create(null)
Jak sprawdzić, czy wartość jest obiektem
instanceof
sam w sobie nie zadziała, ponieważ pomija dwa przypadki:typeof x === 'object'
nie będzie działać z powodu fałszywych alarmów (null
) i fałszywych negatywów (funkcje):Object.prototype.toString.call
nie będzie działać z powodu fałszywych trafień dla wszystkich prymitywów:Więc używam:
@ Odpowiedź Daana również wydaje się działać:
ponieważ zgodnie z dokumentami MDN :
Trzecim sposobem, który wydaje się działać (nie jestem pewien, czy to w 100%) jest użycie,
Object.getPrototypeOf
które zgłasza wyjątek, jeśli jego argument nie jest obiektem:źródło
obj === Object(obj)
zwracatrue
tablice.var x = []; console.log(x === Object(x)); // return true
getPrototypeOf
nie działa np. z odwołanymi serwerami proxy, które są obiektami, ale rzucają.({}).toString.apply(obj) === '[object Object]'
rozróżnia tablic od obiektów, które nie są tablicamiunderscore.js zapewnia następującą metodę, aby dowiedzieć się, czy coś jest naprawdę obiektem:
AKTUALIZACJA
Ze względu na poprzedni błąd w wersji V8 i drobną optymalizację mikro prędkości, metoda wygląda następująco od wersji underscore.js 1.7.0 (sierpień 2014):
źródło
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
null
też. Powinna być zaakceptowana odpowiedź.Object.prototype.toString.call(myVar)
wróci:"[object Object]"
jeśli myVar jest obiektem"[object Array]"
jeśli myVar jest tablicąAby uzyskać więcej informacji na ten temat i dlaczego jest to dobra alternatywa dla typeof, sprawdź ten artykuł .
źródło
typeof [] === 'object'
->true
. Właśnie tego potrzebujesz.Object.prototype.toString.call(3)
->"[object Number]"
.Object.prototype.toString.call(new Number(3))
->"[object Number]
"getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
Do prostego sprawdzania względem Object lub Array bez dodatkowego wywołania funkcji (speed). Jak również zamieszczono tutaj .
isArray ()
isObject () - Uwaga: używaj tylko dla literałów obiektowych, ponieważ zwraca wartość false dla obiektów niestandardowych, takich jak nowa data lub nowy obiekt YourCustomObject.
źródło
isObject
działa tylko z literałami obiektowymi. Jeśli utworzę niestandardowy typ, utwórz instancję tego typu i przetestuj go, zwracafalse
Boolean(a)
jest dłuższy, ale o wiele bardziej intuicyjny. Po prostu nie używajnew Boolean(a)
: ( oto dlaczego )!{
znaku. W przypadku tablicy, o ile nie potrzebujesz obsługi IE <9, możesz użyć,Array.isArray()
aby ustalić, czy coś jest tablicą. Pomija wszystkie podane przez Ciebie przypadki testowe.Lubię po prostu:
Jeśli element jest obiektem JS i nie jest tablicą JS, i nie jest
null
… jeśli wszystkie trzy okażą się prawdziwe, wróćtrue
. Jeśli którykolwiek z tych trzech warunków zakończy się niepowodzeniem,&&
test spowoduje zwarcie ifalse
zostanie zwrócony. Wnull
razie potrzeby test można pominąć (w zależności od sposobu użytkowanianull
).DOCS:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_objects/object
http://devdocs.io/javascript/global_objects/array/isarray
http://devdocs.io/javascript/global_objects/null
źródło
new Date()
zwraca obiekt. Tablica z logicznego punktu widzenia nie jest obiektem - chociaż JavaScript obsługuje je i zgłasza jako takie. W praktyce jednak nie jest pomocne, aby były one równe, ponieważ nie są. Obiekt nie malength
na przykład atrybutu i nie ma metod takich jak push (). A czasem możesz chcieć nadać funkcji przeciążone parametry, w których musisz wprowadzić różnicę między tablicą lub obiektem, zwłaszcza jeśli inne parametry zależą od tego, który został podany.length
właściwości ani metod podobnych do tegopush
,Object.create(Array.prototype)
jest banalnym przeciw-przykładem obiektu niebędącego macierzą, który je ma. Cechą wyróżniającą tablice jest to, że są to obiekty egzotyczne z niestandardową, wewnętrzną metodą [[DefineOwnProperty]], ale nadal są obiektami.length
właściwości (miałem na myśli, że literały obiektowelength
domyślnie nie mają atrybutów). Napisałem, że tablice nie są obiektami z logicznego punktu widzenia. Mówię o logice programu. Czasami konieczne jest sprawdzenie, czy tablica jest „rzeczywistą” tablicą, a na pewno nie „prawdziwym” obiektem. Po toArray.isArray()
jest. Wyobraź sobie, że masz funkcję, która akceptuje obiekt lub tablicę obiektów. Sprawdzanie specjalnego atrybutu lub metody jest brudnym rozwiązaniem. Rodzimy sposób jest zawsze lepszy.typeof null
jest"object"
, nie"undefined"
.Z funkcją
Array.isArray
:Bez funkcji
Array.isArray
:Zaskoczyło mnie tylko, ile głosów za błędnymi odpowiedziami 😮
Tylko 1 odpowiedź przeszła moje testy !!! Tutaj stworzyłem moją uproszczoną wersję:
Jeśli chodzi o mnie, jest to jasne i proste i po prostu działa! Oto moje testy:
JESZCZE WIĘCEJ: nie wszystkie odpowiedzi zdają ten test !!! 🙈
Jeśli musisz zweryfikować, że obiekt jest instancją określonej klasy , musisz sprawdzić konstruktor z określoną klasą, na przykład:
prosty test:
W rezultacie będziesz mieć ścisły i solidny kod!
W przypadku, gdy nie będzie tworzyć funkcje takie jak
isDate
,isError
,isRegExp
itp można rozważyć opcję, aby korzystać z tej funkcji uogólnionych:nie będzie działać poprawnie dla wszystkich wspomnianych wcześniej przypadków testowych, ale jest wystarczająco dobry dla wszystkich obiektów (prostych lub skonstruowanych).
isObject
nie będzie działać w przypadku,Object.create(null)
ponieważObject.create
wyjaśniono tutaj wewnętrzne wdrożenie , ale można użyćisObject
bardziej zaawansowanego wdrożenia:Jest już utworzony pakiet na npm v1 w oparciu o tę implementację! I działa dla wszystkich wcześniej opisanych przypadków testowych! 🙂
źródło
isDate
swojego obiektu DataDbject w celu napisania solidnego kodu, w przeciwnym razie będziesz mieć kruchąisObject
metodę.Date
w moim komentarzu zostało źle wybrane, ponieważ tak, odpowiedź dyskutujeDate
. AleDate
jest to tylko jedna z nieskończonych możliwych klas i ta sama zasada dotyczy każdej innej klasy. Przykład:class Foo() { }; var x = new Foo(); isObject(x)
zwracafalse
. Nie wiem dokładnie, jaki jest przypadek użycia OP, ale łatwo jest wyobrazić sobie scenariusze, w których znajomość wszystkich możliwych klas i porównanie z każdą z nich będzie niemożliwe.O mój Boże! Myślę, że może to być krótsze niż kiedykolwiek, zobaczmy to:
Krótki i końcowy kod
Wyjaśnione
Rodzaje zwrotów
null
Zwraca typy obiektów JavaScript (w tym )"object"
Sprawdzanie ich konstruktorów
Sprawdzanie
constructor
właściwości zwraca funkcję z ich nazwami.Przedstawiamy Function.name
Function.name
zwraca tylko do odczytu nazwę funkcji lub"anonymous"
dla zamknięć.źródło
Object.create(null)
i dlaczego miałbyś to zrobić mimo wszystko ...?OK, niech daje to pojęcie zanim odpowiadając na pytanie, w funkcji JavaScript Object są również null, Object, macierze i nawet data, tak jak widać jest nie prosty sposób jak typeof obj === „obiektu”, tak wszystko wspomniane powyżej zwróci prawdę , ale istnieją sposoby, aby to sprawdzić, pisząc funkcję lub używając ram JavaScript, OK:
Teraz wyobraź sobie, że masz ten obiekt, który jest prawdziwym obiektem (nie ma wartości null, funkcji lub tablicy):
Czysty JavaScript:
lub
lub
lub
Możesz po prostu użyć jednej z powyższych funkcji w kodzie, wywołując je, a zwróci true, jeśli jest to obiekt:
Jeśli używasz frameworka JavaScript, zwykle przygotowali dla Ciebie tego rodzaju funkcje, jest ich kilka:
jQuery:
Kątowy:
Podkreślenie i Lodash:
źródło
To zależy od tego, co masz na myśli przez „jest przedmiotem”. Jeśli chcesz wszystkiego, co nie jest prymitywne , tj. Rzeczy, na których możesz ustawić nowe właściwości, powinno to załatwić sprawę:
Wyklucza ona prymitywów (numery zwykły /
NaN
/Infinity
, gładkie stringi, symbole,true
/false
,undefined
inull
), ale powinien wrócić prawdziwe dla wszystkiego innego (w tymNumber
,Boolean
orazString
obiektów). Zauważ, że JS nie określa, jakie obiekty „hosta”, takie jakwindow
lubconsole
, powinny być zwracane, gdy są używane ztypeof
, więc trudno jest je pokryć takim czekiem.Jeśli chcesz wiedzieć, czy coś jest „zwykłym” obiektem, tj. Zostało utworzone dosłownie,
{}
czy za pomocąObject.create(null)
, możesz to zrobić:Edycja 2018 : Ponieważ
Symbol.toStringTag
teraz pozwala dostosować dane wyjścioweObject.prototype.toString.call(...)
,isPlainObject
powyższa funkcja możefalse
w niektórych przypadkach powrócić, nawet jeśli obiekt zaczął działać jako literał. Prawdopodobnie, zgodnie z konwencją, obiekt z niestandardowym znacznikiem łańcuchowym nie jest już dokładnie zwykłym obiektem, ale to jeszcze bardziej utrudnia definicję tego, czym jest zwykły obiekt w JavaScript.źródło
instanceof Object
dwa identyczne literały funkcji nie są ściśle równe, są przekazywane przez odniesienie itp.Mój Boże, za dużo zamieszania w innych odpowiedziach.
Krótka odpowiedź
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)
Aby to przetestować, po prostu uruchom następujące instrukcje w konsoli Chrome.
Przypadek 1.
Przypadek 2.
Przypadek 3.
Wyjaśnienie
Okej, załamajmy się
typeof anyVar == 'object'
jest zwracany jako prawdziwy od trzech kandydatów -[], {} and null
,anyVar instanceof Object
zawęża tych kandydatów do dwóch -[], {}
!(anyVar instanceof Array)
zawęża się do jednego -{}
Rolki bębna proszę!
Dzięki temu mogłeś już nauczyć się sprawdzać tablicę w JavaScript.
źródło
false
(zgodnie z życzeniem), gdyanyVar
jest funkcją.Najbardziej rozsądnym sposobem sprawdzenia rodzaju wartości wydaje się
typeof
operator. Jedynym problemem jest to, że jest strasznie zepsuty:"object"
zanull
, który należy do typu Null."function"
obiekty, które można wywołać, które należą do typu Object."unknown"
. Jedynymi niedozwolonymi wynikami są"function"
i prymitywne typy.typeof
jest niezawodny tylko w przypadku innych niżnull
prymitywne. Zatem sposobem sprawdzenia, czy wartość jest obiektem, byłoby upewnienie się, że zwracany ciągtypeof
nie odpowiada prymitywowi, a obiekt nie jestnull
. Problem polega jednak na tym, że przyszły standard mógłby wprowadzić nowy typ pierwotny, a nasz kod uznałby go za obiekt. Nowe typy nie pojawiają się często, ale na przykład ECMAScript 6 wprowadził typ symbolu.Dlatego zamiast
typeof
polecam tylko podejścia, których wynik różni się w zależności od tego, czy wartość jest obiektem, czy nie. Następujące ma byćKompleksowa, ale niewyczerpująca lista prawidłowych metod sprawdzania, czy wartość należy do typu Object.
Object
konstruktorObject
Konstruktor wymusza przekazany argument do obiektu. Jeśli jest to już obiekt, zwracany jest ten sam obiekt.Dlatego można go użyć do przymuszenia wartości do obiektu i ścisłego porównania tego obiektu z wartością oryginalną.
Następująca funkcja wymaga ECMAScript 3, który wprowadził
===
:Podoba mi się to podejście, ponieważ jest proste i samoopisujące, a analogiczna kontrola będzie również działać w przypadku logicznych, liczb i ciągów znaków. Należy jednak pamiętać, że opiera się on na tym, że globalny
Object
świat nie jest śledzony ani zmieniany.Konstruktory
Po utworzeniu instancji konstruktor może zwrócić wartość inną niż właśnie utworzona instancja. Ale ta wartość zostanie zignorowana, chyba że jest to obiekt.
Poniższa funkcja wymaga ECMAScript 3, który pozwalał konstruktorom zwracać obiekty niebędące obiektami. Przed ECMAScript 3, który generował błąd, ale
try
wtedy nie istniały instrukcje.Chociaż jest nieco mniej prosty niż w poprzednim przykładzie, ten nie opiera się na żadnej globalnej własności, a zatem może być najbezpieczniejszy.
this
wartośćStare specyfikacje ECMAScript wymagały, aby
this
wartość była obiektem. Wprowadzono ECMAScript 3Function.prototype.call
, który pozwalał na wywoływanie funkcji o dowolnejthis
wartości, ale wymuszanej na obiekcie.ECMAScript 5 wprowadził tryb ścisły, który usunął to zachowanie, ale w trybie niechlujstwa nadal możemy (ale prawdopodobnie nie powinniśmy) na nim polegać.
[[Prototyp]]
Wszystkie zwykłe obiekty mają wewnętrzny slot o nazwie [[Prototyp]], którego wartość określa, z którego innego obiektu dziedziczy. Wartość może być tylko obiektem lub
null
. Dlatego możesz spróbować utworzyć obiekt, który odziedziczy po żądanej wartości, i sprawdź, czy zadziałał.Zarówno
Object.create
iObject.getPrototypeOf
wymagają ECMAScript 5.Niektóre nowe sposoby ECMAScript 6
ECMAScript 6 wprowadza pewne nowe pośrednie sposoby sprawdzania, czy wartość jest obiektem. Używają wcześniej widzianego podejścia, aby przekazać wartość do jakiegoś kodu, który wymaga obiektu, owiniętego wewnątrz
try
instrukcji w celu wychwycenia błędów. Niektóre ukryte przykłady, nie warte komentowaniaPokaż fragment kodu
Pokaż fragment kodu
Uwaga: Celowo pominąłem niektóre podejścia, takie jak
Object.getPrototypeOf(value)
(ES5) iReflect
metody (ES6), ponieważ wywołują one podstawowe metody wewnętrzne, które mogą robić nieprzyjemne rzeczy, np. Jeślivalue
są proxy. Ze względów bezpieczeństwa moje przykłady odnoszą się tylkovalue
bez bezpośredniego dostępu do nich.źródło
Spróbuj tego
źródło
Object.prototype instanceof Object
-> fałsz.Object.create(null) instanceof Object
-> fałsz.new Date() instanceof Object
=> trueGotowe do użycia funkcje sprawdzania
Wyjaśnienie
W JavaScript
null
,Object
,Array
,Date
ifunction
s są wszystkie obiekty. Chociażnull
jest nieco wymyślony. Lepiej więcnull
najpierw sprawdzić , czy nie ma wartości zerowej.Sprawdzanie
typeof o === 'object'
gwarancji, któreo
są przedmiotem. Bez tej kontroliObject.prototype.toString
byłoby bez znaczenia, ponieważ zwróciłoby obiekt za wszystko, nawet zaundefined
inull
! Na przykład:toString(undefined)
zwraca[object Undefined]
!Po
typeof o === 'object'
sprawdzeniu toString.call (o) to świetna metoda sprawdzenia, czyo
jest to obiekt, obiekt pochodny jakArray
,Date
czyfunction
.W
isDerivedObject
funkcji sprawdza, czyo
jest funkcją. Ponieważ funkcja również jest przedmiotem, dlatego tam jest. Jeśli tego nie zrobił, funkcja zwróci wartość false. Przykład:isDerivedObject(function() {})
powrócifalse
, ale teraz powrócitrue
.Zawsze można zmienić definicję tego, co jest przedmiotem. Zatem można odpowiednio zmienić te funkcje.
Testy
źródło
Jeśli chcesz sprawdzić, czy
prototype
dlaobject
pochodzi wyłącznie odObject
. OdfiltrowujeString
,Number
,Array
,Arguments
, itd.Lub jako funkcja strzałki z jednym wyrażeniem (ES6 +)
źródło
return Object.prototype.toString.call(n) === '[object Object]'
null
czek, ponieważObject.prototype.toString.call(null) === '[object Null]'
Poproszono mnie o podanie dodatkowych szczegółów. Najbardziej przejrzystym i zrozumiałym sposobem sprawdzenia, czy nasza zmienna jest obiektem, jest
typeof myVar
. Zwraca ciąg z rodzaju (np"object"
,"undefined"
).Niestety albo Array i null również mają typ
object
. Aby wziąć tylko prawdziwe przedmioty, należy sprawdzić łańcuch dziedziczenia za pomocąinstanceof
operatora. Wyeliminuje to zero, ale tablica ma Object w łańcuchu dziedziczenia.Tak więc rozwiązaniem jest:
źródło
/./ instanceof Object //true
Trochę późno ... dla „zwykłych obiektów” (mam na myśli, jak {'x': 5, 'y': 7}) mam ten mały fragment:
Generuje następny wynik:
To zawsze działa dla mnie. Jeśli zwróci „prawda” tylko wtedy, gdy typem „o” jest „obiekt”, ale nie ma wartości null, tablicy ani funkcji. :)
źródło
lodash ma isPlainObject , co może być tym, czego szuka wielu, którzy odwiedzają tę stronę. Zwraca false, gdy podaje funkcję lub tablicę.
źródło
_.isObject
które pasuje do tego, co JS uważa za obiekt. Ale zwykle potrzebuję rozróżnić np. Dosłowność obiektu i tablicę, co dokładnie_.isPlainObject
mi pozwala.To zadziała. Jest to funkcja zwracająca wartość true, false lub ewentualnie null.
źródło
null
wynika z tej odpowiedzi, podczas testów uzyskałem raczej wynik testu końcowego niżfalse
. Zobacz Kiedy powinienem edytować kod?Ponieważ wydaje się, że istnieje wiele nieporozumień dotyczących tego, jak poprawnie poradzić sobie z tym problemem, zostawię moje 2 centy (ta odpowiedź jest zgodna ze specyfikacją i daje prawidłowe wyniki we wszystkich okolicznościach):
Testowanie prymitywów:
undefined
null
boolean
string
number
Obiekt nie jest prymitywny:
Lub alternatywnie:
Testowanie dowolnej tablicy:
Testowanie obiektu z wyłączeniem:
Date
RegExp
Boolean
Number
String
Function
dowolnej tablicyźródło
Gdy wszystko inne zawiedzie, używam tego:
źródło
item.constructor === Object
?null
zgłasza wyjątekUncaught TypeError: Cannot read property 'constructor' of null(…)
indexOf
lub z powoduconstructor.name
?The Ramda biblioteka funkcjonalny ma wspaniałą funkcję wykrywania typów JavaScript.
Parafrazując pełną funkcję :
Musiałem się śmiać, kiedy zdałem sobie sprawę, jak proste i piękne było to rozwiązanie.
Przykładowe użycie z dokumentacji Ramda :
źródło
Po przeczytaniu i wypróbowanie wielu implementacjach, Zauważyłem, że bardzo niewiele osób próbuje sprawdzić dla wartości takich jak
JSON
,Math
,document
lub przedmiotów z łańcuchami prototypowych dłużej niż 1 kroku.Zamiast sprawdzać
typeof
naszą zmienną, a następnie hakować przypadki na krawędziach, pomyślałem, że lepiej byłoby, gdyby sprawdzanie było tak proste, jak to możliwe, aby uniknąć konieczności refaktoryzacji, gdy pojawią się nowe operacje podstawowe lub obiekty rodzime, które rejestrują się jakotypeof
obiekt „ „.W końcu
typeof
operator powie ci, czy coś jest obiektem JavaScript , ale definicja obiektu JavaScript jest zbyt szeroka dla większości scenariuszy w świecie rzeczywistym (nptypeof null === 'object'
.). Poniżej znajduje się funkcja, która określa, czy zmiennav
jest obiektem, zasadniczo powtarzając dwa sprawdzenia:v
jest'[object Object]'
.Chciałem, aby wynik funkcji był dokładnie taki, jak w poniższych logach, więc jest to jedyne kryterium „obiektywności”, z jakim się skończyłem. Jeśli zawiedzie, funkcja natychmiast zwraca false.
v
zostaje zastąpiony kolejnym prototypem w łańcuchuv = Object.getPrototypeOf(v)
, ale również bezpośrednio poddany ocenie po. Gdy nową wartościąv
jestnull
, oznacza to, że każdy prototyp, w tym prototyp root (który równie dobrze mógłby być jedynym prototypem w łańcuchu), przeszedł kontrolę w pętli while i możemy zwrócić wartość true. W przeciwnym razie rozpoczyna się nowa iteracja.źródło
źródło
value
jestnull
to wygeneruje błąd ...false
dla obiektuObject.assign({}, {constructor: null})
.Jeśli wyraźnie chcesz sprawdzić, czy podana wartość to
{}
.źródło
!!obj
jest skrótem do sprawdzenia, czyobj
jest prawdą (do odfiltrowanianull
)źródło
To stare pytanie, ale pomyślałem o pozostawieniu tego tutaj. Większość ludzi sprawdza, czy zmienna
{}
oznacza parę klucz-wartość, a nie jaka jest konstrukcja podkreślająca, której JavaScript używa do danej rzeczy, bo szczerze mówiąc, wszystko w JavaScript jest obiektem. Więc odsuwając to na bok. Jeśli zrobisz...W większości przypadków chcemy wiedzieć, czy mamy obiekt zasobu z API lub nasze wywołanie bazy danych z ORM. Możemy następnie sprawdzić, czy nie jest
Array
, nienull
jest, nie jest typeof'function'
i jestObject
źródło
true
dlanew Date()
new Date()
To, co lubię używać, to
Myślę, że w większości przypadków Data musi przekazać czek jako Obiekt, więc nie filtruję dat
źródło
znalazłem „nowy” sposób na wykonanie tego rodzaju sprawdzania typu na podstawie tego pytania SO: Dlaczego instanceof zwraca false dla niektórych literałów?
z tego utworzyłem funkcję do sprawdzania typu w następujący sposób:
możesz po prostu zrobić:
jest to testowane na Chrome 56, Firefox 52, Microsoft Edge 38, Internet Explorer 11, Opera 43
edytuj:
jeśli chcesz również sprawdzić, czy zmienna jest pusta lub niezdefiniowana, możesz użyć tego zamiast tego:
aktualizacja z komentarza inanc: wyzwanie przyjęte: D
jeśli chcesz stracić porównanie obiektów, możesz spróbować w ten sposób:
w ten sposób możesz zrobić podobnie jak komentarz inanc:
lub
źródło
instanceof
do sprawdzenia obiektów. Jednak nie jest to nauka ścisła.new Foo()
zwracaFoo
obiekt, tak samo jaknew String()
zwracaString
obiekt lubnew Date()
zwracaDate
obiekt, możeszFoo = function(){}; isVarTypeOf(new Foo(), Foo);
również zrobić