Czy ktoś mógłby wyjaśnić następujące informacje?

[] instanceof Array; // true
'' instanceof String; // false
15
Randomblue 20 grudzień 2011, 04:22

3 odpowiedzi

Najlepsza odpowiedź

Uwaga: Poniżej:

"" instanceof String;             // => false
new String("") instanceof String; // => true

{x0}} wymaga obiektu, ale "" jest literałem ciągów, a nie obiekt ciąg. Zwróć uwagę na następujące typy za pomocą {x2}} Funkcja:

typeof ""             // => "string"
typeof new String("") // => "object"
typeof []             // => "object"
typeof new Array()    // => "object"
14
Jon Newmuis 20 grudzień 2011, 00:36

To dlatego, że '' jest prymitywna, a nie obiekt.

Niektóre prymitywy w JavaScript mogą mieć owijkę obiektową. Są one tworzone po wykonaniu instancji wrapper za pomocą wbudowanego konstruktora z new.

new jest zazwyczaj konieczne, ponieważ często funkcja zmusi się do prymitywu, jeśli wykluczasz new.

typeof new String('');  // "object"
typeof String('');      // "string"
typeof '';              // "string"

Primitives, które mają opakowania obiektów są string, number i boolean.

Primitives, które nie są null i undefined.

11
2 revsuser1106925 20 grudzień 2011, 00:55

Zrobiłem trochę kopania, a przypuszczam, że ma to zrobić z Interning string , która jest optymalizacją kompilatora.

Dobra, gotowa na niektóre Gotchas? :RE

"abc" == "abc"; // true
"abc" === "abc"; // true

Przypuszczam, że jest to prawdą z powodu "włączenia łańcucha", które przypadkowo również robi dużo sensu, koncepcyjnie (yay do uzyskania prawa "ciągów").

new String("abc") == new String("abc"); // false
new String("abc") === new String("abc");    // false

Ma to sens, jeśli zakładasz String jest obiektem, a obiekt jest równy tylko sama i nie równa obiektu z podobnym stanem wewnętrznym. Jak w Javie (lub jak i tak kiedykolwiek był).

A teraz dla kickera:

(new String("abc")).substr(0,3) === (new String("abc")).substr(0,3); // true!

Tak najwyraźniej tłumacz JavaScript zawsze preferuje strumień interningu nad użyciem obiektu {x0}}.

Potem muszę zapytać, jakie jest użycie obiektu String? Najwyraźniej nie gra dobrze z przyjaciółmi.

1
Ry- 20 grudzień 2011, 17:31