Изменение числовых значений при применении toString()

Я заметил что-то очень странное при тестировании одной из моих функций, которая проверяет правильность чисел, я впервые заметил это при тестировании 'number.toString()[0]'. Если я вошёл в консоль (fLetter(019272)); «0» всегда показывает «1».
После проверки в Интернете я не смог найти никаких проблем, связанных с использованием метода toString() для чисел, содержащих «0».

function numberValidate(number) {

        var numCheck = [0, 5, 7, 8, 9];
        var fLetter = number.toString()[0];

        if (number.match(/^\d{6}$/)) {
            for (var i = 0; i < 5; i++) {
                if (fLetter == numCheck[i]) {
                    return false;
                } else {
                    return true;
                }
            } 
        } 

    } 

Я попытался проверить несколько других тестовых переменных с применением метода toString() и без него и получил некоторые результаты, которые я не мог понять. **Примечание. Добавление toString() дало те же результаты (выполнено в JSfiddle).

var numTest = 00000000;
var numTest1 = 20203020;
var numTest2 = 011000110100;
var numTest3 = 01928;
var numTest4 = 012345;

console.log(numTest);     //Returned 0
console.log(numTest1);    //Returned 20203020
console.log(numTest2);    //Returned 1207996480
console.log(numTest3);    //Returned 1928
console.log(numTest4);    //Returned Returned 5349

Может ли кто-нибудь пролить свет на то, почему я возвращаю эти значения? Спасибо


person Charlie    schedule 22.08.2015    source источник
comment
Итак, в чем собственно вопрос?   -  person Daniel B    schedule 22.08.2015
comment
См. здесь (прочитайте Описание, где написано «Если основание счисления не определено (...)»   -  person ssarabando    schedule 22.08.2015
comment
Спасибо за это - я только сейчас читаю об этом.   -  person Charlie    schedule 22.08.2015


Ответы (2)


Число — это 64-битное представление числа с плавающей запятой. Он не содержит цифры в виде массива символов, поэтому начальный ноль недоступен. Строка содержит массив символов, поэтому начальный 0 не теряется.

JavaScript допускает прозрачное преобразование типов, если это возможно, поэтому строка «0111» == в число 111. Поэтому, если вы напишете код "0111" == 111, он вернет true.

Javascript предоставляет два оператора равенства == и строгое равенство ===, второй требует, чтобы обе стороны были одного типа, поэтому Number(111) === String("111") вернет false, поскольку они не одного типа. То же самое относится и к операторам неравенства != and !==

person Blindman67    schedule 22.08.2015

010 рассматривается как восьмеричное представление из-за ведущего 0, а 0x10 будет рассматриваться как шестнадцатеричное представление. В восьмеричной системе счисления используются цифры от 0 до 7. Таким образом, 019 дает 19, потому что 9 не является восьмеричной цифрой. Вот некоторые десятичные числа и их восьмеричные обозначения:

1  1 | 5  5 | 9  11 | 13 15
2  2 | 6  6 | 10 12 | 14 16
3  3 | 7  7 | 11 13 | 15 17
4  4 | 8 10 | 12 14 | 16 20

Как видите, поскольку у нас доступно только 8 цифр (0, 1, 2, 3, 4, 5, 6, 7), 8 становится 10, а 16 (8+8) становится 20 (10+10). Чтобы было еще понятнее, давайте посмотрим, как считать 10 цифрами (как обычно), а затем 8 цифрами.

Используя 10 цифр:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, no more digits
nevermind, add 1 to the tenths and restart from 0
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, no more digits
nevermind, add 1 to the tenths and restart from 0
20, 21, etc...

Используя 8 цифр:

0, 1, 2, 3, 4, 5, 6, 7, no more digits
nevermind, add 1 to the "tenths" and restart from 0
10, 11, 12, 13, 14, 15, 16, 17, no more digits
nevermind, add 1 to the "tenths" and restart from 0
20, 21, etc...

То же самое относится и к двоичным числам:

   0,   1, no more digits
  10,  11, no more digits
 100, 101, no more digits
 110, 111, no more digits
1000, etc...

Сравним с десятичной записью:

1    1 | 5  101 |  9 1001
2   10 | 6  110 | 10 1010
3   11 | 7  111
4  100 | 8 1000

Связанные материалы: https://stackoverflow.com/a/32107058/1636522 :-)

person leaf    schedule 22.08.2015