Я заметил, что PHP и JavaScript обрабатывают восьмеричные и шестнадцатеричные числа с некоторой трудностью при манипулировании типами и литье:
PHP:
echo 16 == '0x10' ? 'true' : 'false'; //true, as expected
echo 8 == '010' ? 'true' : 'false'; //false, o_O
echo (int)'0x10'; //0, o_O
echo intval('0x10'); //0, o_O
echo (int)'010'; //10, o_O
echo intval('010'); //10, o_O
JavaScript:
console.log(16 == '0x10' ? 'true' : 'false'); //true, as expected
console.log(8 == '010' ? 'true' : 'false'); //false, o_O
console.log(parseInt('0x10')); //16, as expected
console.log(parseInt('010')); //8, as expected
console.log(Number('0x10')); //16, as expected
console.log(Number('010')); //10, o_O
Я знаю, что PHP имеет функции octdec()
и hexdec()
для исправления восьмеричного/шестнадцатеричного неправильного поведения, но я ожидаю, что intval()
будет иметь дело с восьмеричными и шестнадцатеричными числами, как это делает JavaScript parseInt()
.
Во всяком случае, в чем причина этого нечетного поведения?