La normalisation JS est passée à un cycle de mise à jour d'un an, et le début de l'année est le moment idéal pour découvrir ce qui nous attend à l'anniversaire - la dixiÚme édition d'EcmaScript!
ES 9 est la version actuelle de la spécification .
ES 10 est encore un projet .
à ce jour, l' étape 4 # n'a que quelques suggestions.
Et à l' étape 3 # - une douzaine entiÚre!
Parmi ceux-ci, à mon avis, les plus intéressants sont les champs privés des classes # , la grammaire shebang pour les scripts # , les nombres de précision arbitraire # , l' accÚs au contexte global # et les importations dynamiques # .

Photo de: kasper.green; Aimant jaune: elfafeya.art & kasper.green
Table des matiĂšres
âą catch
- l'argument est devenu facultatif # ;
âą Symbol().description
- accesseur de la description du symbole # ;
âą ' EcmaScript'
- compatibilité améliorée avec le format JSON # ;
âą .toString()
- méthode prototype mise à jour # .
âą Object.fromEntries()
- création d'un objet à partir d'un tableau de paires - clé \ valeur # ;
âą .flat()
et .flatMap()
sont des méthodes prototype de tableau .
âą #
- tout est privé dans les classes, via octotorp # ;
âą #!/usr/bin/env node
- grammaire shebang pour les scripts # ;
âą BigInt()
- une nouvelle primitive, pour les nombres de précision arbitraires # ;
âą globalThis
- une nouvelle façon d'accéder au contexte mondial # ;
âą import(dynamic)
- importation dynamique # ;
âą import.meta
- méta-informations sur le module chargé # ;
âą JSON.stringify()
- correction de la méthode # ;
âą RegExp
- fonctionnalités obsolÚtes # ;
âą .trimStart()
et .trimEnd()
- méthodes de chaßne de prototype # ;
âą .matchAll()
- .match()
avec l'indicateur global # ;
Cinq étapes
Ătape 0 â Strawman Basting Une idĂ©e qui peut ĂȘtre implĂ©mentĂ©e via le plugin Babel .
Ătape 1 â Proposition Proposition VĂ©rification de la viabilitĂ© de l'idĂ©e.
Ătape 2 â Projet de projet DĂ©but du dĂ©veloppement des spĂ©cifications.
Ătape 3 â SpĂ©cification de l'aperçu du candidat .;
Ătape 4 Ö TerminĂ© La version finale des spĂ©cifications pour cette annĂ©e est terminĂ©e.
Nous ne considérerons que l' étape 4 - la norme de facto.
Et l' étape 3 - qui est sur le point d'en faire partie.
Ö Ătape 4
Ces modifications sont déjà standard.
Argument facultatif pour catch
https://github.com/tc39/proposal-optional-catch-binding
Avant ES 10, le catch
nĂ©cessitait un argument requis pour collecter les informations d'erreur, mĂȘme s'il n'Ă©tait pas utilisĂ©:
function isValidJSON(text) { try { JSON.parse(text); return true; } catch(unusedVariable) {

Edge n'a pas encore été mis à niveau vers ES 10 et devrait se bloquer avec une erreur.
Ă partir de l'Ă©dition ES 10, les parenthĂšses peuvent ĂȘtre omises et la catch
deviendra comme deux gouttes d'eau comme try
.

Mon Chrome a déjà été mis à jour vers ES 10 et, à certains endroits, vers Stage 3 . D'autres captures d'écran proviendront de Chrome
code source function isValidJSON(text) { try { JSON.parse(text); return true; } catch {
Accéder aux descriptions des liens symboliques
https://tc39.imtqy.com/proposal-Symbol-description/
Une description de lien symbolique peut ĂȘtre obtenue indirectement en utilisant la mĂ©thode toString ():
const symbol_link = Symbol("Symbol description") String(symbol_link)
à partir d' ES 10, les caractÚres ont une propriété de description en lecture seule. Il vous permet d'obtenir une description du symbole sans aucune danse avec un tambourin:
symbol_link.description
Si la description n'est pas spécifiée, elle renverra - undefined
:
const without_description_symbol_link = Symbol() without_description_symbol_link.description
ChaĂźnes EcmaScript compatibles avec JSON
https://github.com/tc39/proposal-json-superset
EcmaScript, avant sa dixiÚme édition, prétend que JSON est un sous-ensemble de JSON.parse
, mais ce n'est pas vrai.
Les lignes JSON peuvent contenir des séparateurs de lignes non blindés U+2028
SĂPARATEUR DE LIGNE et les paragraphes U+2029
SĂPARATEUR DE PARAGRAPHE .
ECMAScript s'aligne jusqu'Ă la dixiĂšme version - no.
Si vous appelez eval()
dans Edge avec la chaĂźne "\u2029"
,
il se comporte comme si nous faisions un saut de ligne - en plein milieu du code:

Avec les lignes ES 10 - tout va bien:

Raffinement du prototype de la méthode .toString()
http://tc39.imtqy.com/Function-prototype-toString-revision/
Changer les objectifs- supprimer l'exigence incompatible en amont:
Si l'implémentation ne peut pas créer une chaßne de code source répondant à ces critÚres, elle doit renvoyer une chaßne pour laquelle eval lÚvera une exception avec une erreur de syntaxe.
clarifier une exigence «fonctionnellement équivalente»;
normaliser la représentation sous forme de chaßne des fonctions intégrées et des objets hÎtes;
clarifier les exigences de présentation en fonction des «caractéristiques réelles» d'un objet;
assurez-vous que l'analyse de la chaĂźne contient le mĂȘme corps de fonction et la mĂȘme liste de paramĂštres que l'original;
pour les fonctions définies à l'aide du code ECMAScript, toString doit renvoyer un fragment du texte source du début du premier jeton à la fin du dernier jeton correspondant à la construction grammaticale correspondante;
pour les objets fonctionnels intégrés, toString ne doit renvoyer rien d'autre qu'une NativeFunction;
pour les objets appelés qui n'ont pas été définis à l'aide du code ECMAScript, toString doit renvoyer un NativeFunction;
pour les fonctions créées dynamiquement (constructeurs de fonctions ou générateurs), toString doit synthétiser le texte source;
pour tous les autres objets, toString doit lever une exception TypeError.
Création d'un objet à l'aide de la méthode Object.fromEntries()
https://github.com/tc39/proposal-object-from-entries
fonctionne en chrome
Analogue de _.fromPairs
de lodash
:
Object.fromEntries([['key_1', 1], ['key_2', 2]])
Tableaux unidimensionnels avec .flat()
et .flatMap()
https://github.com/tc39/proposal-flatMap
fonctionne en chrome
La baie a acquis les prototypes .flat()
et .flatMap()
, qui sont généralement similaires aux implémentations lodash , mais présentent encore quelques différences. Argument facultatif - définit la profondeur de traversée maximale de l'arbre:
const deep_deep_array = [ 'â„0 â ', [ 'â„1 â ', [ 'â„2 â ', [ 'â„3 â ', [ 'â„4 â ' ] ] ] ] ]
.flatMap()
équivaut à appeler consécutivement .map().flat()
. La fonction de rappel passée à la méthode doit renvoyer un tableau qui fera partie d'un tableau plat commun:
['Hello', 'World'].flatMap(word => [...word])
En utilisant uniquement .flat()
et .map()
, l'exemple peut ĂȘtre réécrit comme ceci:
['Hello', 'World'].map(word => [...word]).flat()
Notez également que .flatMap()
, contrairement Ă .flat()
n'a pas de paramÚtres de profondeur d'analyse. Donc seul le premier niveau sera collé.
Ö Ătape 3
Propositions issues du projet de statut mais non encore entrées dans la version finale de la norme.
Privé \ statique \ méthodes publiques \ propriétés \ attributs des classes
https://github.com/tc39/proposal-class-fields
https://github.com/tc39/proposal-private-methods
https://github.com/tc39/proposal-static-class-features
Dans certaines langues, il existe un accord pour appeler des mĂ©thodes privĂ©es avec un espace visible (" _ " - une telle piĂšce, vous connaissez peut-ĂȘtre ce signe sous le mauvais nom - soulignement) .
Par exemple, comme ceci:
<?php class AdultContent { private $_age = 0; private $_content = 'âŠis dummy example content (âą)(âą) â3 (.)(.) only for adultsâŠ'; function __construct($age) { $this->_age = $age; } function __get($name) { if($name === 'content') { return " (age: ".$this->_age.") â ".$this->_getContent()."\r\n"; } else { return 'without info'; } } private function _getContent() { if($this->_contentIsAllowed()) { return $this->_content; } return 'Sorry. Content not for you.'; } private function _contentIsAllowed() { return $this->_age >= 18; } function __toString() { return $this->content; } } echo "<pre>"; echo strval(new AdultContent(10));
Permettez-moi de vous rappeler - ce n'est qu'un accord. Rien n'empĂȘche d'utiliser le prĂ©fixe Ă d'autres fins, d'utiliser un prĂ©fixe diffĂ©rent ou de ne pas l'utiliser du tout.
Personnellement, je suis impressionné par l'idée d'utiliser un espace visible comme préfixe pour les fonctions qui retournent this
. Ils peuvent donc ĂȘtre combinĂ©s en une chaĂźne d'appels.
Les développeurs de la spécification EcmaScript sont allés plus loin et ont intégré le préfixe- octotorp (« # » - réseau, hachage) à la syntaxe.
L'exemple prĂ©cĂ©dent sur ES 10 peut ĂȘtre réécrit comme suit:
export default class AdultContent {
L'exemple est inutilement compliquĂ© pour dĂ©montrer les propriĂ©tĂ©s, mĂ©thodes et attributs privĂ©s Ă la fois. Mais en gĂ©nĂ©ral, JS - plaĂźt Ă l'Ćil par sa concision par rapport Ă la version PHP. Pas de fonction privĂ©e _... pour vous, pas de point-virgule en fin de ligne, et un point au lieu de "->" pour aller plus loin dans l'objet.
Getters nommés. Pour les noms dynamiques, les objets proxy.
Cela semble ĂȘtre des bagatelles, mais aprĂšs le passage Ă JS, il y a de moins en moins de dĂ©sir de revenir Ă PHP.
Soit dit en passant, les accesseurs privés sont disponibles uniquement avec Babel 7.3.0 et versions ultérieures.
Au moment d'écrire ces lignes, la version la plus récente de npmjs.com est 7.2.2
Au plaisir de l'étape 4!
Shebang Grammar
https://github.com/tc39/proposal-hashbang
Hashbang est un moyen pour Unix de spécifier un interpréteur pour un fichier exécutable:
#!/usr/bin/env node // 'use strict'; console.log(1);
#!/usr/bin/env node // export {}; console.log(1);
Chrome lance SyntaxError: Invalid or unexpected token
un SyntaxError: Invalid or unexpected token
sur un SyntaxError: Invalid or unexpected token
similaire
Grands chiffres avec BigInt
https://github.com/tc39/proposal-bigint
prise en charge du navigateur Entier maximal pouvant ĂȘtre utilisĂ© en toute sĂ©curitĂ© en JavaScript (2â”Âł - 1):
console.log(Number.MAX_SAFE_INTEGER)
BigInt est nécessaire pour utiliser des nombres de précision arbitraires.
Ce type est déclaré de plusieurs maniÚres:
Il s'agit d'un nouveau type primitif:
typeof 123;
Il peut ĂȘtre comparĂ© aux nombres ordinaires:
42n === BigInt(42);
Mais les opĂ©rations mathĂ©matiques doivent ĂȘtre effectuĂ©es dans un seul type:
20000000000000n/20n
Unaire moins est pris en charge, unaire plus renvoie une erreur:
-2n
globalThis
- une nouvelle façon d'accéder au contexte mondial
https://github.com/tc39/proposal-global
fonctionne en chrome
Ătant donnĂ© que les implĂ©mentations de portĂ©e globale dĂ©pendent d'un moteur particulier, vous avez dĂ» faire quelque chose comme ceci avant:
var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } throw new Error('unable to locate global object'); };
Et mĂȘme cette option ne garantissait pas que tout fonctionnerait Ă coup sĂ»r.
globalThis
C'est un moyen commun pour toutes les plateformes d'accéder à la portée mondiale:
import(dynamic)
https://github.com/tc39/proposal-dynamic-import
prise en charge du navigateur Je voulais des variables dans les lignes d'importation Avec les importations dynamiques, cela est devenu possible:
import(`./language-packs/${navigator.language}.js`)
L'importation dynamique est une opération asynchrone. Renvoie une promesse qui, aprÚs avoir chargé le module, le renvoie à la fonction de rappel.
Par conséquent, vous pouvez charger des modules - différés si nécessaire:
element.addEventListener('click', async () => {
Syntaxiquement, cela ressemble Ă un appel Ă la fonction import()
, mais n'hérite pas de Function.prototype
, ce qui signifie qu'il ne réussira pas à appeler par call
ou Ă apply
:
import.call("example this", "argument")
https://github.com/tc39/proposal-import-meta
fonctionne en chrome
Dans le code du module chargé, il est devenu possible d'obtenir des informations à ce sujet. Maintenant, ce n'est que l'adresse à laquelle le module a été chargé:
console.log(import.meta);
JSON.stringify()
méthode JSON.stringify()
https://github.com/tc39/proposal-well-formed-stringify
La section 8.1 de la RFC 8259 exige que le texte JSON échangé en dehors d'un écosystÚme fermé soit codé en utilisant UTF-8, mais JSON.stringify peut renvoyer des chaßnes contenant des points de code qui ne sont pas représentés dans UTF-8 (en particulier, les points de code de substitution de U + D800 à U + DFFF)
Ainsi, la ligne \uDF06\uD834
aprĂšs le traitement de JSON.stringify () se transforme en \\udf06\\ud834
:
JSON.stringify('\uDF06\uD834') '"\\udf06\\ud834"' JSON.stringify('\uDEAD') '"\\udead"'
Cela ne devrait pas ĂȘtre le cas, et la nouvelle spĂ©cification corrige cela. Edge et Chrome ont dĂ©jĂ Ă©tĂ© mis Ă jour.
Fonctionnalités RegExp obsolÚtes
https://github.com/tc39/proposal-regexp-legacy-features
Spécification des fonctions RegExp héritées, telles que la méthode RegExp.$1
et RegExp.prototype.compile()
.
Méthodes de chaßne de prototype .trimStart()
et .trimEnd()
https://github.com/tc39/proposal-string-left-right-trim
fonctionne en chrome
Par analogie avec les méthodes .padStart()
et .padEnd()
, coupez les espaces au début et à la fin de la ligne, respectivement:
const one = " hello and let "; const two = "us begin. "; console.log( one.trimStart() + two.trimEnd() )
.matchAll () est une nouvelle méthode de chaßne prototype.
https://github.com/tc39/proposal-string-matchall
fonctionne en chrome
Fonctionne comme la méthode .match()
avec le drapeau g
activé, mais renvoie un itérateur:
const string_for_searh = 'olololo'
L'argument doit ĂȘtre une expression rĂ©guliĂšre, sinon une exception sera levĂ©e:
'olololo'.matchAll('o')
Résumé
L'Ă©tape 4 a apportĂ© plus de changements cosmĂ©tiques. L'intĂ©rĂȘt est l' Ă©tape 3 . La plupart des suggestions dans Chrome sont dĂ©jĂ implĂ©mentĂ©es et les propriĂ©tĂ©s des objets sont vraiment tournĂ©es vers l'avenir.
Corrections dans l'article
Si vous avez remarquĂ© une inexactitude dans l'article, une erreur ou s'il y a quelque chose Ă complĂ©ter, vous pouvez m'Ă©crire un message personnel , mais il vaut mieux utiliser le rĂ©fĂ©rentiel d'articles https://github.com/KasperGreen/es10 vous-mĂȘme. Pour contribution active, je dĂ©cernerai une mĂ©daille magnĂ©tique jaune avec KDPV.
Matériel connexe
Version actuelle de la norme Ecma-262
Projet de la prochaine version de la norme Ecma-262
ECMAScript
Nouveaux champs de classe privée en JavaScript
Présentation des normes ES7, ES8 et ES9
Shebang
BigInt - longue arithmétique en JavaScript
Chemin du module JavaScript
Pourquoi pas privé x
Proposition ECMAScript: Array.prototype. {Flat, flatMap}
Champs de cours publics et privés
JavaScript: le grand tout bien pourquoi
UPD (mars):
Changé le statut en Stage - 4 :
âą .trimStart()
et .trimEnd()
- méthodes de chaßne de prototype # ;
âą .matchAll()
- .match()
avec l'indicateur global # ;

Photo de: kasper.green; Aimant jaune: elfafeya.art & kasper.green