Перейти к основному содержимому

Релиз V8 версии 4.9

· 5 мин. чтения
команда V8

Примерно каждые шесть недель мы создаём новую ветку V8 в рамках нашего процесса релизов. Каждая версия разветвляется от основной ветки Git V8 незадолго до разветвления Chrome для создания Chrome Beta. Сегодня мы рады объявить о нашей новой ветке, V8 версия 4.9, которая будет находиться в бета-версии до её выпуска совместно с Chrome 49 Stable. V8 4.9 наполнен различными нововведениями для разработчиков, поэтому мы хотим дать вам предварительный обзор некоторых из них, ожидая релиза через несколько недель.

91% поддержки ECMAScript 2015 (ES6)

В версии V8 4.9 мы внедрили больше функций ES2015 JavaScript, чем в любом из предыдущих релизов, достигнув 91% завершения, согласно таблице совместимости Kangax (по состоянию на 26 января). Теперь V8 поддерживает дескруктуризацию, параметры по умолчанию, объекты Proxy и API Reflect. Релиз 4.9 также делает конструкции блочного уровня, такие как class и let, доступными вне строгого режима и добавляет поддержку флага sticky для регулярных выражений и настраиваемый вывод Object.prototype.toString.

Деструктуризация

Объявления переменных, параметры и присваивания теперь поддерживают деструктуризацию объектов и массивов с использованием шаблонов. Например:

const o = {a: [1, 2, 3], b: {p: 4}, c: {q: 5}};
let {a: [x, y], b: {p}, c, d} = o; // x=1, y=2, p=4, c={q: 5}
[x, y] = [y, x]; // x=2, y=1
function f({a, b}) { return [a, b]; }
f({a: 4}); // [4, undefined]

Шаблоны массивов могут содержать остаточные шаблоны, которым присваивается оставшаяся часть массива:

const [x, y, ...r] = [1, 2, 3, 4];              // x=1, y=2, r=[3,4]

Кроме того, элементам шаблона можно задавать значения по умолчанию, которые используются в случае отсутствия соответствующего свойства:

const {a: x, b: y = x} = {a: 4};                // x=4, y=4
// или…
const [x, y = 0, z = 0] = [1, 2]; // x=1, y=2, z=0

Деструктуризация может быть использована для более компактного доступа к данным из объектов и массивов.

Proxy и Reflect

После многих лет разработки V8 теперь поддерживает полную реализацию объектов Proxy, соответствующую спецификации ES2015. Proxy являются мощным механизмом для виртуализации объектов и функций с помощью набора предоставленных разработчиком хуков для настройки доступа к свойствам. Помимо виртуализации объектов, Proxy могут быть использованы для перехвата операций, добавления проверки значений свойств, упрощения отладки и профилирования, а также для реализации продвинутых абстракций, таких как мембраны.

Чтобы использовать Proxy для объекта, необходимо создать объект-хэндлер, определяющий различные ловушки, и применить его к целевому объекту, который будет виртуализирован:

const target = {};
const handler = {
get(target, name='мир') {
return `Привет, ${name}!`;
}
};

const foo = new Proxy(target, handler);
foo.bar;
// → 'Привет, bar!'

Объект Proxy сопровождается модулем Reflect, который предоставляет подходящие значения по умолчанию для всех ловушек Proxy:

const debugMe = new Proxy({}, {
get(target, name, receiver) {
console.log(`Отладка: метод get вызван для поля: ${name}`);
return Reflect.get(target, name, receiver);
},
set(target, name, value, receiver) {
console.log(`Отладка: метод set вызван для поля: ${name}, и значения: ${value}`);
return Reflect.set(target, name, value, receiver);
}
});

debugMe.name = 'Джон Доу';
// Отладка: метод set вызван для поля: name, и значения: Джон Доу
const title = `Г-н ${debugMe.name}`; // → 'Г-н Джон Доу'
// Отладка: метод get вызван для поля: name

Для получения дополнительной информации об использовании Proxy и Reflect API см. раздел примеров на странице MDN о Proxy.

Параметры по умолчанию

В ES5 и более ранних версиях для работы с необязательными параметрами в определениях функций требовалось писать вспомогательный код для проверки неопределённости параметров:

function sublist(list, start, end) {
if (typeof start === 'undefined') start = 0;
if (typeof end === 'undefined') end = list.length;
...
}

ES2015 теперь позволяет задавать значения по умолчанию для параметров функций, что делает определения функций более ясными и лаконичными:

function sublist(list, start = 0, end = list.length) {}
sublist([1, 2, 3], 1);
// sublist([1, 2, 3], 1, 3)

Параметры по умолчанию, конечно, можно комбинировать с деструктуризацией:

function vector([x, y, z] = []) {}

Классы и лексические объявления в нестрогом режиме

V8 поддерживает лексические объявления (let, const, локальные функции в блоках) и классы с версий 4.1 и 4.2 соответственно, но до настоящего времени для их использования требовался строгий режим. Начиная с версии 4.9, все эти возможности теперь включены и вне строгого режима в соответствии со спецификацией ES2015. Это значительно облегчает прототипирование в консоли DevTools, хотя мы рекомендуем разработчикам использовать строгий режим для нового кода.

Регулярные выражения

Теперь V8 поддерживает новый sticky flag для регулярных выражений. Sticky-флаг управляет тем, начнется ли поиск в строках с начала строки (обычный режим) или с свойства lastIndex (sticky-режим). Это поведение полезно для эффективного анализа произвольно длинных входных строк с помощью множества различных регулярных выражений. Чтобы включить sticky-поиск, добавьте флаг y к регулярному выражению: (например, const regex = /foo/y;).

Пользовательский вывод Object.prototype.toString

С помощью Symbol.toStringTag пользовательские типы теперь могут возвращать индивидуализированный вывод при использовании Object.prototype.toString (либо напрямую, либо в результате строки приведения):

class Custom {
get [Symbol.toStringTag]() {
return 'Custom';
}
}
Object.prototype.toString.call(new Custom);
// → '[object Custom]'
String(new Custom);
// → '[object Custom]'

Улучшенный Math.random()

V8 v4.9 включает улучшение реализации Math.random(). Как было объявлено в прошлом месяце, мы сменили алгоритм PRNG в V8 на xorshift128+, чтобы обеспечить более качественную псевдослучайную генерацию чисел.

API V8

Пожалуйста, ознакомьтесь с нашим резюме изменений API. Этот документ регулярно обновляется через несколько недель после каждого основного выпуска.

Разработчики с активным исходным кодом V8 могут использовать git checkout -b 4.9 -t branch-heads/4.9, чтобы опробовать новые функции в V8 версии 4.9. В качестве альтернативы вы можете подписаться на Beta канал Chrome и скоро попробовать новые функции самостоятельно.