Як змусити JS займатися математикою, а не ставити два рядки


102

Мені потрібен javascript, щоб додати 5 до цілочисленної змінної, але замість цього вона розглядає змінну як рядок, тому вона виписує змінну, а потім додає 5 на кінець "рядка". Як я можу змусити її замість цього робити математику?

var dots = document.getElementById("txt").value; // 5
function increase(){
    dots = dots + 5;
}

Вихід: 55

Як я можу змусити його вивести 10?


3
Цей конкретний приклад виводить 10.
deceise


10
Ви поклали надмірне навантаження на тих, хто хоче вам допомогти, скидаючи весь код, не роблячи жодних спроб виправити його. Перевірте самостійно ... чи атрибути CSS можуть #controlзмінити вашу проблему? Якщо ні, то видаліть їх і не показуйте їх нам. Продовжуйте зменшувати код, поки у вас не з’явиться абсолютний мінімальний тестовий випадок, необхідний для відтворення вашої проблеми. Більшу частину часу, коли ви робите це, ви змусите знайти проблему та навчитися цьому. Якщо ви не вирішите це самостійно, то, швидше за все, ви отримаєте швидку допомогу простим прикладом.
Фрогз

Відповіді:


108

У вас є лінія

dots = document.getElementById("txt").value;

у вашому файлі це встановить крапки як рядок, оскільки вміст txt не обмежується числом.

перетворити його в int змінити рядок на:

dots = parseInt(document.getElementById("txt").value, 10);

Примітка. 10Тут вказується десятковий (базовий-10). Без цього деякі браузери можуть не правильно інтерпретувати рядок. Див MDN: parseInt.


3
ярлик ... dots = + document.getElementById ("txt"). значення
Tracker1

5
parseInt (..., 10) також завжди використовуйте радіакс ... перевірку на здоровий стан ... якщо (! крапки || крапки <1) теж може бути порядок ...
Tracker1

1
Краще використовувати оператор приросту для додавання. як VARIABLE ++ замість VAR = VAR + 1;
gnganpath

53

найпростіший:

dots = dots*1+5;

точки будуть перетворені в число.


34
Навіть простіше, ніж це було б dots = +dots+5.
Енді Е


9

Я додаю цю відповідь, тому що я її тут не бачу.

Один із способів - поставити символ "+" перед значенням

приклад:

var x = +'11.5' + +'3.5'

x === 15

Я вважав, що це найпростіший спосіб

У цьому випадку рядок:

dots = document.getElementById("txt").value;

може бути змінено на

dots = +(document.getElementById("txt").value);

змусити його до числа

ПРИМІТКА:

+'' === 0
+[] === 0
+[5] === 5
+['5'] === 5

8

parseInt() повинен зробити трюк

var number = "25";
var sum = parseInt(number, 10) + 10;
var pin = number + 10;

Дає тобі

sum == 35
pin == "2510"

http://www.w3schools.com/jsref/jsref_parseint.asp

Примітка: 10в parseInt(number, 10)спеціфіціруешь десяткове (підстава-10). Без цього деякі браузери можуть не правильно інтерпретувати рядок. Див MDN: parseInt.




1

Ви можете додати + за змінною, і це змусить її бути цілим числом

var dots = 5
    function increase(){
        dots = +dots + 5;
    }

1

Спробувавши більшість відповідей тут без успіху для мого конкретного випадку, я придумав таке:

dots = -(-dots - 5);

Знаки + - це те, що плутає js, і це повністю їх усуває. Простий у здійсненні, якщо це потенційно незрозуміло.


-3

ОНОВЛЕНО з моменту останнього зволікання ....

Я бачив лише порцію

var dots = 5
function increase(){
    dots = dots+5;
}

раніше, але пізніше мені було показано, що txtполе подає змінну dots. Через це вам потрібно буде обов’язково "очистити" вхід, щоб бути впевненим, що він має лише цілі числа, а не шкідливий код.

Один з простих способів зробити це - розібрати текстове поле з onkeyup()подією, щоб переконатися, що в ньому є цифрові символи:

<input size="40" id="txt" value="Write a character here!" onkeyup="GetChar (event);"/>

де подія дасть помилку та очистить останній символ, якщо значення не є числом:

<script type="text/javascript">
    function GetChar (event){
        var keyCode = ('which' in event) ? event.which : event.keyCode;
        var yourChar = String.fromCharCode();
        if (yourChar != "0" &&
            yourChar != "1" &&
            yourChar != "2" &&
            yourChar != "3" && 
            yourChar != "4" &&
            yourChar != "5" &&
            yourChar != "6" && 
            yourChar != "7" &&
            yourChar != "8" && 
            yourChar != "9")
        {
            alert ('The character was not a number');
            var source = event.target || event.srcElement;
            source.value = source.value.substring(0,source.value-2);
        }
    }
</script>

Очевидно, ви могли це зробити і з регулярним виразом, але я ледачий вихід вийшов.

Відтоді ви знаєте, що у вікні можуть бути лише цифри, ви зможете просто використовувати eval():

dots = eval(dots) + 5;

2
eval()є небезпечним, якщо dotsз введення користувача, особливо якщо він зберігається. Більше інформації
Чад Леві

@ChadLevy Дякую за посилання - добре прочитане - і піднявши це, але в цьому випадку стурбованість була невиправданою, оскільки це було не з введення користувачем. dotsбула визначеною змінною, яка збільшується і просто помиляється на рядок. Тож я кваліфікую свою відповідь про те, що це, як ви вже сказали, не повинно використовуватися з легких даних, які можуть бути використані користувачем / накопиченим, що може мати потенцію для злих сценаріїв. Але також у цьому випадку така ін'єкція в будь-якому разі спричинить математичну помилку / виняток, так що вона дійсно нічого не зробить.
vapcguy

Для тих, хто вважає, що eval()це так небезпечно, ви повинні подивитися на код у контексті, який використовував ОП. У цьому випадку це не тому, що він використовує введення, яке не надходить з текстового поля чи будь-якої іншої форми введення користувача, де може бути будь-яка форма введення нечислового значення! Я б хотів, щоб я міг позбавити ваших подій!
vapcguy

Ще один низовий потік. Хочете пояснити себе, а не просто вівця? Бувають випадки, коли eval()це просто чудово, і вам потрібно дивитися на контекст, в якому він використовується, а не просто сліпо вірити всьому, що читаєте, не розуміючи насправді!
vapcguy

1
@ChadLevy Добре, з цього приводу, ти маєш рацію. Я не дивився на цей розділ - я був зосереджений на тому, що він розмістив у верхній частині сторінки: код var dots = 5 function increase(){ dots = dots+5; }не використовує текстове поле, а призначає за допомогою прямих змінних, а не з введення користувачем. Так от я і пішов. Але я бачив , що ти маєш рацію , що він призначаючи це текстове поле txtдля dotsі dotsє глобальною змінною, і тому оновлюється з допомогою цього входу. Ти маєш рацію. Дякую.
vapcguy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.