Значение параметров по-умолчанию. Пока работает только статическое определение, те вы можете задать только явное значение по умолчанию. Динамическое ( когда значение второго параметра основывается на первом ) -- не работает
function testDefaultParams(test = 1, test2 = "2") {
// ...
console.log(test, test2);
}
// с деструктуризацией
function foo({x, y = 5}) {
console.log(x, y);
}
Превратится в
function testDefaultParams() {
var test = arguments.length <= 0 || arguments[0] === undefined ? 1 : arguments[0];
var test2 = arguments.length <= 1 || arguments[1] === undefined ? "2" : arguments[1];
// ...
console.log(test, test2);
}
// с деструктуризацией
function foo(_ref) {
var x = _ref.x;
var _ref$y = _ref.y;
var y = _ref$y === undefined ? 5 : _ref$y;
console.log(x, y);
}
Trailing - множественные параметры
function f(x, ...y) {
// y is an Array
return x * y.length;
}
Превратится в
function f(x) {
for (var _len = arguments.length, y = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
y[_key - 1] = arguments[_key];
}
// y is an Array
return x * y.length;
}
Arrow functions
- Имеют более краткий синтаксис
- Позволяют сохранять контекст без замыканий ( при написании кода)
- если функция не имеет блока - неявно возвращается вычисленное значение ( см пример с .map )
var o = {
name: 'B',
test() {
[1,2,3].forEach(i => {
this.alert(i);
console.log(this, i)
});
},
test2() {
[1,2,3].forEach(i => {
this.alert(i);
console.log(this, i)
});
}
}
[1,2].map( i=> i++ )
Превратится в
( обратите внимание, что имя переменной в которой сохраняется контекст -- зависит от числа таких сохранений и не всегда будет _this
- на это не стоит сильно полагаться и это может повлиять на отладку)
var o = {
name: 'B',
test: function test() {
var _this = this;
[1, 2, 3].forEach(function (i) {
_this.alert(i);
console.log(_this, i);
});
},
test2: function test2() {
var _this2 = this;
[1, 2, 3].forEach(function (i) {
_this2.alert(i);
console.log(_this2, i);
});
}
};
[1, 2].map(function (i) {
return i++;
});
Enhanced Object Literals - Расширеные литералы объектов Если в качестве значения используется переменная с тем же именем, что и ключ - ключ использовать не обязательно;
var a = { a, c: d };
Превратится в
var a = { a: a, c: d };
***Template strings - шаблоны ***
var name = 'TestTemplate';
var time = 'Today';
var t = `This is a pretty little template ${name} string. It was created at ${time}`;
var a = `Test ${this.name} this inside template`;
var b = `${get(this, 'firstName')} ${get(this, 'lastName')}`; // это вообще пример из документации по Эмберу
Превратится в
var name = 'TestTemplate';
var time = 'Today';
var t = 'This is a pretty little template ' + name + ' string. It was created at ' + time;
var a = 'Test ' + this.name + ' this inside template';
var b = get(this, 'firstName') + ' ' + get(this, 'lastName'); // это вообще пример из документации по Эмберу
Destructuring - Деструктуризация - Извлечение свойств из объекта
var [a, , b] = [1,2,3];
var { op: a, lhs: { op: b }, rhs: c } = { op:1 , lhs: { op: 2}, rhs: 3};
Превратится в
var _ref = [1, 2, 3];
var a = _ref[0];
var b = _ref[2];
var _op$lhs$rhs = { op: 1, lhs: { op: 2 }, rhs: 3 };
var a = _op$lhs$rhs.op;
var b = _op$lhs$rhs.lhs.op;
var c = _op$lhs$rhs.rhs;
Let + Const
Для "переменных" которые не изменят свое значение - используем const
( Если у объекта меняются свойства - так же используем его, т.к. ссылка на объект не меняется ). Для перменных внутри функций используем var
. Для блочных переменных ( внутри if
, while
, for
и т.п. - let
)
const x = 'x';
//x = 'y'; // error
let y = 'y';
{
let y = 'y2';
console.log(y); // 'y2'
{
let y = 'y3';
}
}
Превратится в ( обратите внимание, что имена переменных зависят от числа вложенностей и одноименных let - они не являются постоянными - это может повлиять на отладку )emphasized text
var x = 'x';
//x = 'y'; // error
var y = 'y';
{
var _y = 'y2';
console.log(_y); // 'y2'
{
var _y2 = 'y3';
}
}