Переменные не рассматриваются как числа

Я объяснял кому-то некоторые базовые вещи из JavaScript, и мне было очень стыдно, когда переменная не рассматривалась как число, хотя и было числом.

Здесь нет проверок NaN, но мы только вводим числа.

var number1 = prompt("choose any number");
var number2 = prompt("choose another number");
alert("thank you I will multiply your numbers now!");
var multiplication = function(a, b) {
    var c = a * b;
    alert("the product of " + number1 + " and " + number2 + " is: " + c);
    var number3 = prompt("please choose a number to add to the product.");
    var sum = c + number3;
    alert(sum);
};

multiplication(number1, number2);

Кажется, что переменная "number3" не обрабатывается как число, а последнее предупреждение не дает сумму, а обрабатывает "number3" как строку.

Все становится лучше, когда я использую тривиальные

var sum = c + +number3;

Я не могу понять, почему число 3 не рассматривается как число, какие-либо идеи? Я не мог объяснить это своему другу и вынужден был отступить с позором.

Устали от Chrome и Firefox с одинаковым эффектом.

6 ответов

Window.prompt всегда возвращает String, событие, если оно числовое, например "5". Все еще строка. Вам необходимо выполнить приведение типа строки к числу. Например, используя Number конструктор:

var number1 = Number(prompt("choose any number"));
var number2 = Number(prompt("choose another number"));

prompt() возвращает строку, так просто. * оператор, по-видимому, преобразует первые два случая в числа, но + также является оператором конкатенации. Так что же происходит, что теперь у вас есть number + string = string, Когда вы делаете +number3, что (одинарный +) бросает на номер. Итак, теперь у вас есть number + number = number, чего ты хочешь.

prompt Метод всегда возвращает строку, он не пытается преобразовать текст, который вы ввели в число, даже если он выглядит так, как будто это число.

Когда вы используете оператор умножения для двух строк, обе неявно преобразуются в числа, потому что оператор умножения принимает только числа.

Когда вы используете + оператор на номер (c) и строка (number3), он будет выполнять конкатенацию строк, а не сложение, поскольку хотя бы один из операндов является строкой. Он преобразует число в строку и объединяет ее с другой строкой.

Используя одинарный + оператор на number3 переменная неявно преобразует строку в число, потому что унарная операция плюс может выполняться только над числом. Более понятно использовать функцию, которая явно преобразует строку в число, чем неявное преобразование:

var number1 = parseFloat(prompt("choose any number"));
var number2 = parseFloat(prompt("choose another number"));
alert("thank you I will multiply your numbers now!");
multiplication(number1, number2);

function multiplication(a, b) {
  var c = a * b;
  alert("the product of " + number1 + " and " + number2 + " is: " + c);
  var number3 = parseFloat(prompt("please choose a number to add to the product."));
  var sum = c + number3;
  alert(sum);
};

Как все объяснили, вы работаете сstrings возвращаясь по подсказке.

И просто ради забавы / причуды, которые javascript иметь. посмотрите, как вы можете превратить эти строки в числа

умножение на число 1 автоматически превратит всю строку в числа. так что в быстрой стороне вы могли бы умножить результат prompt1 and prom2 * 1 и у вас не будет этой проблемы

также вы можете сделать "1" * 1 -> 1 целое число

более интересные скрыть особенности JavaScript скрытые возможности JavaScript?

Спецификация помогает объяснить, как работает автоматическое преобразование типов. + выполняет конкатенацию строк, если один из операндов является строкой, а * выполняет только умножение чисел, и поэтому преобразует операнды в числа.

+ оператор перегружен как оператор арифметического сложения и как оператор конкатенации строк.

В большинстве случаев добавленное к строке значение приводит к появлению строки. Так как prompt() возвращает строку, это то, что происходит. Вы можете использовать одинарный + превратить строку обратно в число (+number3), тем самым удаляя все строки из уравнения.

Примечание: порядок работы имеет значение

4 + 5 + '1' + 1     // '911'

4 и 5 оперируются первыми (обе не строки), поэтому выполняется арифметическое сложение. Затем встречается первая '1', которая является строкой, поэтому строка задействована, и каждый + будет конкатенация строк.

Другие вопросы по тегам