- PVSM.RU - https://www.pvsm.ru -
Начну издалека. С браузеров. Новинками браузеростроения интересуюсь не так уж и часто, но вот однажды, со скуки, решил посмотреть, что javascript грядущий нам готовит и что с этого нам могут предложить современные браузеры. Речь идет, само собой, не об ECMAScript 5, а уже о ECMAScript 6 ECMAScript Harmony. Через пару минут серфинга я наткнулся на такую вот сводную табличку [1]. Не самая актуальная — Chrome, например, довольно давно поддерживает Proxy [2]. Само собой, разброд оказался еще тот. В браузере это использовать пока не реально.
В браузере. А на сервере? На сервере нет необходимости поддерживать зоопарк различных браузеров. Node.js использует V8 — тот же javascript движок, что и Chrome, соответственно, он должен поддерживать те же новые возможности языка.
Полный энтузиазма, я накидал тестик с использованием let и запустил node.
-«А фиг тебе,» — сказала Нода — «синтаксическая ошибка»!
И, погрустнев, я ненадолго оставил эту затею. Как выяснилось позже — зря.
Node с бешеной скоростью меняла версии. В ченджлогах постоянно писалось про смену версий V8. И где долгожданная гармония?
Несколько дней назад вышла очередная, я зарылся в гугл и почти сразу осознал каким был дураком. Оказывается, node.js относительно давно поддерживает флаг запуска --harmony и несколько других:
Запустил. Протестировал. Работает:)
Пока не так уж и много. Простого объявления классов [3] пока нет, можете не облизываться. Однако, как минимум, из-за Proxy на новые возможности стоит обратить внимание.
Единственная из возможностей Harmony в V8 что включена по умолчанию, без всяких флагов, да и многие, думаю, ей уже постоянно пользуются.
Раньше в js писали «константы» капсом, и некоторые, тем же капсом, в надежде что к ним прислушаются, оставляли комментарии в стиле:
var CONST_C=1;//НЕ ИЗМЕНЯТЬ!!!111
Теперь всё проще:
const C=1;
C=2;
console.log(C);//=>1
В strict mode область видимости констант аналогична let, об этом далее.
Работает только в strict mode. Если нет желания постоянно его прописывать — запускайте с флагом --use_strict. Правда, только если только если не особо активно используете сторонние библиотеки — очень многие без, например, arguments.callee или with жить не могут.
let это новый var [4], в целом аналогичен ему, кроме одного — область видимости ограничена блоком.
Выглядит это так:
"use strict";
let i=1;
{
let i=2;
console.log(i);//=>2;
}
console.log(i);//=>1;
for(let i=0;i<5;i++) console.log(i);//=> 0, 1, 2, 3, 4
console.log(i);//=>1;
if(true) var j=1;//OK
if(true) let k=1;//!!!Так не делать - SyntaxError: Illegal let declaration in unprotected statement context.
//и, как писалось выше:
const C=1;
{
const C=2;
console.log(C);//=>2;
}
console.log(C);//=>1;
Пожалуй, самая интересная из возможностей, доступных на данный момент. Выводит рефлексию в javascript на новый уровень. Например, позволяет динамически создавать несуществующие методы:
var object=Proxy.create({
get:function(proxy,name){
return function(){
console.log(name);
};
}
});
object.test(); //=>"test"
object.privet();//=>"privet"
Когда-то сомневался, что такая штука в javascript вообще появится:)
С помощью Proxy.createFunction можно сделать, например, исполняемые инстансы классов и еще множество вкусностей.
Хорошо расписано тут [5].
Set хранит уникальные значения, Map и WeakMap — ассоциативные массивы, где ключами могут выступать любые объекты и функции. По идее, WeakMap отличается от Map тем, что при удалении всех ссылок на объект, представляющий ключ, удаляется и пара ключ-значение из массива. Однако, в данной реализации V8, Map и WeakMap — одно и то же, т.к. в ней пока не реализован итератор; во избежании утечек памяти, в Map мусор собирается аналогично WeakMap.
var st=new Set;
st.add(5);
st.add(5);
console.log(st.has(5));//=>true
st.delete(5);
console.log(st.has(5));//=>false
st.add(console);
console.log(st.has(console));//=>true
var map=new WeakMap;
var obj={foo:"bar"};
map.set(obj,"val");
console.log(map.get(obj));//=>"val"
map.delete(obj);
console.log(map.get(obj));//=>undefined
//раньше
console.log(typeof null);//=>"object"
//теперь
console.log(typeof null);//=>"null"
Вот такой вот спорный момент. Может поломать старый код, так что флаг --harmony эту фичу не включает. Если есть желание использовать — запускайте с --harmony_typeof.
А теперь о печальном. Хоть и имеются флаг --harmony_modules и юнит-тесты [6] системы модулей в стиле Harmony [7], помучить их мне не удалось. При попытке использования — либо segmentation fault, либо синтаксическая ошибка. Кто разобрался — буду благодарен за подсказку.
До утверждения спецификации еще далеко, большинство вкусных возможностей (тык [3], тык [9], тык [10], тык [11], тык [12] и т.д.) еще не реализовано в V8, но, вроде, уже неплохо:)
Автор: rock
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/15315
Ссылки в тексте:
[1] такую вот сводную табличку: http://kangax.github.com/es5-compat-table/es6/
[2] поддерживает Proxy: http://habrahabr.ru/post/138047/
[3] Простого объявления классов: http://wiki.ecmascript.org/doku.php?id=harmony:classes
[4] let это новый var: http://wiki.ecmascript.org/doku.php?id=harmony:let
[5] тут: http://habrahabr.ru/post/117915/
[6] юнит-тесты: https://github.com/joyent/node/tree/master/deps/v8/test/mjsunit/harmony
[7] системы модулей в стиле Harmony: http://wiki.ecmascript.org/doku.php?id=harmony:modules_examples
[8] deps/v8/src/flag-definitions.h: https://github.com/joyent/node/blob/master/deps/v8/src/flag-definitions.h
[9] тык: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax
[10] тык: http://wiki.ecmascript.org/doku.php?id=harmony:iterators
[11] тык: http://wiki.ecmascript.org/doku.php?id=harmony:generators
[12] тык: http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values
Нажмите здесь для печати.