JS 1


JS - как язык выше среднего (так что в принципе ок, хотя это и не принято говорить)
Довольно экспрессив язык (без всякого синтаксического хлама)

Bad parts

Faces (ecma262 - tc39)

ES2016

ES2017

Exploring ES2016, ES2017
Exploring ES6


es6-shim

Object.assign

Берет пропсы одного объекта и экстендит с другим
Берет все собственные ключи (перечисляемые, неперечисляемые, строки, символы, но не копирует дескрипторы: выполняет геттеры, пропускает null) порядок заспецифицирован в отличие от Object.keys

  1. Ключи, которые сводятся к числам
  2. Потом в порядке добавления

Не нужен 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)

Если нужно пройтись:

Приватные свойства не нужны (их юзают для семантики/структурирования кода), поэтому _ перед ключом хватит


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