Почему у PHP и JavaScript есть проблемы с восьмеричными и шестнадцатеричными числами?

Я заметил, что 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 () .

В любом случае, в чем причина такого странного поведения?

11
задан mingos 24 November 2011 в 20:16
поделиться