Czy istnieje lepszy sposób na uzyskanie typu zmiennej w JS niż typeof
? Działa dobrze, gdy:
> typeof 1
"number"
> typeof "hello"
"string"
Ale jest to bezużyteczne, gdy próbujesz:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Wiem o tym instanceof
, ale wymaga to wcześniejszej znajomości typu.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Czy jest lepszy sposób?
javascript
types
typeof
Aillyn
źródło
źródło
typeof new RegExp(/./); // "function"
problem w Chrome wydaje się być rozwiązany w Chrome 14.n
zamiast oczekiwanej oryginalnej nazwy. np.constructor.name
może dać cin
zamiast oczekiwanego pełnego imienia i nazwiskaOdpowiedzi:
Angus Croll napisał ostatnio ciekawy wpis na blogu na ten temat -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Omawia zalety i wady różnych metod, a następnie definiuje nową metodę „toType” -
źródło
ActiveXObject
przykład wystąpienia programu Internet Explorer .match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Zamiast tego rozważ bardziej ogólny,match(/\s([^\]]+)/)
który powinien poradzić sobie ze wszystkim.\w
zamiast tego użyć operatora słowo…Możesz spróbować użyć
constructor.name
.Podobnie jak w przypadku wszystkich skryptów JavaScript, ktoś ostatecznie niezmiennie wskaże, że jest to coś złego, więc tutaj jest link do odpowiedzi, która obejmuje to całkiem dobrze.
Alternatywą jest użycie
Object.prototype.toString.call
źródło
name
jest rozszerzeniem ECMAScript i nie będzie działać we wszystkich przeglądarkach.constructor.name
prawdopodobnie będzie to coś w rodzajun
zamiast oczekiwanej nazwy obiektu. Uważaj więc na to - szczególnie jeśli tylko zmniejszasz produkcję.null
iundefined
niestety nie ma konstruktora.Dość dobrą funkcją przechwytywania typu jest ta używana przez YUI3 :
Przechwytuje wiele prymitywów udostępnianych przez javascript, ale zawsze możesz dodać więcej, modyfikując
TYPES
obiekt. Pamiętaj, żetypeof HTMLElementCollection
w Safari zgłosifunction
, ale zwróci typ (HTMLElementCollection)object
źródło
Przydatna może być następująca funkcja:
Lub w ES7 (komentarz, jeśli dalsze ulepszenia)
Wyniki:
Dzięki @johnrees za powiadomienie mnie o: błędzie, obietnicy, funkcji generatora
źródło
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Możemy również zmienić mały przykład z ipr101
i zadzwoń jako
źródło
funkcja jednej linii:
daje to taki sam wynik jak
jQuery.type()
źródło
Możesz zastosować
Object.prototype.toString
do dowolnego obiektu:Działa to dobrze we wszystkich przeglądarkach, z wyjątkiem IE - wywołując tę zmienną uzyskaną z innego okna, po prostu wypluje
[object Object]
.źródło
Moje 2 ¢! Naprawdę, jednym z powodów, dla których rzucam to tutaj, pomimo długiej listy odpowiedzi, jest dostarczenie trochę więcej
all in one
typowego rozwiązania i uzyskanie informacji zwrotnej w przyszłości, w jaki sposób go rozwinąć, aby uwzględnić więcejreal types
.Z poniższym rozwiązaniem, jak wspomniano powyżej, połączyłem kilka znalezionych tutaj rozwiązań, a także wprowadziłem poprawkę do zwracania wartości jQueryna obiekcie zdefiniowanym przez jQuery, jeśli jest dostępny . Dołączam również metodę do natywnego prototypu Object. Wiem, że często jest to tabu, ponieważ może zakłócać inne takie rozszerzenia, ale pozostawiam to
user beware
. Jeśli nie podoba ci się ten sposób, po prostu skopiuj funkcję podstawową w dowolnym miejscu i zastąp wszystkie zmiennethis
parametrem argumentu, aby przekazać (np. Argumenty [0]).Następnie po prostu używaj z łatwością, tak:
Więcej przykładów:
Jeśli masz coś do dodania, co może być pomocne, na przykład określenie, kiedy obiekt został utworzony za pomocą innej biblioteki (Moo, Proto, Yui, Dojo itp.). Zachęcamy do komentowania lub edytowania tego i kontynuowania. dokładne i precyzyjne. LUB przejdź do strony, GitHubktórą dla tego stworzyłem i daj mi znać. Znajdziesz tam również szybki link do pliku min cdn.
źródło
W moich wstępnych testach działa to całkiem dobrze. Pierwszy przypadek wypisze nazwę dowolnego obiektu utworzonego za pomocą „nowego”, a drugi przypadek powinien przechwycić wszystko inne.
Używam,
(8, -1)
ponieważ zakładam, że wynik zawsze zaczyna się[object
i kończy,]
ale nie jestem pewien, czy to prawda w każdym scenariuszu.źródło
Myślę, że najbardziej uniwersalnym rozwiązaniem tutaj jest sprawdzenie
undefined
inull
najpierw, a następnie po prostu zadzwonićconstructor.name.toLowerCase()
.źródło
.constructor.name
zawsze zawiera wartość ciągu. Dla undefined / null mamy odpowiednie ciągi zwracane przez funkcję.constructor
jest to dziedziczna właściwość, powoduje to uszkodzenie obiektów utworzonych za pomocąObject.create(null)
. Wystarczająco proste, aby to naprawić, ale jak to nazwać? „[obiekt null]”?typeof
warunek służy do sprawdzania typu zmiennej, jeśli sprawdzasz typ zmiennej w warunku if-else npźródło