Странные части JavaScript, на которые натыкается каждый разработчик

Как возникла эта проблема?

Марк Андриссен, основатель Netscape Communications, видел, что Интернет должен сделать его более интерактивным. Так возникло видение Mocha - простого скриптового языка Интернета. Это помогло бы миру сделать веб-сайты более удобными и интерактивными, как сейчас. Поэтому Netscape наняла Брендана Эйха для разработки «Схемы для Интернета». Было много разговоров о том, чтобы сделать Java языком Интернета по умолчанию. Но это было просто слишком БОЛЬШОЕ. Было сильное внутреннее давление, чтобы как можно скорее выбрать один язык. Python, Tcl и сама схема были всеми возможными кандидатами. Так что Эйху пришлось работать быстро.

Эйх разработал язык, похожий на Java по синтаксису. И он создал первую версию JS (в то время называемую Mocha) всего за 10 дней. Да, за 10 дней !, так что это создало множество лазеек в языке. Сегодня мы обсудим некоторые из этих «лазеек». Итак, откройте вашу КОНСОЛЬ и давайте попробуем кое-что.

Нулевые и Неопределенные

Мы знаем о null и undefined типах данных в JS. Давай попробуем что-нибудь сейчас,

Введите typeof(undefined) в консоли, вы получите undefined, как и ожидалось, круто. А теперь попробуй typeof(null), что? object. Это не имеет смысла, это должно было быть null.

Во-вторых, значения undefined и null одинаковы. Ждать. Какие? Как?

Оператор двойного равенства «==» выполняет приведение при сравнении двух вещей. Это означает, что «==» будет проверять только свои значения, не обращая внимания на тип данных. Давайте попробуем undefined == null, мы получим true, что означает, что значения undefined и null одинаковы, только их типы данных различны. СТРАННЫЙ!

Объекты и массивы

Нет Два Objects или Arrays одинаковы, даже с одинаковым значением. Посмотрим,

var a =[1]
var b =[1]
a == b 

дает false и то же самое для Объектов. Но если мы присвоим переменной другую переменную, которая содержит объекты или массив, приведет к истинному, например

var a =[1]
var b =a
a == b

дает true.

Теперь давайте попробуем что-нибудь другое

var a =1
var b =a
a=2
console.log(b)

Это напечатает 1, как и ожидалось, потому что мы назначаем b a, что 1, любое изменение a не отразится на b, приемлемо? Давайте посмотрим на это с помощью объектов

var a ={"hey":1}
var b =a
a.hey = 2
console.log(b.hey)

Будет напечатано 2, то же самое и с массивами. Причина этого довольно проста: при объявлении объектов и массивов переменная действует как ссылка на данные, поэтому любые изменения, внесенные в переменную, указывающую на данные, будут отражены во всех переменных. Но почему одни типы данных работают каким-то образом, а другие - совершенно по-другому?

БОНУС!

Бонус за отличную аудиторию, опять же с типом данных null. Слушать! null не равен 0 и не больше 0, но, по-видимому, ≥ 0. НЕЕЕЕТ !!! РЖУ НЕ МОГУ!

null == 0 //false
null > 0  //false
null >= 0 //true

Я бы добавил больше в этот странный, но интересный список. Пожалуйста, исправьте меня, где я когда-либо допустил ошибку в этом блоге, в разделе комментариев ниже. Ваши взгляды очень много значат для меня.