Type conversions Flashcards
Implicit data types conversion
Неявное преобразование типов — палка о двух концах: это источник путаницы и ошибок, но это и полезный механизм, который позволяет писать меньше кода без потери его читабельности.
=== & ==
Оператор строгого равенства === не вызывает неявного преобразование типов.
Оператор нестрогого равенства, ==, с другой стороны, выполняет и операцию сравнения, и, если нужно, выполняет неявное преобразование типов.
Types of implicit conversion
Есть только три вида преобразований:
В строку (String)
В логическое значение (Boolean)
В число (Number)
И примитивы и объекты могут быть конвертированы в эти три типа.
Implicit string type conversion
Неявное преобразование вызывает использование обычного оператора сложения, +, с двумя операндами, если один из них является строкой.
Таким образом можно преобразовать любой примитив кроме Symbol (будет ошибка TypeError).
Implicit boolean type conversion
Неявное преобразование происходит в логическом контексте, или вызывается логическими операторами (|| && !).
Операторы, вроде || и && выполняют преобразование значений к логическому типу для внутренних целей, а возвращают значения исходных операндов, даже если они не являются логическими.
|| and &&
ИЛИ “||” находит первое истинное значение
alert( null || 1 ); // 1 (первое истинное значение)
alert( null || 0 || 1 ); // 1 (первое истинное значение)
alert( undefined || null || 0 ); // 0 (поскольку все ложно, возвращается последнее значение)
И «&&» находит первое ложное значение
alert( 1 && 2 && null && 3 ); // null
Когда все значения верны, возвращается последнее
alert( 1 && 2 && 3 ); // 3
Falsie values
Boolean(‘’) // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false
Любое значение, не входящее в этот список, преобразуется в true, включая объекты, функции, массивы, даты, Symbol, а также типы, определённые пользователем.
Пустые объекты и пустые массивы тоже преобразуются в true.
Implicit number type conversion
Преобразование к типу Number выполняют следующие операторы:
- Операторы сравнения (>, <, <=, >=).
- Побитовые операторы (|, &, ^, ~).
- Арифметические операторы (-, +, *, /, %), если ни один из операторов не является строкой.
- Унарный оператор +.
- Оператор нестрогого равенства == (а также !=).
Исключение для == - если оба операнда являются строками.
Symbol не могут быть преобразованы в число ни явно, ни неявно - TypeError.
Conversion of primitives to number
При преобразовании строк в числа система сначала обрезает пробелы, а также символы \n и \t, находящиеся в начале или в конце строки, и возвращает NaN, если полученная строка не является действительным числом.
Если строка пуста — возвращается 0.
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(“ 12 “) // 12
Number(“-12.34”) // -12.34
Number(“\n”) // 0
Number(“ 12s “) // NaN
Number(123) // 123
Symbol не могут быть преобразованы в число ни явно, ни неявно - TypeError.
== with null and undefined
При применении оператора == к null или undefined преобразования в число не производится
null == 0 // false
null == null // true
undefined == undefined // true
null == undefined // true
null == ‘’ // false
== with NaN
Значение NaN не равно ничему, включая себя.
if (value !== value) { console.log(“we’re dealing with NaN here”) }
Conversion of not primitive values
Когда системе нужно провести приведение типов не примитивов, то сначала ей нужно преобразовать объект в примитивное значение, которое затем преобразуется в итоговой тип.
При работе с объектами, как и с примитивами, существует всего три направления преобразований: в число, в строку, и в логическое значение.
Conversion of not primitive to boolean
Любое значение, не являющееся примитивом, всегда неявно конвертируется в true, это справедливо и для пустых объектов и массивов.
[[ToPrimitive]] method
Объекты преобразуются в примитивные значения с использованием внутреннего метода [[ToPrimitive]], который ответственен и за преобразование в числовой тип, и за преобразование в строку.
Работа алгоритма выглядит следующим образом:
- Если входное значение является примитивом — не делать ничего и вернуть его.
- Вызвать input.toString(), если результат является значением примитивного типа — вернуть его.
- Вызвать input.valueOf(), если результат является значением примитивного типа — вернуть его.
- Если ни input.toString(), ни input.valueOf() не дают примитивное значение — выдать ошибку TypeError.
Большинство встроенных типов рассматривают, как стандартный вариант поведения, конверсию в число, за исключением типа Date, который выполняет преобразование объекта в строку.
Explicit conversion to String
String()
Преобразование происходит очевидным образом. false становится “false”, null становится “null” и т.п.