2016-02-08 3 views
1

По какой-то причине арифметика в функции updateScore(result) не работает должным образом (функция вызывается позже в коде). wins, ties и losses напечатаны как следует, но lives напечатан как NaN. Я знаю, что такое NaN. Я также определил, что переменные по той или иной причине создаются как строки. Мне кажется странным, что он работает для четырех из пяти переменных. Нет никакой последовательности. Я пробовал некоторые преобразования чисел, используя Number(lives), но это тоже не работает. Любые предложения о том, как я могу гарантировать, что переменные будут созданы как числа, и аритмические операции будут работать?Арифметика с переменными не работает

var wins = 0, 
    ties = 0, 
    losses = 0, 
    lives = 5, 
    previouscpuChoice = 0; 

$("#startknapp").click(function(){ 
    var spiller = prompt("Hva heter du?"); 
    $("#userSelect").html(userMenu); 
    $("#result").html("<h4>Velg figur, " + spiller + "</h4>"); 
    $("#status").html('<h4>Liv: <span id="life">' +lives+ '</span> - Seire: <span id="win">' + wins + '</span> - Uavgjort: <span id="tie">' + ties + '</span> - Tap: <span id="lose">' + losses + '</span>'); 
    console.log(typeof "lives"); 
    console.log(typeof "wins"); 
    }); 

function updateScore(result) { 
    tie = document.getElementById("tie"); 
    win = document.getElementById("win"); 
    lose = document.getElementById("lose"); 
    lives = document.getElementById("life"); 
    console.log(typeof "wins"); 
    var imgSrc = "images/" + userChoice + "-" + result + ".png"; 

    if (result === "tie") { 
    ties = ties + 1; 
    tie.innerHTML = ties; 
    $('.result-img').attr('src', 'images/tie.png'); 
    } 

    if (result === "vant") { 
    wins++; 
    $('.result-img').attr('src', imgSrc); 
    } 

    if (result === "tapte") { 
    losses++; 
    lives--; 
    lose.innerHTML = losses; 
    life.innerHTML = lives; 
    $('.result-img').attr('src', imgSrc); 
    } 
}; 
+0

_getElementById_ возвращает ** элемент DOM **, а не значение ввода Я бы посоветовал вам не писать на Vanilla JS на данный момент, вместо этого используйте JS-библиотеку, например jQuery. – hindmost

ответ

1

Вы пробовали следующее?

var tie = parseInt(document.getElementById("tie").value); 

Ваш текущий код:

document.getElementById("tie") 

извлекает элемент DOM, а не значение входного сигнала. поэтому вам нужно использовать .value, а затем вы анализируете его как целое число, так как значение входных данных, скорее всего, представляет собой строковое представление нужного числа, а не целочисленное значение.

+0

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

+0

Когда вы назначили переменные в верхней части или когда вы назначили их с помощью UpdateScore? Оператор «+» в JS является довольно странным. Если у вас есть строка + число, то она будет конкатенироваться, а не бросать ошибку или добавлять их вместе. Любой из других операторов будет преобразовывать его в число, например, если ваша строка была вызвана x, и вы сделали x * 1, тогда она преобразует ее в число и умножит ее на 1 (давая вам то же значение). – Vistari

+1

А я думаю, что неправильно понял. Вы имеете в виду, когда вы запускали 'console.log (typeof" lives ");' он возвращал строку? В этом случае это потому, что вы проверяете, какой тип «живет», это строка. Вам нужен тип переменной 'lives', поэтому вы не должны использовать речевые метки следующим образом:' console.log (typeof lives); '. Это проверит тип переменной, а не строку, которую вы ему дали. – Vistari

1

После размышления я понял, что все в порядке, если переменные являются строками, и смотрел на код с другой точки зрения. И что вы знаете, это была простая ошибка.

$("#startknapp").click(function(){ 
    var spiller = prompt("Hva heter du?"); 
    $("#userSelect").html(userMenu); 
    $("#result").html("<h4>Velg figur, " + spiller + "</h4>"); 
    $("#status").html('<h4>Liv: <span id="life">' +lives+ '</span> - Seire: <span id="win">' + wins + '</span> - Uavgjort: <span id="tie">' + ties + '</span> - Tap: <span id="lose">' + losses + '</span>'); 
    console.log(typeof "lives"); 
    console.log(typeof "wins"); 
    }); 

function updateScore(result) { 
    tie = document.getElementById("tie"); 
    win = document.getElementById("win"); 
    lose = document.getElementById("lose"); 
    life = document.getElementById("life"); 

Первоначально последняя строка updateScore (результат) была:

lives = document.getElementById("life"); 

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

+1

Рад, что вам удалось его решить. Я не знаю, поняли ли вы это или посмотрели мой последний комментарий, но я надеюсь, что то, что я сказал, было полезно. Переменные Javascript на самом деле не являются безопасными типами, которые могут сделать арифметические операции, такие как '+', дать вам интересные результаты, которые могут привести к отчаянию. – Vistari

+0

Конечно, ваши комментарии помогли. Когда я попробовал решение, которое вы предложили, я обнаружил, что ни одна из арифметических операций не работала. Следовательно, это была проблема, связанная с тем, как я назначил переменную. Значит, ты помог мне. Теперь, все, что мне нужно сделать, это выяснить хороший игровой цикл. –