2015-12-25 9 views
16

Metoda plus (+): i String.concat() daje taki sam wynik.Jaka jest różnica + operator i metoda concat() w kodzie JavaScript

plus (+) operator; Sposób

str1 + str2; 

ciąg concat();

str1.concat(str2); 

Addionally, to jest napisane w w3schools;

Ale z JavaScript, metody i właściwości dostępne wartości pierwotne są również, ponieważ JavaScript traktuje wartości prymitywne jak obiektów podczas wykonywania metody i właściwości.

Więc w jaki sposób lepiej jest użyć do połączenia dla obu używamy na prymitywów lub na obiektach ciąg w JS, jakie są zalety i wady wydajności między nimi, jeśli istnieje jakakolwiek?

var firstName = "John"  // String 
var y = new String("John"); // with String Object 

Oto przykładowe kody, które dają takie same wyniki;

function example1() { 
 
    var str1 = "Hello "; 
 
    var str2 = "World!"; 
 
    document.getElementById("demo1").innerHTML += str1 + str2; 
 
} 
 

 

 
function example2() { 
 
    var str1 = "Hello "; 
 
    var str2 = "World!"; 
 
    document.getElementById("demo2").innerHTML += str1.concat(str2); 
 
} 
 

 
function example3() { 
 
    var str1 = String("Hello "); 
 
    var str2 = String("World!"); 
 
    document.getElementById("demo3").innerHTML += str1 + str2; 
 
} 
 

 
function example4() { 
 
    var str1 = String("Hello "); 
 
    var str2 = String("World!"); 
 
    document.getElementById("demo4").innerHTML += str1.concat(str2); 
 
} 
 

 
example1(); 
 
example2(); 
 
example3(); 
 
example4();
<p id="demo1">Demo 1: </p> 
 
<p id="demo2">Demo 2: </p> 
 
<p id="demo3">Demo 3: </p> 
 
<p id="demo4">Demo 4: </p>

+0

To pytanie dotyczy javascript, a nie java! a po drugie, nie chodzi tylko o operator vs. concat(), ale także o zachowanie prymitywów i obiektów w javascript. Zadane pytanie nie jest duplikatem tego. Należy ponownie otworzyć! –

+2

