JS 2


key - value - descriptor
value(undefined)/writable/enum/config(false - Object.defineProperty; true)
get(undefined)/set(undefined)/enum/config

var obj = {
  get a() { return 1 }
}

let, const

let (чаще, т.к. tc-39, хотя комьюнити больно)
const на уровне файла (require) - окей, и шаришь на больном куске кода
var - тоже есть кейсы (область видимости - функция, норм)

// error
if (smth) {
  // syntax error TDZ (temporale dead zone)
  let x = 10
}
// error

references typeof smth - пытается найти, если не находит, то smth - ссылка, которая unresolved, поэтому undefined
smth - попытается сделать get value и будет исключение
(typeof для проверки на undefined - ПЛОХО)

Так же работает delete obj.key

TDZ let, const, class

Destructuring

link

let {attrs} = node // если node == null исключение
let [a,b] = [b,a] // если не iterable исключение
let [a,b] = new Set([ b, a ])

let {attrs: {href}} = node

let {a: b} = obj

Default values

function f(a = 20, b, c) {}
f(1,2,3)

Если в параметрах функция, у нее separate scope

function f(a, b = () => typeof c) {
  var c = 20
  return b()
}
f(1) // "undefined"

Rest

может идти только последним

let [first, ...a] = [1,2,3]

не продливает function.length (количество формальных параметров)

object literal

var obj = {
  someProp,

  [2 + 3]: 5,

  method() {}, // enumerable, в классе нет, нельзя с new юзать, super new.target нет, this, arguments работают

  __proto__: null
}

Numbers

0o777, 0b10010101

RegExp

link

Template strings

var name = 'Alexey'
`hello, my name is ${name}`



const format = (strings, ...values) => {
  var result = ""
  while (strings.length) {
    result += strings.shift() + values.shift().getMonth()
  }
  return result
}

format`hello, my name is ${data}`

react with template strings
streaming template literals

Arrow functions

arguments, super, new.target, this отсутствуют (лексические)

let arrow = () => {}

Spread operator

[ ...[1,2,3], 4] // [1,2,3,4]
{ ... } - для объектов еще не стандарт, можно обойтись Object.assign
array = array.concat(smth) плохо, лучше
array.push(...smth)

Classes

без new - исключение

let MyClass = class {
  constructor() {

  }

  methodA() {} // MyClass.prototype

  static methodB() {} // on MyClass // не работают с new, не enumerable, не writable

  static get from() {}
  set find() {}
  [Symbol.iterator]() {}
}

Заэкстендить (subclass)

class MySet extends Set {
  // по умолчанию
  constructor() {
    super(...arguments) // до вызова нельзя юзать this
    // new.target == MySet
  }

  join(str) {
    return [ ...this ].join(str)
  }
}

super - статический resolve - поменять нельзя, методы при создании запоминают, где super
new.target - то, что вызывается с new

this обеспечивает точка mySet.join() - reference
(0, mySet.join)() - resolve reference, потеря this