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
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
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