Числовые значения, изменяемые при применении 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
Может ли кто-нибудь пролить свет на то, почему я возвращаю эти значения? Благодаря
Ответы
Ответ 1
Число представляет собой 64-битное число с плавающей запятой. Он не содержит цифры в виде массива символов, поэтому начальный ноль недоступен. String содержит массив символов, и, следовательно, ведущее 0 не теряется
JavaScript разрешает преобразование прозрачного типа, если возможно, таким образом, строка "0111" == на номер 111. Так что, если вы напишете код "0111" == 111
, он вернет true.
Javascript предоставляет два оператора равенства == и строгое равенство === второе требует, чтобы обе стороны были одного и того же типа, поэтому Number(111) === String("111")
вернет false, поскольку они не являются одним и тем же типом. То же самое относится и к операторам неравенства != and !==
Ответ 2
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
Связанные материалы: fooobar.com/info/1164/...: -)