Type conversions Flashcards

1
Q

Implicit data types conversion

A

Неявное преобразование типов — палка о двух концах: это источник путаницы и ошибок, но это и полезный механизм, который позволяет писать меньше кода без потери его читабельности.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

=== & ==

A

Оператор строгого равенства === не вызывает неявного преобразование типов.
Оператор нестрогого равенства, ==, с другой стороны, выполняет и операцию сравнения, и, если нужно, выполняет неявное преобразование типов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Types of implicit conversion

A

Есть только три вида преобразований:
В строку (String)
В логическое значение (Boolean)
В число (Number)

И примитивы и объекты могут быть конвертированы в эти три типа.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Implicit string type conversion

A

Неявное преобразование вызывает использование обычного оператора сложения, +, с двумя операндами, если один из них является строкой.
Таким образом можно преобразовать любой примитив кроме Symbol (будет ошибка TypeError).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Implicit boolean type conversion

A

Неявное преобразование происходит в логическом контексте, или вызывается логическими операторами (|| && !).

Операторы, вроде || и && выполняют преобразование значений к логическому типу для внутренних целей, а возвращают значения исходных операндов, даже если они не являются логическими.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

|| and &&

A

ИЛИ “||” находит первое истинное значение
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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Falsie values

A

Boolean(‘’) // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false

Любое значение, не входящее в этот список, преобразуется в true, включая объекты, функции, массивы, даты, Symbol, а также типы, определённые пользователем.
Пустые объекты и пустые массивы тоже преобразуются в true.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Implicit number type conversion

A

Преобразование к типу Number выполняют следующие операторы:

  1. Операторы сравнения (>, <, <=, >=).
  2. Побитовые операторы (|, &, ^, ~).
  3. Арифметические операторы (-, +, *, /, %), если ни один из операторов не является строкой.
  4. Унарный оператор +.
  5. Оператор нестрогого равенства == (а также !=).
    Исключение для == - если оба операнда являются строками.

Symbol не могут быть преобразованы в число ни явно, ни неявно - TypeError.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Conversion of primitives to number

A

При преобразовании строк в числа система сначала обрезает пробелы, а также символы \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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

== with null and undefined

A

При применении оператора == к null или undefined преобразования в число не производится

null == 0 // false
null == null // true
undefined == undefined // true
null == undefined // true
null == ‘’ // false

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

== with NaN

A

Значение NaN не равно ничему, включая себя.

if (value !== value) { console.log(“we’re dealing with NaN here”) }

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Conversion of not primitive values

A

Когда системе нужно провести приведение типов не примитивов, то сначала ей нужно преобразовать объект в примитивное значение, которое затем преобразуется в итоговой тип.
При работе с объектами, как и с примитивами, существует всего три направления преобразований: в число, в строку, и в логическое значение.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Conversion of not primitive to boolean

A

Любое значение, не являющееся примитивом, всегда неявно конвертируется в true, это справедливо и для пустых объектов и массивов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

[[ToPrimitive]] method

A

Объекты преобразуются в примитивные значения с использованием внутреннего метода [[ToPrimitive]], который ответственен и за преобразование в числовой тип, и за преобразование в строку.

Работа алгоритма выглядит следующим образом:

  1. Если входное значение является примитивом — не делать ничего и вернуть его.
  2. Вызвать input.toString(), если результат является значением примитивного типа — вернуть его.
  3. Вызвать input.valueOf(), если результат является значением примитивного типа — вернуть его.
  4. Если ни input.toString(), ни input.valueOf() не дают примитивное значение — выдать ошибку TypeError.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Explicit conversion to String

A

String()

Преобразование происходит очевидным образом. false становится “false”, null становится “null” и т.п.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Explicit conversion to Number

A

Явное преобразование применяется, когда мы ожидаем получить число из строкового контекста, например из текстовых полей форм.

Если строка не может быть явно приведена к числу, то результатом преобразования будет NaN.

17
Q

Explicit conversion to Boolean

A

Falsy значения становятся false, все остальное true.
Falsies: ‘’, 0, NaN, null, false, undefined.

18
Q

Object.is()

A

var isSame = Object.is(value1, value2);

Определяет, являются ли два значения одинаковыми значениями.

Два значения являются одинаковыми в следующих случаях:

оба равны undefined
оба равны null
оба равны true, либо оба равны false
оба являются строками с одинаковой длиной и одинаковыми символами
оба являются одним и тем же объектом
оба являются числами и
оба равны +0
оба равны -0
оба равны NaN
либо оба не равны нулю или NaN и оба имеют одинаковое значение

Данный метод НЕ выполняют приведение типов, поэтому его работа не аналогична ==.