какие-либо недостатки в преобразовании строки-целого числа в целое число в Javascript с помощью (1 * x)?

#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 не преобразуется в целое число.