Почему number + строит строку в javascript?
Отсканируйте некоторые причуды в javascript:
Сначала я сделал
console.log("5" + 1);
Это печатает 51, это нормально, и число и строка имеют оператор +, но поскольку строка является первой переменной, она преобразует 1 в строку.
Теперь, когда я сделал это:
console.log(1 + "5")
Я ожидал, что вывод будет 6, поскольку я думал, что он преобразует строку в число.
Однако магический выход был 15.
Может ли кто-нибудь, более опытный в javascript, скрасить это для меня?
Ответы
Ответ 1
Указание спецификации ECMAScript Оператор добавления (+):
- Если Type (lprim) является строкой или Тип (rprim) - это строка, то Верните строку, которая является результатом объединения ToString (lprim), а затем ToString (rprim)
Таким образом, порядок здесь не имеет значения.
Ответ 2
console.log(1 + "5" ) Я ожидал, что вывод будет 6, поскольку я думал, что он преобразует строку в число....
Но что бы вы ожидали, если бы вы написали следующее?
console.log(1 + " fine day")
или
console.log(1 + " answer(s) to my question")
В общем случае не может быть уверенности в том, что строка преобразуется в число. Но любое число может быть преобразовано в строку. Вот почему правила преобразования записываются для перехода к совместимому типу. (В контексте, когда вы, как программист, знаете, что строка может быть безопасно преобразована в число, вы можете сделать это явно, чтобы операция + находилась между двумя числами. Но это не так, как правило, для строк.)
В других контекстах это также объясняется тем, что малые ints и float с низкой точностью будут преобразованы в большие ints или float с двойной точностью при работе на смешанных типах, которые используются для последних типов. Вы можете безопасно преобразовать ограниченные формы в более крупные формы, но вы не можете безопасно идти в другом направлении в целом. Небольшой int может быть представлен как большой int или double, но другое направление обычно не является безопасным преобразованием.
Таким образом, правила преобразования для операций над смешанными типами записываются настолько, насколько это возможно, чтобы перейти к взаимно совместимым типам, которые являются безопасными общепринятыми типами. Программисту остается писать явные преобразования для особых случаев, когда более общий тип можно безопасно преобразовать в более ограниченный тип.
Ответ 3
В обоих случаях значение будет преобразовано в строку.
Когда вы добавляете число в строку или строку в число, результатом является строка.
Просто используйте parseInt(value)
или toString(value)
для принудительного преобразования.
Ответ 4
Вы можете попробовать код:
console.log(1 + parseInt("5"))
= > 6
Ответ 5
Конкатенация также использует +
в Javascript.
var result = "String" + number + obj;
// is equivalent to
string result = "String" + number.ToString() + obj.ToString();
Как бы то ни было, в С#/.net вы можете сделать то же самое, и получите тот же результат - System.Console.WriteLine("result is " + 10 + 20);
.
В JavaScript (и С#, если на то пошло) строки неизменяемы. Они никогда не могут быть изменены, заменены другими строками. Вероятно, вы знаете, что комбинированный + "String" не напрямую модифицирует объединенную переменную - операция создает новую строку, которая является результатом объединения двух строк вместе, но затем вы должны назначить эту новую строку комбинированной переменной if вы хотите, чтобы он был изменен.
Аргумент об использовании математических операторов для выполнения конкатенации строк, возможно, является "неправильным" аргументом, но есть также аргумент, который должен быть сделан, что использование + для выполнения большого количества конкатенации строк может быть очень медленным.