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.