Нелогичный JavaScript
потому-что такова его природа
В свое время Дуглас Крокфорд сказал: “JavaScript - самый неправильно понятый язык программирования в мире”.
Действительно, JavaScript значительно отличается практически от всех остальных языков программирования. JavaScript является мощным инструментом, позволяющим создать практически любой программный продукт, не прибегая к использованию других языков.
Почему же сообщество разработчиков приняло JavaScript? Ответ лежит на поверхности - у нас просто не было выбора.
Еще одно мудрое высказывание Дугласа Крокфорда гласит: “JavaScript построен на некоторых очень хороших идеях и нескольких очень плохих”.
В этой статье мы рассмотрим несколько примеров, указывающих на причины, по которым разработчики считают JavaScript весьма странным языком программирования.
Null является объектом
console.log(typeof null) //Object
В JavaScript null
означает “ничто” и является определением чего-то несуществующего. Но, к сожалению,
тип данных null
это объект.
Исходя из вышеизложенного можно предположить, что null
является экземпляром стандартного встроенного объекта Object
, но на самом деле это не так:
console.log(null instanceof Object) //returns false
NaN является числом
console.log(typeof NaN) // Number
Ну хорошо. Прекрасно. Значит я могу сделать так:
console.log(NaN === NaN) // Казалось бы должен вернуть true, но это не так.
Так как же проверить, является ли значение NaN
. Думаю так:
console.log(isNaN(NaN))
[] не равно []
console.log([] === []) // Должен вернуть true, но возвращает false
Сложение массивов
console.log([1, 2, 3] + [4, 5, 6]) // покажет 1,2,34,5,6 - очень интересный результат
true не равно ![], но так же не равно []
Массив не равен true
, но не массив тоже не равен true
. Массив равен false
, не массив тоже равен false
:
true == []; // -> false
true == ![]; // -> false
false == []; // -> true
false == ![]; // -> true
baNaNa
console.log("b" + "a" + + "a" + "a") // результат baNaNa;
console.log("foo" + + "bar");
Undefined может быть defined
var someValue;
console.log(someValue === undefined); // true, как и ожидалось
а теперь:
var undefined = "I’m not undefined!";
var someValue;
console.log(someValue == undefined); // Ha Ha
Веселая математика
console.log(3 - 1); // -> 2
console.log(3 + 1); // -> 4
console.log('3' - 1); // -> 2
console.log('3' + 1); // -> '31' // Неожиданно и весело, не так ли
Строка не является экземпляром String
"str"; // -> ‘str’
console.log( typeof "str"); // -> ‘string’
console.log("str" instanceof String); // -> false
Надеюсь было весело. Спасибо за внимание.
По материалам статьи XOR “9 Examples Showing How JavaScript Sometimes Behaves Illogically”.