Рубрики
Без рубрики

Как избежать распространенных ловушек в JavaScript

JavaScript – это мощный язык, но на языке есть определенные синтаксические и поведенческие подводные камни на языке, для которого новичок может упасть. Этот список поможет вам избежать некоторых из них.

Автор оригинала: Ashish.

JavaScript – это мощный язык, но на языке есть определенные синтаксические и поведенческие подводные камни на языке, для которого новичок может упасть. Эти подводные камни обычно возникают из-за таких свойств, как тип принуждения и методология оценки == & === оператор. == и === Операторы оценивают выражение с использованием абстрактных алгоритмов сравнения равенства и строгим алгоритмом сравнения равенства (подробнее об этом в этом руководстве: == vs: двойной равны и принудительно . JavaScript – это слабо напечатанный язык. Это означает, что переменные могут автоматически быть измененным с одного типа на другое при оценке выражения. Хотя это очень мощная особенность языка, это может привести к некоторым нетрадиционным ситуациям.

Понимание, почему эти поведения происходят

1. Равенство пустых массивов

> [] == []
false

На первый взгляд это звучит смешно. Пустой массив не равен себе? Но это не то, что на самом деле означает вышеуказанное утверждение. Массивы хранятся ссылками в JavaScript и в JavaScript, двойной равный оператор возвращает правда только тогда, когда вы сравниваете такие же экземпляры того же типа. Сравнение выше на самом деле спрашивает: «- это пример пустого массива, равный экземпляру другого пустого массива?» что определенно ложь Отказ Вышеуказанное описание похоже на:

> var a = [];
undefined
> var b = [];
undefined
> a == b
false

А и B Ссылки на две разные места в памяти, следовательно, результат является ложным. Однако, если и экземпляры массива были то же самое (как приведен ниже), то ответ ниже был бы правда Отказ

> var a = b = [];
undefined
> a == b
true

2. Равенство пустого массива и не пустое массив

> [] == ![]
true

Прежде чем понять, что происходит выше, нам нужно понять концепцию правда и Falsy в JavaScript и как ! (Логический нет) оператор работает. Такие значения, как ложь , null , undefined , Нан , 0 , '' и "" считаются ложностью. Другие значения, такие как правда , {} , [] , "Фу" и т.д. считаются правдой. ! Оператор, с другой стороны, определен для логический Только ценности. Любой другой тип данных будет автоматически принужден к его соответствующему логичному значению при эксплуатации с ! оператор. Здесь ! [] оценивает ложь И сравнение на самом деле становится:

> [] == false
true

Разве это не должно быть ложным, так как пустые массивы правда? Это правильно, но двойной равный оператор оценивает выражения определенных правил. Мы пытаемся сравнить объект с логическим значением, и JavaScript будет неявно преобразовать операнды на Номер тип. Номер ([]) это 0 и Номер (ложь) тоже 0 , который оценивает правда Поскольку ноль равен нулю.

3. Пустой массив плюс пустой массив

> [] + []
""

Это может выглядеть, как сумма двух массивов будет объединять их и, следовательно, при добавлении двух пустых массивов можно получить еще один пустой массив. Но это не так в JavaScript. Как указано в Спецификация языка ECMA , оператор добавления либо выполняет соединение строки или числовое добавление. Следовательно, + Не определено для массивов, а JavaScript будет неявно преобразовывать массивы в их строка эквивалентно и объединить их. Вышеуказанное выражение станет похожим на:

> [].toString() + [].toString()
""

Согласие двух пустых струн дают еще одну пустую строку и, следовательно, приведенное выше утверждение действительна.

4. Пустой массив минус пустой массив

> [] - []
0

Этот случай аналогичен предыдущему. - Оператор не определен для массивов или Строки Отказ Следовательно, JavaScript будет косвенно преобразовать массивы в соответствующие Номер тип. Принуждение пустого массива в Номер Тип урожайности 0 Отказ Вышеуказанное выражение такое же, как:

> Number([]) - Number([])
0

Ноль минус ноль, очевидно, ноль, что имеет смысл.

5. Странный массив равной странной строке

> [null, undefined, []] == ",,"
true

Это довольно странно. Когда мы пытаемся сравнить непустой массив с строка JavaScript Coardes каждый элемент массива в строку, а затем объединяет их запятыми. Строка null , undefined & [] дает пустую строку. Следовательно, выражение [null, undefined, []]. TOSTRING () Урожайность "," Отказ

6. Плюс пустой массив

> + []
0

Это на самом деле не ват. В JavaScript оператор unary Plus используется для явного преобразования объекта в Номер тип. Так что вышеуказанное утверждение похоже на:

> Number([])
0

7. Пустое массив плюс пустой объект

> [] + {} 
"[object Object]"

Возможно, вы уже догадались. Как видно на третьем пункте, JavaScript принесет массив и объект в строка а затем объединить их. Преобразование по умолчанию для типа объекта на строка это [Тип объекта] , где Тип это тип объекта. Есть разные типы объектов в JavaScript, как Объект , Функция , Массив , Regexp и т. д. В этом случае это Объект Отказ

> "" + "[object Object]"
"[object Object]"

8. Пустой объект плюс пустой массив

> {} + []
0

Ждать! Разве мы не говорили, что JavaScript Coardes объект и массив на строка На плюс оператор? Это на самом деле причудливый край в JavaScript. Компилятор JavaScript понимает это утверждение немного по-другому. Это считает {} как пустой код кода и + [] как другое утверждение. Мы видели + [] приравнивает к 0 Вот почему вышеуказанное выражение оценивает 0 Отказ

9. Пустой объект плюс пустой объект

> {} + {}
NaN

Этот аналогичен примеру выше. Явное преобразование пустого объекта в Номер Тип урожайности Нан Отказ

10. Нуль и ноль

> 0 < null
false
> 0 >= null 
true
> 0 == null 
false

Ну, это разочаровывает. JavaScript двойной равный оператор и реляционный оператор основан на абстрактном алгоритме сравнения равенства и абстрактным алгоритмом реляционного сравнения. Это просто причудливый набор правил для оценки выражения.

Когда мы сравним 0 и null Использование реляционных операторов, JavaScript Coerces null в его примитивный Номер тип. При использовании реляционных операторов сравнение аналогично

> 0 < Number(null)
false
> 0 >= Number(null)
true

null При преобразовании в Номер Тип урожайности 0 который объясняет оценку приведенных выше утверждений. Однако с == Оператор, такое сравнение не попадает в какую-либо категорию правил, определенных для оценки экспрессии == оператор. Ни один 0 ни null Принудительно и по правилам, если такой случай возникает, где сравнение не попадает в какую-либо категорию, ложь возвращается.

11. math.min больше, чем math.max

> Math.min() > Math.max()
true

Многие языки программирования определяют глобальные максимальные и минимальные значения, а также JavaScript, но не с Math.max () или Math.min () Отказ Вместо этого они используются для возврата максимальных и минимальных значений в группе номеров.

Когда эти функции называются без аргументов, Math.max () Возвращает Бесконечность и Math.max () Возвращает -Infinity Отказ

> Math.min(1, 2, 3, 4)
1
> Math.max(1, 2, 3, 4)
4

JavaScript работает Номер. Max_value и Номер .min_value для этой задачи, и они работают как ожидалось.

> Number.MIN_VALUE < Number.MAX_VALUE
true

Обертывание

Это оно! Если у вас есть что-нибудь, чтобы добавить, не стесняйтесь, комментировать ниже. Вы также можете проверить этот купальный лист Handa JavaScript, чтобы узнать больше о JS.