Lançamento do V8 v8.5
A cada seis semanas, criamos uma nova ramificação do V8 como parte de nosso processo de lançamento. Cada versão é ramificada do Git master do V8 imediatamente antes de um marco Beta do Chrome. Hoje temos o prazer de anunciar nossa mais nova ramificação, V8 versão 8.5, que está em beta até seu lançamento em coordenação com a versão estável do Chrome 85 nas próximas semanas. O V8 v8.5 está cheio de diversas novidades voltadas para desenvolvedores. Este post fornece uma prévia de alguns dos destaques na antecipação do lançamento.
JavaScript
Promise.any
e AggregateError
Promise.any
é um combinador de promessas que resolve a promessa resultante assim que uma das promessas de entrada for cumprida.
const promises = [
fetch('/endpoint-a').then(() => 'a'),
fetch('/endpoint-b').then(() => 'b'),
fetch('/endpoint-c').then(() => 'c'),
];
try {
const first = await Promise.any(promises);
// Qualquer uma das promessas foi cumprida.
console.log(first);
// → por exemplo 'b'
} catch (error) {
// Todas as promessas foram rejeitadas.
console.assert(error instanceof AggregateError);
// Registre os valores da rejeição:
console.log(error.errors);
}
Se todas as promessas de entrada forem rejeitadas, a promessa resultante é rejeitada com um objeto AggregateError
contendo uma propriedade errors
que guarda uma lista de valores de rejeição.
Por favor, veja nossa explicação para mais detalhes.
String.prototype.replaceAll
String.prototype.replaceAll
fornece uma maneira fácil de substituir todas as ocorrências de um substring sem criar um RegExp
global.
const queryString = 'q=query+string+parameters';
// Funciona, mas requer escape dentro de expressões regulares.
queryString.replace(/\+/g, ' ');
// → 'q=query string parameters'
// Mais simples!
queryString.replaceAll('+', ' ');
// → 'q=query string parameters'
Por favor, veja nossa explicação para mais detalhes.
Operadores de atribuição lógica
Os operadores de atribuição lógica são novos operadores de atribuição compostos que combinam as operações lógicas &&
, ||
ou ??
com a atribuição.
x &&= y;
// Aproximadamente equivalente a x && (x = y)
x ||= y;
// Aproximadamente equivalente a x || (x = y)
x ??= y;
// Aproximadamente equivalente a x ?? (x = y)
Note que, ao contrário dos operadores compostos matemáticos e bit a bit, os operadores de atribuição lógica apenas executam a atribuição condicionalmente.
Por favor, leia nossa explicação para uma explicação mais detalhada.
WebAssembly
Liftoff ativado em todas as plataformas
Desde o V8 v6.9, Liftoff tem sido usado como o compilador básico para WebAssembly em plataformas Intel (e o Chrome 69 o habilitou em sistemas desktop). Como tínhamos preocupações sobre aumento de memória (devido à geração de mais código pelo compilador básico), mantivemos isso desativado para sistemas móveis até agora. Após algumas experimentações nos últimos meses, estamos confiantes de que o aumento de memória é insignificante na maioria dos casos, por isso finalmente habilitamos o Liftoff por padrão em todas as arquiteturas, trazendo maior velocidade de compilação, especialmente em dispositivos arm (32- e 64-bit). O Chrome 85 acompanha e envia o Liftoff.
Suporte multi-valor habilitado
O suporte do WebAssembly para blocos de código multi-valor e retornos de função agora está disponível para uso geral. Isso reflete a recente fusão da proposta no padrão oficial do WebAssembly e é suportado por todos os níveis de compilação.
Por exemplo, agora esta função do WebAssembly é válida:
(func $swap (param i32 i32) (result i32 i32)
(local.get 1) (local.get 0)
)
Se a função for exportada, também pode ser chamada a partir do JavaScript, e retorna uma matriz:
instance.exports.swap(1, 2);
// → [2, 1]
Por outro lado, se uma função JavaScript retornar uma matriz (ou qualquer iterador), ela pode ser importada e chamada como uma função de retorno múltiplo dentro do módulo do WebAssembly:
new WebAssembly.Instance(module, {
imports: {
swap: (x, y) => [y, x],
},
});
(func $main (result i32 i32)
i32.const 0
i32.const 1
call $swap
)
Mais importante ainda, ferramentas de desenvolvimento agora podem usar este recurso para gerar código mais compacto e rápido dentro de um módulo WebAssembly.
Suporte para JS BigInts
O suporte para WebAssembly de converter valores WebAssembly I64 de e para BigInts do JavaScript foi implementado e está disponível para uso geral conforme a última mudança no padrão oficial.
Assim, as funções WebAssembly com parâmetros i64 e valores de retorno podem ser chamadas a partir de JavaScript sem perder precisão:
(module
(func $add (param $x i64) (param $y i64) (result i64)
local.get $x
local.get $y
i64.add)
(export "add" (func $add)))
No JavaScript, apenas BigInts podem ser passados como parâmetros I64:
WebAssembly.instantiateStreaming(fetch('i64.wasm'))
.then(({ module, instance }) => {
instance.exports.add(12n, 30n);
// → 42n
instance.exports.add(12, 30);
// → TypeError: os parâmetros não são do tipo BigInt
});
API do V8
Por favor, use git log branch-heads/8.4..branch-heads/8.5 include/v8.h
para obter uma lista das alterações na API.
Os desenvolvedores com um checkout ativo do V8 podem usar git checkout -b 8.5 -t branch-heads/8.5
para experimentar os novos recursos no V8 v8.5. Alternativamente, você pode assinar o canal Beta do Chrome e testar os novos recursos em breve.