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