typeof
Operator naprawdę nie pomaga nam znaleźć prawdziwego typu obiektu.
Widziałem już następujący kod:
Object.prototype.toString.apply(t)
Pytanie:
Czy jest to najbardziej dokładny sposób sprawdzania typu obiektu?
javascript
Royi Namir
źródło
źródło
Odpowiedzi:
Specyfikacja JavaScript podaje dokładnie jeden właściwy sposób określenia klasy obiektu:
http://bonsaiden.github.com/JavaScript-Garden/#types
źródło
Object.prototype.toString.call(new FormData()) === "[object FormData]"
co byłoby prawdą. Możesz także użyćslice(8, -1)
powrotuFormData
zamiast[object FormData]
Object.prototype
a{}
?Object.prototype.toString.call(new MyCustomObject())
wraca,[object Object]
anew MyCustomObject() instanceOf MyCustomObject returns true
co chciałem (Chrome 54.0.2840.99 m)new MyCustomObject().constructor === MyCustomObject
.Object.prototype.toString
to dobry sposób, ale jego wydajność jest najgorsze.http://jsperf.com/check-js-type
Służy
typeof
do rozwiązywania podstawowych problemów (String, Number, Boolean ...) iObject.prototype.toString
do rozwiązywania czegoś złożonego (np. Array, Date, RegExp).a to jest moje rozwiązanie:
Użyj jako:
źródło
type
funkcja jest dobra, ale zobacz, jak działa w porównaniu z innymitype
funkcjami. http://jsperf.com/code-type-test-a-test({}).toString.call(obj)
jest wolniejszy niżObject.prototype.toString
jsperf.com/object-check-test77Zaakceptowana odpowiedź jest poprawna, ale lubię definiować to małe narzędzie w większości budowanych przeze mnie projektów.
Używane w ten sposób:
Jeśli używasz kątownika, możesz go nawet dokładnie wstrzyknąć:
źródło
Trzymaj uchwyt na prototypie, którego oczekujesz od obiektu, a następnie porównaj z nim.
na przykład
źródło
o instanceof String; //true
?"foo" instanceof String
przerwytypeof(x)==='string'
zamiast tego.Object.getPrototypeOf(true)
zawodzi, gdy(true).constructor
zwracaBoolean
.Twierdzę, że większość przedstawionych tutaj rozwiązań cierpi z powodu nadmiernej inżynierii. Prawdopodobnie najprostszym sposobem sprawdzenia, czy wartość jest typu,
[object Object]
jest sprawdzenie jej.constructor
właściwości:lub nawet krócej z funkcjami strzałkowymi:
a != null
Jest to konieczne, ponieważ można by przejść wnull
alboundefined
i nie można wyodrębnić własność konstruktora z jednej z nich.Działa z każdym obiektem utworzonym przez:
Object
konstruktor{}
Inną fajną cechą tego narzędzia jest możliwość tworzenia poprawnych raportów dla niestandardowych klas, które używają
Symbol.toStringTag
. Na przykład:Problem polega na tym, że podczas wywoływania
Object.prototype.toString
jej instancji[object Object]
zostanie zwrócony fałszywy raport :Ale sprawdzenie konstruktora daje poprawny wynik:
źródło
Najlepszym sposobem na znalezienie PRAWDZIWEGO typu obiektu (w tym ZARÓWNO natywnej nazwy obiektu lub typu danych (np. String, Date, Number, ... itd.) ORAZ RZECZYWISTEGO typu obiektu (nawet niestandardowego) jest pobranie właściwość name konstruktora prototypu obiektu:
Typ natywny Ex1:
wyświetlacze:
Ex2:
wyświetlacze:
Klasy niestandardowe:
wyświetlacze:
źródło
null
alboundefined
.Stare pytanie, które znam. Nie musisz go konwertować. Zobacz tę funkcję:
Przykłady:
Niski koszt i prosty.
źródło
false
jeśli obiekt testowy tonull
lubundefined
true
lubfalse
false
. Jak to pomaga odpowiedzieć na pytanie?Przygotowałem małe narzędzie do sprawdzania typów, inspirowane powyższymi poprawnymi odpowiedziami:
przykład:
źródło
null
lubundefined
lubtrue
lubfalse