В JavaScript, как и в любом другом языке программирования, есть множество удобных приемов, которые позволяют нам легче писать наши программы. В этой статье мы рассмотрим, как разложить свойства объекта и элементы массива на отдельные переменные, объединить несколько объектов в один и управлять URL-адресами с помощью объекта URL
.
Разобрать свойства объекта и элементы массива
С ES6 мы можем использовать ярлыки для присвоения значений объекта его собственной переменной, а также назначать отдельные записи массива в их собственные переменные. Благодаря синтаксису деструктурирующего присваивания мы можем сделать это без явного извлечения пары ключ-значение объекта или записи массива явно по его индексу.
Самый простой способ использовать его на объектах - написать что-то вроде:
const { a, b } = { a: 1, b: 2 };
С помощью приведенного выше кода интерпретатор JavaScript сопоставит имя ключа справа с именем переменной справа. Таким образом, он может присвоить 1 a
и 2 b
. Мы также можем присвоить значение справа переменной с другим именем слева. Для этого мы можем написать следующий код:
const { a: foo, b: bar } = { a: 1, b: 2 };
Приведенный выше код сначала сопоставляет имя ключа справа с именем ключа слева, а затем он будет направлять значение, которое соответствует этим ключам, в переменную справа от двоеточия с левой стороны.
Это означает, что клавиша a
справа будет соответствовать клавише a
слева. Это означает, что значение для a
справа, равное 1, будет присвоено имени переменной, являющейся значением ключа a
, то есть foo
.
Аналогично, клавиша b
справа будет соответствовать клавише b
слева, а значение клавиши b
справа будет присвоено имени переменной, которое соответствует клавише b
слева. В итоге мы получаем, что переменная foo
равна 1, а переменная bar
равна 2.
Мы можем присвоить значения по умолчанию для переменных с левой стороны, чтобы нам не нужно было беспокоиться о том, что они будут undefined
после операции присваивания деструктуризации.
Для этого мы пишем следующее, чтобы установить значение по умолчанию для переменных в левой части с помощью оператора =
, как при обычных операциях присваивания. Например, мы можем установить значения по умолчанию для переменных слева, как в следующем коде:
const { a = 0, b = 0 } = { a: 1 }; console.log(a, b);
Если мы регистрируем значения a
и b
, как мы делали выше, мы должны получить 1 для a
и 0 для b
, поскольку мы не присвоили никакого значения для b
с левой стороны, поэтому значение по умолчанию 0, которое мы указали, автоматически присвоено значение b
, как мы его указали.
Точно так же мы можем использовать синтаксис деструктурирующего присваивания с массивами. Мы можем использовать его, как в следующем коде:
const [a, b] = [1, 2];
С массивами интерпретатор JavaScript сопоставляет позицию переменной с записью массива в позиции, в которой находятся имена переменных. Таким образом, первой записи массива справа будет присвоено имя первой переменной слева, а второму массиву запись справа будет присвоена имени второй переменной слева и так далее. Мы также можем использовать его для обмена значениями переменных, как в следующем коде:
let a = 1, b = 2; [a, b] = [b, a];
Если мы запустим console.log
на a
и b
после назначения деструктуризации, мы получим, что a
равно 2, а b
равно 1. Это очень удобно, поскольку нам не нужно назначать наши переменные временной переменной, чтобы поменять местами значения переменных.
Мы также можем назначать значения по умолчанию для переменных, которые находятся в массивах, когда мы используем их в синтаксисе деструктуризации, чтобы нам не приходилось беспокоиться о том, что переменные будут undefined
после присвоения им значений с помощью синтаксиса деструктуризации. Например, мы можем написать:
let a,b; ([a=1,b=2] = [0])
Это допустимый синтаксис. В приведенном выше коде мы получаем, что a
равно 0, потому что мы присвоили ему 0. b
равно 2, потому что мы ничего ему не присвоили.
Объединение нескольких объектов в один
С помощью оператора распространения мы можем использовать его для объединения нескольких объектов в один. До того, как у нас появился оператор распространения, мы должны перебрать ключи каждого объекта, а затем вручную поместить пары ключ-значение каждого объекта с нашим собственным кодом в новый объект, и мы должны сделать это для всех объектов, которые мы хочу слиться вместе.
Это была настоящая боль. Но теперь, с синтаксисом оператора распространения, мы можем просто применить оператор распространения к каждому объекту в новом объекте, а затем мы получим новый объект со всеми ключами нового объекта. Например, если у нас есть эти объекты:
const obj1 = { a: 1, b: 2 }; const obj2 = { c: 3, d: 4 }; const obj3 = { e: 5, f: 6 }; const obj4 = { g: 7, h: 8 }; const obj5 = { i: 9, j: 10 };
Затем мы можем использовать оператор распространения, чтобы объединить их вместе, как в следующем коде:
const obj1 = { a: 1, b: 2 }; const obj2 = { c: 3, d: 4 }; const obj3 = { e: 5, f: 6 }; const obj4 = { g: 7, h: 8 }; const obj5 = { i: 9, j: 10 }; const mergedObj = { ...obj1, ...obj2, ...obj3, ...obj4, ...obj5 };
Затем, когда мы регистрируем значение mergedObj
, мы получаем:
{ "a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9, "j": 10 }
Если у нас есть объекты с некоторыми или всеми ключами, которые совпадают друг с другом, то значение перекрывающегося ключа, объединенного позже, перезапишет тот, который был объединен ранее. Например, если у нас есть:
const obj1 = { a: 1, b: 2 }; const obj2 = { a: 3, d: 4 }; const obj3 = { a: 5, f: 6 }; const obj4 = { g: 7, h: 8 }; const obj5 = { i: 9, j: 10 }; const mergedObj = { ...obj1, ...obj2, ...obj3, ...obj4, ...obj5 };
Затем, когда мы регистрируем значение mergedObj
, мы получаем:
{ "a": 5, "b": 2, "d": 4, "f": 6, "g": 7, "h": 8, "i": 9, "j": 10 }
Как мы видим, значение свойства a
равно 5. Это потому, что мы сначала слили obj1
со значением a
, равным 1, затем мы слились с obj2
, у которого значение a
равно 3, что перезаписало исходное значение 1, то после того, как мы объединились с obj3
, у которого значение a
равно 5, это перезаписало значение 3, которое было объединено ранее. Таким образом, мы получаем окончательное значение 5 для a
.
Управление URL-адресами
С помощью объекта URL-адреса мы можем передать строку URL-адреса, извлечь и установить различные части URL-адреса и получить новый URL-адрес. Мы можем создать объект URL с помощью конструктора.
Конструктор принимает до 2 аргументов. Либо у нас есть один аргумент, являющийся полной строкой URL-адреса, либо мы можем передать относительную строку URL-адреса, которая является частью полного URL-адреса, в качестве первого аргумента и первой части полной строки URL-адреса, либо имя хоста в качестве второго аргумента. Например, мы можем написать:
new URL('http://medium.com');
or
new URL('/@hohanga', 'http://medium.com');
С помощью объекта URL-адреса мы можем получать и устанавливать различные свойства для получения части URL-адреса, а также устанавливать части URL-адреса для создания нового URL-адреса. С помощью свойства hash
мы можем установить хеш-часть URL-адреса, то есть часть URL-адреса после знака решетки (#
). Например, мы можем написать что-то вроде следующего кода:
const url = new URL('http://example.com/#hash'); console.log(url.hash); url.hash = 'newHash'; console.log(url.toString());
Если мы запустим код, то увидим, что первая console.log
инструкция записывает '#hash'
. Затем мы присвоили значение 'newHash'
свойству url
hash
. Затем, когда мы запускаем метод toString()
для объекта url
и метод console.log
для значения, возвращаемого toString()
, мы получаем 'http://example.com/#newHash'
, которое является новым значением URL-адреса с новым хешем.
Точно так же мы можем изменить имя хоста, которое является первой частью URL-адреса, установив свойство host
. Как и свойство hash
, свойство host
также имеет функцию получения для получения имени хоста URL. Например, мы можем написать что-то вроде следующего кода:
const url = new URL('http://example.com/#hash'); console.log(url.host); url.host = 'newExample.com'; console.log(url.toString());
Если мы запустим код, то увидим, что первый оператор console.log
регистрирует '#hash'
. Затем мы присвоили значение 'example.com'
свойству url
hash
. Затем, когда мы запускаем метод toString()
для объекта url
и запускаем метод console.log
для значения, возвращаемого toString()
, мы получаем ‘http://newexample.com/#hash’
, которое является новым значением URL с новым хешем.
В объекте URL есть другие свойства. Следите за новостями в следующей части, где мы исследуем другие части объекта URL.
В JavaScript, как и в любых других языках программирования, есть много удобных приемов, которые позволяют нам легче писать наши программы. В этой статье мы рассмотрели, как разложить свойства объекта и элементы массива на отдельные переменные, объединить несколько объектов в один и управлять URL-адресами с помощью объекта URL
. С помощью этих уловок мы сокращаем усилия, которые мы вкладываем в написание нашего кода, облегчая нашу жизнь.