Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как обратить строку в число


Автор: griker 24.9.2006, 20:26
Здравствуйте, у меня возникла проблема при создании калькулятора)
А именно проблема в том, что при следующей записи
Код

var a=document.form.n.value+document.form.m.value;

Это считывается как (при написании) значение первого input и второго input, а не сложение данных переменных.
Возможно данный вопрос является глупым, но всё равно спрашиваю.

Благодарю) 

Автор: dstorm81 24.9.2006, 20:44
a=parseFloat(document.form.n.value)+parseFloat(document.form.m.value);

Автор: griker 24.9.2006, 20:52
Цитата(dstorm81 @ 24.9.2006,  20:44)
a=parseFloat(document.form.n.value)+parseFloat(document.form.m.value);

Большое спасибо) smile 

Автор: korisarimi 24.9.2006, 21:39
еще можно через Number(переменная).

Автор: Zeroglif 24.9.2006, 23:30
Быстрее всего:

Код

var a = +document.form.n.value + +document.form.m.value;

И не нужна будет ни Number, ни тем более parseFloat...

Автор: Sardar 25.9.2006, 01:11
Zeroglif, parseFloat в любом случае вызываеться самим транслятором, а читабельность конечно по вкусу.

Автор: Zeroglif 25.9.2006, 03:02
Цитата(Sardar @  25.9.2006,  01:11 Найти цитируемый пост)
Zeroglif, parseFloat в любом случае вызываеться самим транслятором

Так, да не так, parseFloat лексически является идентификатором, согласно ES 10.1.4 мы ищем идентификатор среди свойств объектов, входящих в Scope Chain, пока по идее не найдём его в поле объекта Global (window в браузерах). Плюс к этому, в рамках самого алгоритма функции parseFloat, который предполагает, что мы можем подсунуть ему всякую пакость (объект, например), аргумент насильно приводится к строке (toString у объектов). Значит, и тут мы снова должны совершить небольшую прогулку, но уже по полям самого объекта (его прототипа и т.д.), если аргументом объект. Да к тому же некоторые из нас имеют стойкую привычку нативные свойства переопределять, parseFloat конечно вряд ли тронут, а вот toString запросто. Добавим сюда до кучи более сложный алгоритм самой функции, чем алгоритм конвертации через унарный плюс или через Number().

Ниже пример, где видно, сколько объектов Scope Chain нужно пройти, и как переопределение toString влияет на parseFloat. А если раскомментировать параметр в функции A, то мы переопределим ("забъём") уже и parseFloat, и само собой получим ошибку.

Код

String.prototype.toString = function(){return 666};

var x = new String('10');

(function A(/*parseFloat*/) {
    return function AA() {
        return function AAA() {
            return function AAAA() {
                return parseFloat(x);
            }();
        }();
    }();
})();


Я это всё не к тому, что дескать  нехорошо переопределять свойства или совать в аргумент объект (всего этого скорее всего не будет!), а к тому, что короткий путь к результату правильнее длинного туда же..., а читабельность конечно же по вкусу smile

Автор: griker 25.9.2006, 15:28
Всем большое спасибо за помощь  smile 
Благодарю  smile 

Автор: Sardar 25.9.2006, 22:04
Zeroglif, вобще это зависит от реализации конечно, но если  помнить что скрипты не являються сильной стороной браузеров, то конечно ты прав smile  В твоём примере можно создат обьект Number с числом (не строкой) 9.5, при parseFloat всё равно будет вызвано toString, при +<ехп> нет.

Вывод: если требуеться сэкономить пару микросекунд, то лучше пользоваться приведением к числу через +.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)