Переменные не рассматриваются как числа
Я объяснял кому-то некоторые базовые вещи из 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', которая является строкой, поэтому строка задействована, и каждый +
будет конкатенация строк.