Patrz ES5 [** §15.5.4.6 ** concat] (http://es5.github.io/#x15.5.4.6) i porównaj z [** §11.6.1 ** operator dodający] (http: //es5.github.io/#x11.6.1); Podstawową różnicą jest to, że możesz wywołać '.concat' na _non-Strings_ i założyć, że wynikiem jest _String_' String.prototype.concat.call (1, 2); // "12" 'kontra' 1 + 2; // 3' –

+0

@PeeHaa Ups, przepraszam za to. –

Odpowiedz

3

Istnieje całkiem to samo, ale + jest bardziej przejrzysta i na pewno szybciej.

Spójrz this performance test a także zobaczyć this

Zaleca się, że operatorzy przydziału (+, + =), stosuje się zamiast metody concat().

1

Nie stwierdzono różnic w zależności od funkcji, ale operatora '+' jest szybciej niż concat() dla wydajności.

var str1="hello"; 
var str2="world"; 
var str3; 
var start = new Date().getTime(); 
for (i = 0; i < 100000; ++i) { 
str3=str1+str2; 
} 
var end = new Date().getTime(); 
var time = end - start; 

print('Execution time using + operator: ' + time); 

// USING CONCAT OPERATOR 

start = new Date().getTime(); 
for (i = 0; i < 100000; ++i) { 
str3=str1.concat(str2); 
} 
end = new Date().getTime(); 
time = end - start; 
print('Execution time using CONCAT operator: ' + time); 

please run at ideone

+0

Czy mogę znać przyczynę downvote? – Ambika

+0

Nie, już dałem przegłosowanie twojego oświadczenia o wyższości wydajności operatorów +, ponieważ było użyteczne. –

+0

Prosi się każdego faceta, aby skomentował powód, aby mógł się nauczyć mojego błędu. I @LeventDivilioglu dziękuje – Ambika

12

Nie ma żadnej różnicy w zachowaniu między metodami ciąg na prymitywne i metod ciąg na obiekt.

Występuje duża różnica w wydajności, ponieważ wersje pierwotne wydają się być znacznie szybsze w this jsperf (prawdopodobnie nawet o 100x szybciej), prawdopodobnie z powodu optymalizacji interpretera.

enter image description here

Jak widać z this jsperf, główna różnica w wydajności jest spowodowana var str1 = new String("Hello "); zamiast var str1 = "Hello ";. Operator + w porównaniu z concat() nie robi dużej różnicy. Domyślam się, że to dlatego, że interpreter JS optymalizuje metodę string. Ale tworzenie rzeczywistego obiektu typu string nie jest tak zoptymalizowane ani wydajne.

Jeśli chodzi o specyfikację ECMAScript, in the ECMAScript spec for +, wyraźnie stwierdza się, że jeśli prymitywna wartość lewego operandu (lprim) jest łańcuchem znaków, należy zwrócić ciąg, który jest wynikiem łączenia się ToString(lprim) followed by ToString(rprim).

W ECMAScript spec for String.prototype.concat(), to mówi: Let R be the String value consisting of the characters in the previous value of R followed by the characters of ToString(next).

Takie sformułowanie sugeruje, że + podawany lewy argument w postaci ciągu ma zamiar rzucić prawy operand do łańcucha i nazywają .concat() wewnętrznie, która jest dokładnie to, co .concat() robi.

Oczywiście, jeśli lewy operand nie jest łańcuchem, otrzymasz inne zachowanie z +, ponieważ niekoniecznie będzie to traktować jako operację łańcuchową.


sytuacji, która może mieć znaczenie, czy masz obiekt string lub ciąg prymitywny jest jeśli chcesz dodać właściwość niestandardową do obiektu String, to trzeba formę obiektu, a nie prymitywna forma .

Jeśli chodzi o czas korzystania z + i kiedy używać .concat(), jest to osobisty wybór stylu kodowania. Oba osiągają takie same wyniki. Osobiście wolę używać operatorów, gdy tylko jest to możliwe, ponieważ kod wydaje się prostszy do odczytania.

Jeśli nie masz konkretnego powodu, aby utworzyć obiekt tekstowy, powinieneś po prostu użyć prostych elementów.

Więc naprawdę nie ma powodu, aby to zrobić:

var str1 = String("Hello "); 
var str2 = String("World!"); 
document.getElementById("demo").innerHTML = str1.concat(str2); 

kiedy to działa dobrze:

var str1 = "Hello "; 
var str2 = "World!"; 
document.getElementById("demo").innerHTML = str1 + str2; 

Oto przykład tylko raz wiem kiedy to polubisz chcę/potrzebuję obiektu jawnie napisanego:

// actual string object will retain custom property 
 
var str1 = new String("Hello"); 
 
str1.customProp = "foo"; 
 
log(str1.customProp); 
 

 
// string primitive will not retain custom property 
 
var str2 = "Hello"; 
 
str2.customProp = "foo"; 
 
log(str2.customProp); 
 

 
function log(x) { 
 
    document.write(x + "<br>"); 
 
}

+0

Więc czy można powiedzieć, że String.concat() i operator "+" są całkowicie równe i identyczne, czy można powiedzieć, że są one przetwarzane w ten sam sposób, z tą samą wydajnością za sceną, zarówno na elementach pierwotnych, jak i obiektach? JavaScript? Nadal jestem ciekawa. –

+0

@LeventDivilioglu - '+' i '.concat()' zapewniają dokładnie taki sam wynik. Jeśli chodzi o pytania dotyczące wydajności, musisz przeprowadzić testy wydajności w wielu przeglądarkach, aby odpowiedzieć na to pytanie, ponieważ może to być zależne od implementacji. Nie ma żadnego konceptualnego powodu, dlaczego trzeba być szybszym lub wolniejszym od drugiego. – jfriend00

+1

@LeventDivilioglu - Dodano dane o wydajności i wykres do mojej odpowiedzi. – jfriend00

Powiązane problemy