JS 1
JS - как язык выше среднего (так что в принципе ок, хотя это и не принято говорить)
Довольно экспрессив язык (без всякого синтаксического хлама)
Bad parts
- for in
- with
- community
Faces (ecma262 - tc39)
- Brandarn Eich (прототип за 10 дней)
- Allen Wirfs-Brock
- Brian Terlson
- Domenic Denicola
ES2016
- Возведение в степень
- Array#includes
ES2017
- Object.entries
- Object.values
- Trailing comas in func parametr list
- Async functions
- String padding
- Object.getOwnPropertyDescriptors
Exploring ES2016, ES2017
Exploring ES6
- polyfillable
- transpilable
- !transpilable
es6-shim
Object.assign
Берет пропсы одного объекта и экстендит с другим
Берет все собственные ключи (перечисляемые, неперечисляемые, строки, символы,
но не копирует дескрипторы: выполняет геттеры, пропускает null) порядок заспецифицирован
в отличие от Object.keys
- Ключи, которые сводятся к числам
- Потом в порядке добавления
Не нужен this const {assign} = Object
Object.is(val1, val2)
Сравнение SameValueZero
Abstract eq ==
Strict eq ===
SameValue NaN === NaN (Map)
SameValueZero -0 !== 0
const {is} = Object
Object.setPrototypeOf(target, obj)
target.__proto__ = obj
Бросает исключение, если второй аргумент typeof не объект
Array.from
Из iterable создает массив
Array.from(arguments)
Array.from(document.qsA("a"))
Можно заменить (NodeList только с недавнего времени)
[ ...arguments ]
const {from} = Array
from(arguments)
Вместо [].slice.call() - перед ним нужно ставить ;
Array.from({ length: 10 }, (_, i) => {
return i
})
Array#find, Array#findIndex
Итерируют по массиву, пока cb не вернет truethy значение
Идет по массивам с дырками
var arr = [ ,,,, ]
var found = arr.find(function(el) {
if (el.someProp == smth)
return el
})
Array.of
Array.of(10.5) // [10.5]
Вертикальный реюз кода (extend) - это как наследование
Горизонтальный реюз кода (assign) - миксины
Symbols
typeof Symbol() == 'symbol'
Символы не сводятся к строкам и бросают исключение (но можно с помощью String(sym))
Глобальный реестр символов (для шаринга между риэлмами)
Symbol.key
Symbol.keyFor
var sym = Symbol('some stuff') // description для нас
var obj = {}
obj[sym] = 2
obj[sym] // 2
Object.keys(obj) - возвращает ключи свойств, которые перечисляемые строки
Object.getOwnPropertyNames(obj) - возвращает ключи-строки все (в правильном порядке)
Object.getOwnPropertySymbols(obj) - вернет символы
for in - (только перечисляемые) не надо использовать (медленный, не специфицирован:
точно не знаем как будет брать ключи, какой порядок, как будет брать прототип, забывают hasOwnProperty)
Если нужно пройтись:
- Object.keys (все строки, по enum, сортирует)
- Object.values
- Object.entries
- Reflect.ownKeys
Приватные свойства не нужны (их юзают для семантики/структурирования кода), поэтому _ перед ключом хватит
Well-known symbols
Symbol.isConcatSpreadable
NodeList.prototype[Symbol.isConcatSpreadable] = true
Symbol.iterator
function random(n) {
var obj = {}
obj[Symbol.iterator] = function() {
return {
next: function() {
if (n == 0) return { done: true }
n--
return { value: Math.random() }
}
}
}
return obj
}
Array.from(random(10))
Consumers
for (var el of array)
[ ...array ]
new Set(array)
Promise.all(array)
Array.from(array)
Map
Ключи - любые, значения - тоже. Алгоритм SameValue (ключ-значение)
var map = new Map
obj[]
map.get
obj[]
map.set
smth in obj
map.has
delete obj[]
map.delete
Set
Хранит в единственном экземпляре (последовательность)
var set = new Set
set.add(10)
set.add(10)
set.size // 1
set.delete(10)
set.size // 0
WeakSet
(слабые ссылки)
Пройтись по всем нельзя
has, add, delete