рд╢реБрд░реБрдЖрдд, рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдХреБрдЫ рддрдереНрдпреЛрдВ рдХреЗ рд▓рд┐рдП:
- ECMAScript рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рдорд╛рдирдХ рд╣реИ (рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рд╢рдмреНрдж рд╕рди рдХрд╛ рдЯреНрд░реЗрдбрдорд╛рд░реНрдХ рдерд╛) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ ECMAScript рдорд╛рдирдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
- TC39 рдПрдХ рд╕рдорд┐рддрд┐ рд╣реИ рдЬреЛ ECMAScript рдорд╛рдирдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреА рд╣реИред
- ECMAScript рдорд╛рдирдХ рдХрдИ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп ECMA-262 рд╣реИред
- ECMAScript 5 ECMA-262 рдорд╛рдирдХ (2009 рдореЗрдВ рдЕрдиреБрдореЛрджрд┐рдд) рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
- ECMA-262 рдорд╛рдирдХ рдХреЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдереЗ (рдореИрдВ рдмрд╣реБрдд рдкреБрд░рд╛рдиреЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛):
- ECMAScript 3 - рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд (1999 рдореЗрдВ рдЕрдиреБрдореЛрджрд┐рдд)ред
- ECMAScript 4 - рдорд╛рдирдХ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд░рд╛рдВрддрд┐рдХрд╛рд░реА рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдмрд╛рдж рдореЗрдВ рдЬреБрд▓рд╛рдИ 2008 рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдк-рдбрд╛рдЙрди рд╕рдВрд╕реНрдХрд░рдг (рд▓реЗрдХрд┐рди рдЕрднреА рднреА ECMAScript 3 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдореГрджреНрдз) рдореЗрдВ, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдирдпрд╛ ECMAScript рд╣рд╛рд░реНрдордиреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ред
- ECMAScript 6 (рдХреЛрдбрдирд╛рдо ECMAScript.next) рдХреЛ 2013 рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдореЛрджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреЛ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ?
рдмреНрд▓реЙрдХ рд╕реНрдХреЛрдк
JavaScript . , , c
var
, ( ):
function f(a) {
if (a < 0) {
var i = 3;
}
console.log(i);
}
f(-1)
let
, :
function f(a) {
if (a < 0) {
let i = 3;
}
console.log(i);
}
f(-1)
:
function setLevel(newLevel = 0) {
...
}
setLevel();
setLevel(5);
setLevel(undefined);
:
function foo({ from, to = 10 }) {
...
}
foo({ from: 1, to: 5 });
foo({ to: 5, from: 1 });
foo({ from: 1 });
( ):
function foo(positional, { named1, named2 }) {
...
}
foo(123, { named1: 'abc', named2: 'def' })
foo(123, { named2: 'def', named1: 'abc' })
Destructuring assignment
ECMAScript 6 :
let { first: f, last: l } = { first: 'Jane', last: 'Doe' };
console.log(f);
console.log(l);
, ( ) .
refutable ( , ). .. - , :
let { first: f, last: l } = { first: 'Jane' };
, , irrefutable ?:
let { first: f, last?: l } = { first: 'Jane' };
console.log(l);
:
let { first: f, last: l = 'Unknown' } = { first: 'Jane' };
console.log(l);
, -
undefined
:
let { a: x = 1 } = { a: undefined }
console.log(x);
, , irrefutable, ? :
let { foo: f }? = anything;
f
undefined
,
anything
undefined
,
null
foo
.
(
tmp
):
{ foo: foo, bar: bar } = { foo: bar, bar: foo};
:
[ foo, bar ] = [ bar, foo ];
ECMAScript 6 :
class Person {
constructor(name) {
this.name = name;
}
describe() {
return "Person called " + this.name;
}
}
class Employee extends Person {
constructor(name, title) {
super.constructor(name);
this.title = title;
}
describe() {
return super.describe() + " (" + this.title + ")";
}
}
:
let jane = new Employee("Jane", "CTO");
jane instanceof Person;
jane instanceof Employee;
jane.describe();
:
function Person(name) {
this.name = name;
}
Person.prototype.describe = function () {
return "Person called " + this.name;
};
function Employee(name, title) {
Person.call(this, name);
this.title = title;
}
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.describe = function () {
return Person.prototype.describe.call(this) + " (" + this.title + ")";
};
, ECMAScript 6 тАФ .
:
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static zero() {
return new Point(0, 0);
}
}
( , ECMAScript 6). . .
JavaScript - :
module Math {
export function sum(x, y) {
return x + y;
}
export var pi = 3.141593;
function internal() {
...
}
}
:
import Math.{sum, pi};
alert("2╧А = " + sum(pi, pi));
*
, :
import Math.*;
alert("2╧А = " + sum(pi, pi));
:
module Widgets {
module Button { ... }
module Alert { ... }
module TextArea { ... }
...
}
import Widgets.Alert.{messageBox, confirmDialog};
...
:
module JSON = require('http://json.org/modules/json2.js');
import JSON.*;
module File = require('io/File');
import require("bar.js").y;
.
.
for-of
,
for-in
JavaScript ( ). .. , :
let arr = [ "blue", "green" ];
arr.notAnIndex = 123;
Array.prototype.protoProp = 456;
for(var x in arr) {
console.log(x);
}
ECMAScript 6
for-of
, :
for(var x of arr) {
console.log(x);
}
, ,
yield
, .
Arrow-
ECMAScript 6 arrow functions:
let squares = [ 1, 2, 3 ].map(x => x * x);
:
let squares = [ 1, 2, 3 ].map(function (x) { return x * x });
Arrow- . , arrow-
this
. ..
let jane = {
name: "Jane",
sayHello: function (friends) {
friends.forEach(friend => { console.log(this.name + " says hello to " + friend) });
}
}
jane.sayHello([ 'Mark', 'John' ]);
Jane says hello to Mark
Jane says hello to John
.
let jane = {
name: "Jane",
sayHello: function (friends) {
friends.forEach(function(friend) { console.log(this.name + " says hello to " + friend) });
}
}
:
says hello to Mark
says hello to John
,
this
function(friend) { ... })
this
. , ,
var self = this
bind
:
var jane = {
name: "Jane",
sayHello: function (friends) {
friends.forEach(function (friend) {
console.log(this.name + " says hello to " + friend)
}.bind(this));
}
}
.. arrow functions тАФ :
(x, y) => x + y + this.z
:
function (x, y) { return x + y + this.z }.bind(this)
arrow- :
- arrow- (
new (() => {})
) - Arrow-
arguments
( )
arrow- . , ,
typeof
instanceof
:
typeof () => {};
() => {} instanceof Function;
, ECMAScript 6. , - , , . , , , тАФ . , TC39. (2013) .
Axel' Rauschmayer'a, CodeFest .
PS. 2GIS !