Оператор плюс (+) и String.concat()
дают тот же результат.
плюс (+) оператор;
str1 + str2;
Метод String concat();
str1.concat(str2);
Кроме того, он написан в w3schools;
Но с JavaScript методы и свойства также доступны для примитивных значений, поскольку JavaScript обрабатывает примитивные значения как объекты при выполнении методов и свойств.
Итак, какой способ лучше использовать для комбинирования либо для использования в примитивах, либо для объектов String в JS, каковы преимущества и недостатки производительности между ними, если они есть?
var firstName = "John" // String
var y = new String("John"); // with String Object
Вот примеры кодов, которые дают одинаковые результаты;
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>
Ответ 1
Есть и такие же, но +
более понятные и, безусловно, быстрее.
Посмотрите на этот тест производительности, а также увидеть это
Настоятельно рекомендуется использовать операторы присваивания (+, + =) вместо метода concat().
Ответ 2
Нет никакой разницы в поведении между строковыми методами примитивного и строковыми методами для объекта.
Существует большая разница в производительности, поскольку в этом jsperf (возможно, до 100 раз быстрее) примитивные версии намного быстрее, что, вероятно, связано с оптимизацией интерпретатора.
![enter image description here]()
Как видно из этого jsperf, основное различие в производительности вызвано var str1 = new String("Hello ");
вместо var str1 = "Hello ";
, Оператор +
против concat()
не имеет особого значения. Я предполагаю, что это потому, что интерпретатор JS оптимизирует строковый метод. Но создание фактического строкового объекта не так оптимизировано или эффективно.
Что касается спецификации ECMAScript, то в спецификации ECMAScript для +
он явно говорит, что если примитивное значение левого операнда (lprim) является строкой, верните строку, которая является результатом объединения ToString(lprim) followed by ToString(rprim)
.
В спецификации ECMAScript для String.prototype.concat()
указано: Let R be the String value consisting of the characters in the previous value of R followed by the characters of ToString(next).
Эта формулировка подразумевает, что +
при заданном левом операнде в виде строки собирается .concat()
правильный операнд в строку и вызвать .concat()
внутри, что является именно тем, что .concat()
.
Очевидно, если левый операнд не является строкой, то вы бы по-другому подействовали с +
поскольку он не обязательно будет рассматривать его как операцию строки вообще.
Ситуация, что может иметь значение, есть ли у вас строковый объект или примитив строки, если вы хотите добавить настраиваемое свойство к строковому объекту, тогда вам нужна форма объекта, а не примитивная форма.
Что касается того, когда использовать +
и когда использовать .concat()
, это выбор стиля личного кодирования. Оба достигают тех же результатов. Я лично предпочитаю использовать операторов, когда это возможно, поскольку код просто кажется более простым для чтения.
Если у вас нет особых причин для создания строкового объекта, вы должны просто использовать примитивы.
Поэтому нет причин для этого:
var str1 = String("Hello ");
var str2 = String("World!");
document.getElementById("demo").innerHTML = str1.concat(str2);
когда это работает отлично:
var str1 = "Hello ";
var str2 = "World!";
document.getElementById("demo").innerHTML = str1 + str2;
Вот пример единственного времени, когда я знаю, когда вам может понадобиться явный строковый объект:
// 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>");
}
Ответ 3
Никакая разница по функциональности, но оператор "+" быстрее, чем concat() для производительности.
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);
беритесь на идеон