JavaScript - это слабо типизированный язык, что означает, что вам не нужно заранее указывать, какой тип информации будет храниться в переменной. JavaScript автоматически вводит переменную в зависимости от того, какую информацию вы ей назначаете (например, '' или " " для обозначения строковых значений). Многие другие языки, например Java, требуют объявления типа переменной, например int, float, boolean или String.

Это одновременно и благословение, и проклятие.

Хотя система типов JavaScript дает вам большую гибкость, ей не хватает способности строго типизированной системы кричать на вас, когда вы пытаетесь добавить int к объекту, что защищает вас от тратить часы на отладку ошибки типа.

Вот несколько полезных советов, которые помогут вам ориентироваться в системе странных типов JavaScript.

Тип №1

всякий раз, когда тип переменной вызывает сомнения, вы можете использовать оператор typeof:

typeof 1 //> “number”
typeof “1” //> “string”
typeof [1,2,3] //> “object”
typeof {name: “john”, country: “usa”} //> “object”

typeof true //> “boolean”
typeof (1 === 1) //> “boolean”
typeof undefined //> “undefined”
typeof null //> “object”
const f = () => 2
typeof f //> “function”

Вывод: если тип вызывает сомнения, используйте typeof.

# 2 Двойное равенство против тройного равенства

=== означает «равенство без приведения типов». Используя тройное равенство, значения также должны быть одинаковыми по типу.

1 == “1” //> true
1 === “1” //> false
null == undefined //> true
null === undefined //> false
"0" == false //> true
"0" === false //> false
0 == false //> true
0 === false //> false, because they are of a different type

Обратите внимание, вы можете использовать !== для проверки неравенства с приведением типов:

1 != "1" //> false
1 !== "1" //> true

Вывод: всегда используйте ===, так как это более тщательная проверка и поможет избежать неприятных ошибок.

№3 Проверка на ложность

Используя оператор ! (называемый оператором «взрыва») для проверки на ложность, мы замечаем следующее:

![] //> false
!42 //> false
!"hello world" //> false
!null //> true
!undefined //> true
!0 //> true
!"" //> true
!false //> true

null, undefined, 0, “” и false все вернули истину, когда мы применили оператор !. Когда мы применили оператор ! к существующим вещам, например к числу 42 или строке «hello world», мы получили false.

Это показывает, что null, undefined, 0, “” и false все представляют несуществующие или ложные значения, но не одинаково. 0 - это число, обозначающее отсутствие количества. “” - это строка, обозначающая отсутствие вещества в строке. И, наконец, false является логическим значением и означает отсутствие истины. Это можно проверить с помощью простого typeof:

typeof 0 //> "number"
typeof "" //> "string"
typeof false //> "boolean"

undefined и null сложнее. Как показано в приведенном ниже примере, это разные типы, они имеют одинаковое значение, но === сравнение не выполняется:

typeof undefined //> “undefined”
typeof null //> “object”
undefined == null //> true
undefined === null //> false

Поскольку null - это объект, мы можем добавить к нему число. Для undefined, однако, добавление числа дает NaN.

null + //> 1
undefined + 1 //> NaN

Иногда кажется, что добавление числа к null может быть хорошим ярлыком, но не делайте этого!

Хотя null является объектом, вы получаете число, когда добавляете к нему число. Однако, когда вы добавляете к нему другие вещи, он дает вам бессмысленные строки:

null + [1,2,3]//> "null1,2,3"
null + ["hello", "world"] //> "nullhello,world"
null + {0: "hello", 1: "world"} //> "null[object Object]"

Основные выводы:

  • Вы должны быть осторожны, когда проверяете правдивость. Используйте === и проверяйте все типы потенциальных ложных значений, например, if(foo === undefined || foo === null) ..., что может оказаться довольно утомительным.
  • Не добавляйте элементы в null.
  • Лучше всего проверять ложность, используя оператор ! для проверки всех ложных значений, то есть null, undefined, 0, “” и false, за одно действие.

Спасибо за чтение!

Если вы считаете, что эта статья была полезной, ознакомьтесь с другими статьями и руководствами, которые я написал по JavaScript: