Почему я получаю 24 при добавлении 2 + 4 в javascript

Я пытаюсь это сделать:

function add_things() {
  var first = '2';
  var second = '4';
  alert(first + second);
}

Но это дает мне 24 вместо 6, что я делаю неправильно?

Ответ 1

Вы объединяете две строки с помощью оператора+. Попробуйте либо:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}

или

function add_things() {
  var first = '2';
  var second = '4';
  alert(parseInt(first, 10) + parseInt(second, 10));
}

или

function add_things() {
  var first = '2';
  var second = '4';
  alert(Number(first) + Number(second));
}

Примечание. вторая действительно подходит, если вы получаете строки от имени свойства или пользователя. Если они являются константами, которые вы определяете, и вы хотите их добавить, определите их как целые числа (как в первом примере).

Кроме того, как указано, восьмеричное зло. parseInt('010') будет на самом деле выходить как число 8 (10 в восьмеричном 8), следовательно, определение радиуса 10 - хорошая идея.

Ответ 2

Попробуйте следующее:

function add_things() {
  var first = 2;
  var second = 4;
  alert(first + second);
}

Обратите внимание, что я удалил одинарные кавычки; first и second теперь являются целыми числами. В вашем оригинале это строки (текст).

Ответ 3

Это один из "" Плохие детали" JavaScript, как язык с плохой типизацией, оператор добавления и конкатенации перегружен.

JavaScript свободно набирается, но это не значит, что он не имеет типов данных только потому, что для значения переменной, свойств объекта, функций или параметров не требуется назначать определенный тип значения.

В принципе существует три примитивных типа данных:

  • булева
  • номер
  • строка

null и undefined - два специальных случая, все остальное - только варианты типа объекта.

Тип JavaScript преобразует значения типов в тип, подходящий для контекста их использования (тип принуждения).

В вашем примере пытались добавить два объекта типа string, поэтому происходит конкатенация.

Вы можете "отличить" или преобразовать переменные в число разными способами, чтобы избежать этой проблемы:

var a = "2";
var b = "4";
// a and b are strings!
var sum =  Number(a) + Number(b);          // Number constructor.
sum =  +a + +b;                            // Unary plus.
sum =  parseInt(a, 10) + parseInt(b, 10);  // parseInt.
sum =  parseFloat(a) + parseFloat(b);      // parseFloat.

Это, я думаю, очень распространенная ошибка, например, при чтении пользовательского ввода из элементов формы, свойство value элементов управления формы является строкой, даже если содержащаяся в нем последовательность символов представляет собой число (как в вашем примере).

"Плохая часть", о которой я говорю, касается двойной функциональности оператора +, перегруженной для использования как для числового добавления, так и для конкатенации строк.

Операция, выполняемая оператором +, полностью определяется контекстом. Только если оба операнда являются числами, оператор + выполняет добавление, иначе он преобразует все его операнды в строку и сделает конкатенацию.

Ответ 4

Одиночные кавычки заставляют значения обрабатываться как символы вместо чисел. '2' + '4' = '24' так же, как 'snarf' + 'blam' = 'snarfblam'.

Ответ 5

Вы также можете заставить интерпретатор выполнять арифметику при работе с числами в строковых формах, умножая строку на 1 (поскольку умножение не может быть выполнено на строку, оно может быть преобразовано в число, если это возможно):

// fun with Javascript...

alert(first * 1 + second * 1);

Но лучше всего использовать предложение использования CMS Number() для принудительного преобразования, поскольку кто-то, вероятно, придет позже и оптимизирует выражение, удалив "по-видимому, ненужные" операции умножения на один.