#javascript #casting #integer
#javascript #Кастинг #целое число
Вопрос:
если вы сравниваете различные явные методы преобразования переменной в integer:
var y = parseInt(x,10) 'text';
// слишком длинный, нуждается в переносе, требуется взлом против восьмерки
var y = x.toFixed(0) 'text';
// все еще длинный, и даже уродливый, и, возможно, глючный
var y = Math.floor(x) 'text';
// длинный и использует математический объект
var y = Number(x) 'text';
// long
var y = x 'text';
// очень короткий, но слишком хакерский
var y = 1 * x 'text';
// простой и короткий
Вы увидите, почему последнее — мое любимое. Тем не менее, мне интересно, есть ли какие-либо скрытые проблемы с этим методом?
Комментарии:
1.
Number(x)
мне кажется довольно явным и приемлемо кратким (сравните это сdocument.getElementById
!).2. Я предпочитаю унарный плюс, потому что это его указанная цель: es5.github.com/#x11.4.6
Ответ №1:
Последнее работает:
1 * 0.5; // 0.5
если вы хотите получить наилучшую читаемость, используйте parseInt. И основание — это не хак!
Редактировать:
Мой любимый:
var y = x|0 'text';
Редактировать: Пожалуйста, обратите внимание, что этот «трюк» работает только с 32-разрядными целыми числами со знаком. Потому что это реализация JavaScript его битовой логики. Итак, наибольшее положительное число, для которого вы можете использовать это, — 2147483647.
Существует одна битовая операция без знака, беззнаковый сдвиг вправо. 0 >>> 1
Комментарии:
1. lol, правда, он не преобразуется в integer, lol. (тем не менее, это меня не очень беспокоит, я просто хочу убедиться, что это не строка) О удобочитаемости —
parseInt
имхо, уменьшает ее, а не улучшает.2. После следующего вычисления оно станет NaN, но да, NaN тоже. Иногда вы просто хотите, чтобы числа оставались числами.
3. Ну, цвет меня смутил. Надеюсь, я помог!
4. Вы сделали) Просто хочу услышать другие ответы, надеясь, что есть что-то еще, о чем мы оба не думали. И, что касается вашего метода, — может
0|x
быть, лучшеx|0
, чем с точки зрения удобочитаемости?5.Обновление:
1326394630086|0
дает-750264378
, поэтому я бы действительно отговаривал кого-либо от его использования.
Ответ №2:
Я считаю, что код должен сначала быть правильным, затем как можно более читаемым для как можно большего числа других людей и, наконец, не дольше, чем требуется. В этом ключе, вот мои предпочтения:
Для преобразования из строки в целое число я предпочитаю:
parseInt(x, 10)
потому что я думаю, что код говорит именно то, что вы пытаетесь сделать. Если вам не нравится дополнительный параметр, вы можете определить свою собственную глобальную служебную функцию:
toInt(x) {return(parseInt(x, 10));}
итак, вы можете просто использовать:
toInt(x)
Когда я просто хочу превратить строку в число, я предпочитаю:
Number(x)
потому что, опять же, я думаю, что это самый явный и наиболее читаемый.
В других примерах, которые у вас есть, x.toFixed(0)
не работает, если x является строкой и Number(x)
, x
и 1*x
не преобразуется в целое число.