Все говорят, что одной из проблем JavaScript является использование +
[ примера ] для конкатенации строк. Некоторые говорят, что проблема не в том +
, что это приведение типов [см. Комментарии из предыдущего примера]. Но языки со строгой типизацией без проблем используют + для конкатенации и принудительных типов. Например, в C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Так почему же конкатенация строк в JavaScript такая большая проблема?
javascript
конфигуратор
источник
источник
bad
. Кто такойEveryone
?Ответы:
Рассмотрим этот фрагмент кода JavaScript:
Это войдет
Что, скорее всего, не то, что было задумано, и может быть трудно отследить ошибку.
источник
a
иb
вstr(a)
иstr(b)
вызовы; в противном случае вы получитеValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
,System.Console.WriteLine("result is " + 10 + 20);
но никто никогда не жалуется на это в C #. Вот чего я не понимаю - что такого в JavaScript делает его более запутанным?Когда вы говорите «плохо», вы имеете в виду «неправильно» или «медленно»? Довод об использовании математических операторов , чтобы сделать конкатенацию, возможно , «неправильным» аргумент, но есть еще один аргумент , чтобы быть , что использование
+
сделать много из конкатенации может быть очень медленным.Мы не говорим о
"Hello" + number
производительности, мы говорим о создании сравнительно большой строки, многократно добавляя ее в цикл.В JavaScript (и C # в этом отношении) строки являются неизменяемыми. Они никогда не могут быть изменены, только заменены другими строками. Вы, вероятно, знаете, что
combined + "hello "
напрямую не изменяетеcombined
переменную - операция создает новую строку, которая является результатом объединения двух строк вместе, но вы должны затем назначить эту новую строкуcombined
переменной, если вы хотите, чтобы она была изменена.Итак, этот цикл создает миллион различных строковых объектов и отбрасывает 999 999 из них. Создание такого количества строк, которые постоянно увеличиваются в размере, не быстрое, и теперь сборщику мусора предстоит проделать большую работу для очистки после этого.
C # имеет точно такую же проблему, которая решается в этой среде классом StringBuilder . В JavaScript вы получите гораздо лучшую производительность, создав массив всех строк, которые вы хотите объединить, и затем объедините их один раз в конце, вместо миллиона раз в цикле:
источник
Неплохо использовать + как для сложения, так и для объединения, если только вы можете добавлять только числа и объединять только строки. Тем не менее, Javascript будет автоматически преобразовывать числа и строки по мере необходимости, поэтому у вас есть:
Возможно, проще говоря, перегрузка "+" при наличии автоматического преобразования типов нарушает ожидаемую ассоциативность оператора +:
источник
3 + 5 == 5 + 3
но"3" + "5" != "5" + "3"
Типичная проблема, возникающая при конкатенации строк, связана с несколькими проблемами:
+
символ перегрузки# 1
Первая и главная проблема использования
+
конкатенации и сложения строк заключается в том, что вы используете+
конкатенацию и сложение строк .если у вас есть переменные
a
иb
, и вы установилиc = a + b
, есть неоднозначность, зависящая от типовa
иb
. Эта двусмысленность заставляет вас предпринять дополнительные шаги для смягчения проблемы:Строка Concat:
Дополнение:
Это подводит меня ко второму пункту
# 2
Очень легко случайно привести переменную к строке, не осознавая этого. Также легко забыть, что ваш ввод вводится в виде строки:
Будет давать не интуитивные результаты, потому что prompt возвращает строковое значение ввода.
# 3
Необходимость набирать текст
parseFloat
илиNumber()
каждый раз, когда я хочу сделать сложение, утомительна и раздражает. Я считаю себя достаточно умным, чтобы помнить, чтобы не испортить мои динамические типы, но это не значит, что я никогда не испортил свои динамические типы . Правда в том, что мне лень печататьparseFloat
илиNumber()
каждый раз, когда я делаю сложение, потому что я делаю много сложений.Решение?
Не все языки используют
+
для конкатенации строк. PHP использует.
для объединения строк, что помогает различать, когда вы хотите добавить числа и когда вы хотите объединить строки.Любой символ может быть использован для объединения строк, но большинство из них уже используются, и лучше избегать дублирования. Если бы у меня был свой путь, я бы, вероятно, использовал
_
для объединения строк и запретил бы_
вводить имена переменных.источник