"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false
// the tests against Object really don't make sense
Literały tablicowe i literalne obiektowe pasują ...
[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true
Dlaczego nie wszyscy? Albo, dlaczego nie wszyscy oni nie ?
A zatem, co to za przykład?
Tak samo jest w FF3, IE7, Opera i Chrome. Więc przynajmniej jest spójny.
Brakowało kilku.
12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true
javascript
literals
instanceof
Jonathan Lonowski
źródło
źródło
(new String()).valueOf();
typeof foo === 'string'
to za mało: patrz odpowiedź axkibe.typeof new String('')
zwroty"object"
Używam:
Ponieważ w JavaScript ciągi znaków mogą być literałami lub obiektami.
źródło
function isString(s) { return s.constructor === String; }
Działa z literałami i obiektami łańcuchowymi (przynajmniej w V8)typeof
.W JavaScript wszystko jest obiektem (lub przynajmniej może być traktowane jako obiekt), z wyjątkiem prymitywów (booleany, null, liczby, łańcuchy i wartość
undefined
(i symbol w ES6)):Jak widać obiekty, tablice i wartość
null
są uważane za obiekty (null
jest odniesieniem do obiektu, który nie istnieje). Funkcje są rozróżniane, ponieważ są specjalnym rodzajem obiektów, które można wywoływać . Jednak nadal są obiektami.Z drugiej strony literały
true
,0
,""
aundefined
nie obiektów. Są to prymitywne wartości w JavaScript. Jednak logicznych, liczby i ciągi mają także konstruktorówBoolean
,Number
aString
odpowiednio który owinąć swoje odpowiednie prymitywów, aby zapewnić dodatkową funkcjonalność:Jak widać, gdy prymitywne wartości są zawinięte w odpowiednio
Boolean
,Number
iString
konstruktory stają się obiektami.instanceof
Operator działa tylko dla obiektów (dlatego wracafalse
do wartości pierwotnych):Jak widać oba
typeof
iinstanceof
są niewystarczające do sprawdzenia, czy wartość jest wartością logiczną, liczbą lub łańcuchem -typeof
działa tylko dla prymitywnych boolanów, liczb i łańcuchów; iinstanceof
nie działa dla prymitywnych boolanów, liczb i łańcuchów.Na szczęście istnieje proste rozwiązanie tego problemu. Domyślna implementacja
toString
(tzn. Jak jest natywnie zdefiniowanaObject.prototype.toString
) zwraca wewnętrzną[[Class]]
właściwość zarówno pierwotnych wartości, jak i obiektów:Wewnętrzna
[[Class]]
właściwość wartości jest znacznie bardziej użyteczna niżtypeof
wartość. Możemy użyćObject.prototype.toString
do stworzenia własnej (bardziej użytecznej) wersjitypeof
operatora w następujący sposób:Mam nadzieję, że ten artykuł pomógł. Aby dowiedzieć się więcej o różnicach między prymitywami a opakowanymi obiektami, przeczytaj następujący post na blogu: Sekretne życie prymitywów JavaScript
źródło
null
jest to również prymitywna wartość (tylkotypeof
operator jest mylący)Możesz użyć właściwości konstruktora:
źródło
String
iBoolean
w powyższym przykładzie, więc jeśli są badaniaconstructor
właściwości zmiennej łańcucha utworzonego w innym oknie (jak popup lub ramy) to będzie nie być równa po prostuString
, że będzie być równymthatOtherWindowsName.String
.Object.prototype.toString.call('foo') === '[object String]'
d.constructor == String
? Np. Z luźnym operatorem równości.możesz tego użyć, zadziała w obu przypadkach jako
var text="foo";
// typeof będzie działaćString text= new String("foo");
// instanceof będzie działaćźródło
Jest to zdefiniowane w specyfikacji ECMAScript w rozdziale 7.3.19 Krok 3 :
If Type(O) is not Object, return false.
Innymi słowy, jeśli
Obj
wObj instanceof Callable
nie jest przedmiotem,instanceof
będzie zwarcie dofalse
bezpośrednio.źródło
Myślę, że wpadłem na realne rozwiązanie:
źródło
https://www.npmjs.com/package/typeof
Zwraca ciąg znaków reprezentujący
instanceof
(nazwa konstruktora)źródło
Dla mnie zamieszanie spowodowane przez
Więc
"str" istanceof String
powinien wrócić,true
ponieważ jak działa istanceof, jak poniżej:Wyniki ekspresji nr 1 i nr 2 sobą sprzeczne, więc jeden z nich powinien być nieprawidłowy.
# 1 jest zły
Rozumiem, że jest to spowodowane
__proto__
niestandardową właściwością, więc użyj standardowej:Object.getPrototypeOf
Teraz nie ma zamieszania między wyrażeniem nr 2 i nr 3
źródło
Object("str").__proto__
lubObject("str") instanceof String
.Lub możesz po prostu stworzyć własną funkcję:
stosowanie:
Oba powinny zwrócić wartość true.
źródło