Pochodzą z MDN
Literały łańcuchowe (oznaczone podwójnymi lub pojedynczymi cudzysłowami) i ciągi zwracane przez wywołania String w kontekście innym niż konstruktor (tj. Bez użycia słowa kluczowego new) są ciągami pierwotnymi. JavaScript automatycznie konwertuje prymitywy na obiekty typu String, dzięki czemu możliwe jest użycie metod obiektów typu String dla łańcuchów pierwotnych. W kontekstach, w których metoda ma być wywoływana na łańcuchu pierwotnym lub następuje wyszukiwanie właściwości, JavaScript automatycznie zawinie łańcuch pierwotny i wywoła metodę lub przeprowadzi wyszukiwanie właściwości.
Pomyślałem więc, że (logicznie) operacje (wywołania metod) na prymitywach łańcuchowych powinny być wolniejsze niż operacje na obiektach łańcuchowych, ponieważ każdy prymityw ciągu jest konwertowany na ciąg Object (dodatkowa praca) przed method
zastosowaniem na łańcuchu.
Ale w tym przypadku testowym wynik jest odwrotny. W polu kodu-1 działa szybciej niż kod blokowy-2 , oba bloki kodu podano poniżej:
blok kodu 1:
var s = '0123456789';
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
blok kodu 2:
var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
s.charAt(i);
}
Wyniki różnią się w przeglądarkach, ale blok kodu 1 jest zawsze szybszy. Czy ktoś może to wyjaśnić, dlaczego blok kodu 1 jest szybszy niż blok kodu 2 .
'0123456789'.charAt(i)
?
code block-1
jest szybszy?
new String
wprowadza kolejną przezroczystą warstwę zawijania obiektów .typeof new String(); //"object"