Inhaltsverzeichnis
VorwortES7 Ăbersicht1. Objekt.EintrĂ€ge2. Objektwerte3. String.prototype.padEnd4. String.prototype.padStart5. Object.getOwnPropertyDescriptor6. Nachgestellte Kommas7. SharedArrayBuffer8. Atomics9. Async-FunktionenVorwort
Hallo, in der Vergangenheit habe ich bereits ĂŒber Neuerungen in ES6 nachgedacht und jetzt ist es an der Zeit, ES8 auseinander zu nehmen, da es viele neue Dinge gebracht hat. Ich habe ES7 (2016) nicht separat betrachtet, da diese Version nur 2 Neuerungen brachte. Dies ist Array.prototype.includes () und der Exponentiationsoperator. Bevor Sie ES8 starten, schauen wir uns die Neuerungen von ES7 an.
ES7 Ăbersicht
Die Methode includes () bestimmt, ob das Array ein bestimmtes Element enthĂ€lt. AbhĂ€ngig davon wird true oder false zurĂŒckgegeben.
Array.prototype.includes(searchElement[, fromIndex = 0]) : Boolean
searchElement - Das zu durchsuchende Element.
fromIndex - Die Position im Array, von der aus die Suche nach dem searchElement-Element gestartet werden soll. Bei negativen Werten wird die Suche beginnend mit dem Index array.length + fromIndex aufsteigend ausgefĂŒhrt. Der Standardwert ist 0.
Beispiele [1, 2, 3].includes(2);
includes () kann auf andere Arten von Objekten angewendet werden (z. B. arrayĂ€hnliche Objekte). Beispiel: Verwenden der Methode includes () fĂŒr ein Argumentobjekt.
(function() { console.log([].includes.call(arguments, 'a'));
Der Potenzierungsoperator (**) gibt eine Potenz mit der Basis a und einem natĂŒrlichen Exponenten b zurĂŒck. Erhöhen von a auf die Potenz von b.
a ** b
Beispiele 2 ** 3
1. Objekt.EintrÀge
Object.entries () gibt ein Array zurĂŒck, dessen Elemente Arrays sind, die der aufgezĂ€hlten Eigenschaft des direkt im Objekt gefundenen Paars [key, value] entsprechen. Die Reihenfolge der Eigenschaften ist dieselbe wie beim manuellen Durchlaufen der Eigenschaften eines Objekts.
Object.entries(obj) : Array
obj - Ein Objekt, dessen aufgezĂ€hlte Eigenschaften als Array [SchlĂŒssel, Wert] zurĂŒckgegeben werden.
Object.entries () gibt die Eigenschaften in derselben Reihenfolge zurĂŒck wie in der for ... in-Schleife (der Unterschied besteht darin, dass for-in auch Eigenschaften aus der Prototypkette auflistet). Die Reihenfolge der Elemente im Array, die Object.entries () zurĂŒckgibt, ist unabhĂ€ngig von der Deklaration des Objekts. Wenn eine bestimmte Reihenfolge erforderlich ist, muss das Array sortiert werden, bevor die Methode aufgerufen wird.
Beispiele var obj = { foo: "bar", baz: 42 }; console.log(Object.entries(obj));
Objekt in Karte konvertierenDer neue Map () -Konstruktor akzeptiert die Wiederholung von Werten. Mit Object.entries können Sie Object auf einfache Weise in Map konvertieren. Dies ist prĂ€gnanter als die Verwendung eines Arrays mit 2 Elementen, aber SchlĂŒssel können nur Zeichenfolgen sein.
var obj = { foo: "bar", baz: 42 }; var map = new Map(Object.entries(obj)); console.log(map);
Warum ist der RĂŒckgabewert von Object.entries () ein Array und kein Iterator?
Der entsprechende Anwendungsfall ist in diesem Fall Object.keys () und nicht beispielsweise Map.prototype.entries ().
Warum gibt Object.entries () nur aufgezĂ€hlte native Eigenschaften mit ZeichenfolgenschlĂŒsseln zurĂŒck?
Auch dies geschieht, um mit Object.keys () ĂŒbereinzustimmen. Diese Methode ignoriert auch Eigenschaften, deren SchlĂŒssel Zeichen sind. Am Ende gibt es möglicherweise eine Reflect.ownEntries () -Methode, die alle ihre eigenen Eigenschaften zurĂŒckgibt.
Siehe object.entries in der offiziellen
Spezifikation sowie in den
MDN-Webdokumenten .
2. Objektwerte
Object.values ââ() gibt ein Array zurĂŒck, dessen Elemente die Werte der im Objekt gefundenen AufzĂ€hlungseigenschaften sind. Die Reihenfolge ist dieselbe, als wĂŒrden Sie das Objekt manuell durchlaufen.
Object.values(obj) : Array
obj - Ein Objekt, dessen Werte der aufgezĂ€hlten Eigenschaften zurĂŒckgegeben werden.
Die Object.values ââ() -Methode gibt ein Array von Werten der aufgezĂ€hlten Eigenschaften des Objekts in derselben Reihenfolge wie die for ... in-Schleife zurĂŒck. Der Unterschied zwischen einer Schleife und einer Methode besteht darin, dass die Schleife Eigenschaften von und von der Prototypkette auflistet.
Beispiele var obj = { foo: "bar", baz: 42 }; console.log(Object.values(obj));
Der Unterschied zwischen Object.entries und Object.values ââ() besteht darin, dass das erste ein Array von Arrays zurĂŒckgibt, das den Namen und den Wert der Eigenschaft enthĂ€lt, wĂ€hrend das zweite nur ein Array mit dem Wert der Eigenschaften zurĂŒckgibt.
Beispielunterschied zwischen Object.values ââ() und Object.entries () const object = { a: 'somestring', b: 42, c: false }; console.log(Object.values(object));
Siehe Object.values ââ() in der offiziellen
Spezifikation sowie in
MDN Web Docs .
3. String.prototype.padEnd
Die padEnd () -Methode vervollstÀndigt die aktuelle Zeile mit der angegebenen Zeichenfolge (wird möglicherweise wiederholt), sodass die resultierende Zeichenfolge die angegebene LÀnge erreicht. Die Addition wird am Ende (rechts) der aktuellen Zeile angewendet.
String.prototype.padEnd(maxLength [ , fillString ]) : String
maxLength - Die LĂ€nge der resultierenden Zeile, nachdem die aktuelle Zeile aufgefĂŒllt wurde. Wenn dieser Parameter kleiner als die LĂ€nge der aktuellen Zeile ist, wird die aktuelle Zeile so wie sie ist zurĂŒckgegeben.
fillString - Ein String, der die aktuelle Zeile mit ergĂ€nzt. Wenn diese Zeile zu lang ist, wird sie abgeschnitten und die am weitesten links stehende wird angewendet. "" (0x0020 SPACE) ist der Standardwert fĂŒr diesen Parameter.
Beispiele 'abc'.padEnd(10);
Zu den AnwendungsfĂ€llen fĂŒr das AuffĂŒllen von Zeichenfolgen gehören:
- HinzufĂŒgen eines ZĂ€hlers oder einer Kennung zu einem Dateinamen oder einer URL: 'file 001.txt'
- Konsolenausgangsausrichtung: âTest 001: ââ
- Drucken Sie hexadezimale oder binÀre Zahlen mit einer festen Anzahl von Ziffern: '0x00FF'
Siehe String.prototype.padEnd in der offiziellen
Spezifikation sowie in den
MDN-Webdokumenten .
4. String.prototype.padStart
Die padStart () -Methode fĂŒllt die aktuelle Zeile mit einer anderen Zeile (ggf. mehrmals), sodass die resultierende Zeile die angegebene LĂ€nge erreicht. Das BefĂŒllen erfolgt am Anfang (links) der aktuellen Zeile.
String.prototype.padStart(maxLength [, fillString]) : String
maxLength - Die LĂ€nge der Zusammenfassungszeile nach Abschluss der aktuellen Zeile. Wenn der Wert kleiner als die LĂ€nge der aktuellen Zeile ist, wird die aktuelle Zeile unverĂ€ndert zurĂŒckgegeben.
fillString - Ein String zum FĂŒllen der aktuellen Zeile. Wenn diese Zeichenfolge fĂŒr die angegebene LĂ€nge zu lang ist, wird sie abgeschnitten. Der Standardwert ist "" (0x0020 SPACE).
Beispiele 'abc'.padStart(10);
Warum heiĂen die AuffĂŒllmethoden padLeft und padRight nicht?
Bei bidirektionalen Sprachen oder Sprachen von rechts nach links funktionieren die Begriffe "links" und "rechts" nicht. Daher folgt die Benennung von padStart und padEnd vorhandenen Namen, die mit startsWith und endsWith beginnen.
Siehe String.prototype.padStart in der offiziellen
Spezifikation sowie in den
MDN-Webdokumenten .
5. Object.getOwnPropertyDescriptor
Die Object.getOwnPropertyDescriptor () -Methode gibt einen Eigenschaftsdeskriptor fĂŒr die eigene Eigenschaft (dh eine Eigenschaft, die sich direkt im Objekt befindet und nicht ĂŒber die Prototypkette empfangen wird) des ĂŒbergebenen Objekts zurĂŒck. Wenn die Eigenschaft nicht vorhanden ist, wird undefiniert zurĂŒckgegeben.
Object.getOwnPropertyDescriptor(obj, prop) : Object
obj - Das Objekt, in dem die Eigenschaft gesucht wird.
prop - Der Name der Eigenschaft, deren Beschreibung zurĂŒckgegeben wird.
Mit dieser Methode können Sie die genaue Beschreibung der Eigenschaft anzeigen. Eine Eigenschaft in JavaScript besteht aus einem Zeichenfolgennamen und einem Eigenschaftsdeskriptor.
Ein Eigenschaftsdeskriptor ist ein Datensatz mit einigen der folgenden Attribute:
- value - Der mit der Eigenschaft verknĂŒpfte Wert (nur im Datendeskriptor).
- writable - true, wenn der mit der Eigenschaft verknĂŒpfte Wert geĂ€ndert werden kann, andernfalls false (nur im Datendeskriptor).
- get - Eine Funktion, die den Wert der Eigenschaft zurĂŒckgibt, oder undefiniert, wenn keine solche Funktion vorhanden ist (nur im Zugriffsdeskriptor).
- set - Eine Funktion, die den Wert einer Eigenschaft Àndert oder undefiniert ist, wenn keine solche Funktion vorhanden ist (nur im Zugriffsdeskriptor).
- konfigurierbar - true, wenn der Handle-Typ dieser Eigenschaft geÀndert werden kann und wenn die Eigenschaft aus dem Objekt entfernt werden kann, das sie enthÀlt, andernfalls false.
- enumerable - true, wenn diese Eigenschaft verfĂŒgbar ist, wenn die Eigenschaften des Objekts aufgelistet werden, das sie enthĂ€lt, andernfalls false.
Beispiele obj = { get foo() { return 10; } }; console.log(Object.getOwnPropertyDescriptor(obj, 'foo'));
AnwendungsfĂ€lle fĂŒr Object.getOwnPropertyDescriptor ()
Erster Anwendungsfall: Kopieren von Eigenschaften in ein Objekt
Ab ES6 verfĂŒgt JavaScript bereits ĂŒber eine Werkzeugmethode zum Kopieren von Eigenschaften: Object.assign (). Diese Methode verwendet jedoch einfache Abruf- und Festlegungsoperationen, um eine Eigenschaft zu kopieren, deren SchlĂŒssel der SchlĂŒssel ist:
const value = source[key];
Dies bedeutet, dass Eigenschaften mit anderen als den standardmĂ€Ăig festgelegten Attributen (Methoden zum Abrufen, Festlegen, Schreiben usw.) nicht korrekt kopiert werden. Das folgende Beispiel veranschaulicht diese EinschrĂ€nkung. Die Quelle des Objekts hat ein Installationsprogramm, dessen SchlĂŒssel foo lautet:
const source = { set foo(value) { console.log(value); } }; console.log(Object.getOwnPropertyDescriptor(source, 'foo'));
Das Kopieren der foo-Eigenschaft in das Zielobjekt mit Object.assign () schlÀgt fehl:
const target1 = {}; Object.assign(target1, source); console.log(Object.getOwnPropertyDescriptor(target1, 'foo'));
GlĂŒcklicherweise funktioniert die Verwendung von Object.getOwnPropertyDescriptors () zusammen mit Object.defineProperties ():
const target2 = {}; Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source)); console.log(Object.getOwnPropertyDescriptor(target2, 'foo'));
Zweiter Anwendungsfall: Klonen von Objekten
Das flache Klonen Àhnelt dem Kopieren von Eigenschaften, daher ist Object.getOwnPropertyDescriptors () auch hier eine gute Wahl.
Dieses Mal verwenden wir Object.create (), das zwei Parameter hat:
Der erste Parameter gibt den Prototyp des zurĂŒckgegebenen Objekts an.
Ein optionaler zweiter Parameter ist eine Sammlung von Eigenschaftsbeschreibungen, die den von Object.getOwnPropertyDescriptors () zurĂŒckgegebenen Ă€hnlich sind.
const clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
Dritter Anwendungsfall: plattformĂŒbergreifende Objektliterale mit beliebigen Prototypen.
Die syntaktisch beste Möglichkeit, ein Objektliteral zum Erstellen eines Objekts mit einem beliebigen Prototyp zu verwenden, ist die Verwendung der speziellen Eigenschaft __proto__:
const obj = { __proto__: prot, foo: 123, };
Leider ist diese Funktion nur in Browsern verfĂŒgbar. Die allgemeine Problemumgehung lautet Object.create () und die Zuweisung:
const obj = Object.create(prot); obj.foo = 123;
Sie können aber auch Object.getOwnPropertyDescriptors () verwenden:
const obj = Object.create( prot, Object.getOwnPropertyDescriptors({ foo: 123, }) );
Eine andere Alternative ist Object.assign ():
const obj = Object.assign( Object.create(prot), { foo: 123, } );
Fallstricke: Kopiermethoden mit super.
Die Methode, die Super verwendet, ist eng an sein Ausgangsobjekt (das Objekt, in dem es gespeichert ist) gebunden. Derzeit gibt es keine Möglichkeit, eine solche Methode auf ein anderes Objekt zu kopieren oder zu verschieben.
Siehe Object.getOwnPropertyDescriptor in der offiziellen
Spezifikation sowie in
MDN-Webdokumenten .
6. Nachgestellte Kommas
HĂ€ngende Kommas (nachstehende Kommas) - können hilfreich sein, wenn Sie dem JavaScript-Code neue Elemente, Parameter oder Eigenschaften hinzufĂŒgen. Wenn Sie eine neue Eigenschaft hinzufĂŒgen möchten, fĂŒgen Sie einfach eine neue Zeile hinzu, ohne die vorherige zu Ă€ndern, sofern das Komma bereits verwendet wird. Dadurch werden die Unterschiede in der Versionskontrolle klarer und CodeĂ€nderungen können weniger problematisch sein.
AnfĂŒhrungszeichen in Literalen
ArraysJavaScript ignoriert Kommas in Arrays:
var arr = [ 0, 1, 2, ]; console.log(arr);
Wenn mehr als ein Baumelpunkt verwendet wird, werden Löcher erzeugt. Ein Array mit "Löchern" wird als dĂŒnn bezeichnet (ein dichtes Array hat keine "Löcher"). Wenn Sie ein Array beispielsweise mit Array.prototype.forEach () oder Array.prototype.map () iterieren, werden Löcher ĂŒbersprungen.
Die Objekte var object = { foo: "bar", baz: "qwerty", age: 42, }; console.log(object);
Kommas in Funktionen
ParameterdefinitionDie folgenden Definitionen der Funktionsparameter sind gĂŒltig und einander Ă€quivalent. Baumelnde Kommas wirken sich nicht auf die Eigenschaft length einer Funktion oder deren Argumente aus.
function f(p) {} function f(p,) {} (p) => {}; (p,) => {};
MethodendefinitionDas Komma funktioniert auch beim Definieren von Methoden fĂŒr Klassen oder Objekte.
class C { one(a,) {}, two(a, b,) {}, } var obj = { one(a,) {}, two(a, b,) {}, };
FunktionsaufrufDie folgenden Funktionsaufrufe sind gĂŒltig und einander gleichwertig.
f(p); f(p,); Math.max(10, 20); Math.max(10, 20,);
UngĂŒltige KommasDas Definieren von Funktionsparametern oder das Aufrufen einer Funktion, die nur ein Komma enthĂ€lt, löst einen SyntaxError aus. AuĂerdem sind bei Verwendung der ĂŒbrigen Parameter HĂ€ngekommas nicht zulĂ€ssig.
function f(,) {}
HĂ€ngende Kommas bei der Destrukturierung
HÀngende Kommas können bei destruktiver Zuordnung auch links verwendet werden.
Mit den verbleibenden Parametern wird erneut ein SyntaxError ausgelöst.
var [a, ...b,] = [1, 2, 3];
JSON Dangling Commas
HÀngende Kommas in einem Objekt sind nur in ECMAScript 5 zulÀssig. Da JSON auf einer Àlteren JavaScript-Syntax als ES5 basiert, sind
hÀngende Kommas in JSON nicht zulÀssig
.Beide Zeilen werfen einen SyntaxError
JSON.parse('[1, 2, 3, 4, ]'); JSON.parse('{"foo" : 1, }');
Warum sind Kommas nĂŒtzlich?
Es gibt zwei Vorteile.
Erstens ist das Neuanordnen von Elementen einfacher, da Sie keine Kommas hinzufĂŒgen oder entfernen mĂŒssen, wenn das letzte Element seine Position Ă€ndert.
Zweitens können Versionskontrollsysteme nachverfolgen, was sich wirklich geÀndert hat. Zum Beispiel von:
[ 'Foo' ] : [ 'Foo', '' ]
bewirkt, dass sowohl die Zeile mit 'foo' als auch die Zeile mit 'bar' als geĂ€ndert markiert werden, obwohl die einzige echte Ănderung darin besteht, die letzte Zeile hinzuzufĂŒgen.
Siehe Nachgestellte Kommas in
MDN-Webdokumenten .
7. SharedArrayBuffer
Das SharedArrayBuffer-Objekt wird zum Erstellen eines geteilten Puffers mit fester LÀnge zum Speichern primitiver BinÀrdaten verwendet, Àhnlich dem ArrayBuffer-Objekt. Im Gegensatz dazu können SharedArrayBuffer-Instanzen zum Erstellen einer Ansicht im gemeinsam genutzten Speicher verwendet werden. SharedArrayBuffer kann nicht getrennt werden.
new SharedArrayBuffer(length) : Object
length - Die GröĂe in Byte, um das Pufferarray zu erstellen.
return - Ein neues SharedArrayBuffer-Objekt der angegebenen LĂ€nge. Sein Inhalt nach der Initialisierung ist 0.
PostMessage und strukturiertes Klonen werden verwendet, um den Speicher mithilfe eines SharedArrayBuffer-Objekts zwischen einem Agenten im Cluster und einem anderen aufzuteilen (der Agent kann entweder das Hauptprogramm der Webseite oder einer der Web-Worker sein).
Der strukturierte Klonalgorithmus akzeptiert SharedArrayBuffers und TypedArrays, die SharedArrayBuffers zugeordnet sind. In beiden FĂ€llen wird das SharedArrayBuffer-Objekt an den EmpfĂ€nger ĂŒbergeben, wodurch ein neues privates SharedArrayBuffer-Objekt im empfangenden Agenten erstellt wird (wie bei ArrayBuffer). Der gemeinsam genutzte Datenblock, auf den von beiden SharedArrayBuffer-Objekten verwiesen wird, ist jedoch derselbe Datenblock, und Effekte von Drittanbietern im Block in einem der Agenten werden möglicherweise im anderen Agenten sichtbar.
var sab = new SharedArrayBuffer(1024); worker.postMessage(sab);
Shared Memory kann gleichzeitig in Workern oder im Haupt-Thread erstellt und geĂ€ndert werden. Je nach System (CPU, Betriebssystem, Browser) kann es einige Zeit dauern, bis die Ănderungen in alle Kontexte ĂŒbertragen werden. Zur Synchronisation werden atomare Operationen benötigt.
Shared Array Buffers ist ein primitiver Baustein fĂŒr ParallelitĂ€tsabstraktionen höherer Ebenen. Mit ihnen können Sie die Bytes eines SharedArrayBuffer-Objekts fĂŒr mehrere Worker und den Hauptthread freigeben (der Puffer wird fĂŒr den Zugriff auf Bytes freigegeben und in ein typisiertes Array eingeschlossen). Diese Art des Austauschs hat zwei Vorteile:
Sie können Daten zwischen Mitarbeitern schneller austauschen.
Die Koordination zwischen Arbeitnehmern wird einfacher und schneller (im Vergleich zu postMessage ()).
Die Implementierung des Arbeiters ist wie folgt.
Zuerst extrahieren wir den Puffer des gemeinsam genutzten Arrays, das an uns gesendet wurde, und verpacken ihn dann in ein typisiertes Array, damit wir ihn lokal verwenden können.
Eigenschaften und Methoden von SharedArrayBuffer.SharedArrayBuffer.length - Die LĂ€nge des SharedArrayBuffer-Konstruktors, dessen Wert 1 ist.
SharedArrayBuffer.prototype - Ermöglicht zusĂ€tzliche Eigenschaften fĂŒr alle SharedArrayBuffer-Objekte.
SharedArrayBuffer-InstanzenDie EigenschaftenSharedArrayBuffer.prototype.constructor - Definiert eine Funktion, die einen Prototyp eines Objekts erstellt. Der Anfangswert ist der standardmĂ€Ăige integrierte SharedArrayBuffer-Konstruktor.
SharedArrayBuffer.prototype.byteLength (schreibgeschĂŒtzt) - Die GröĂe des Arrays in Byte. Dies wird festgelegt, wenn das Array erstellt wird und kann nicht geĂ€ndert werden.
MethodenSharedArrayBuffer.prototype.slice () - Gibt einen neuen SharedArrayBuffer zurĂŒck, dessen Inhalt eine Kopie der Bytes dieses SharedArrayBuffer vom Anfang bis zum Ende des Exklusivs ist. Wenn der Anfang oder das Ende negativ ist, bezieht sich dies auf den Index vom Ende des Arrays, nicht vom Anfang. Diese Methode hat den gleichen Algorithmus wie Array.prototype.slice ().
sab.slice([begin, end]) : Object
begin - Der Nullindex, bei dem die Extraktion beginnt. Sie können einen negativen Index verwenden, der den Versatz vom Ende der Sequenz angibt. slice (-2) extrahiert die letzten beiden Elemente einer Sequenz. Wenn der Anfang nicht definiert ist, beginnt das Slice bei Index 0.
Ende - Der auf Null basierende Index, auf den extrahiert werden soll.
Zum Beispiel ruft slice (1,4) das zweite Element ĂŒber das vierte Element ab (Elemente mit den Indizes 1, 2 und 3). Sie können einen negativen Index verwenden, der den Versatz vom Ende der Sequenz angibt. slice (2, -1) ruft das dritte Element ĂŒber das vorletzte Element in der Sequenz ab. Wenn end weggelassen wird, ruft slice das Ende der Sequenz ab (sab.byteLength).
Beispiele var sab = new SharedArrayBuffer(1024); sab.slice();
Siehe SharedArrayBuffer in der offiziellen
Spezifikation sowie in den
MDN-Webdokumenten .
8. Atomics
Das Atomics-Objekt stellt atomare Operationen als statische Methoden zur VerfĂŒgung. Wird mit einem SharedArrayBuffer-Objekt verwendet.
Atomic-Operationen werden im Atomics-Modul installiert. Im Gegensatz zu anderen globalen Objekten ist Atomics kein Konstruktor. Es kann nicht mit dem neuen Operator oder zum Aufrufen eines Atomics-Objekts als Funktion verwendet werden. Alle Atomics-Eigenschaften und -Methoden sind statisch (z. B. ein Math-Objekt).
Wenn der Speicher gemeinsam genutzt wird, können mehrere Threads dieselben Daten lesen und in den Speicher schreiben. Atomare Operationen garantieren, dass die erwarteten Werte geschrieben und gelesen und die Operationen abgeschlossen werden, bevor die nÀchste Operation ihre Arbeit aufnimmt, und dass sie nicht unterbrochen werden.
Die Eigenschaften
Atomics [Symbol.toStringTag] - Der Wert dieser Eigenschaft ist Atomics.
Methoden
Atomare Operationen- Atomics.add () - FĂŒgt den angezeigten Wert an der angegebenen Position im Array zum aktuellen Wert hinzu. Gibt den vorherigen Wert an dieser Position zurĂŒck.
- Atomics.and () - Berechnet ein bitweises AND an der angegebenen Array-Position. Gibt den vorherigen Wert an dieser Position zurĂŒck.
- Atomics.compareExchange () - Speichert den angezeigten Wert an der angegebenen Position des Arrays, sofern er dem angezeigten Wert entspricht. Gibt den vorherigen Wert zurĂŒck.
- Atomics.exchange() â . .
- Atomics.load() â .
- Atomics.or() â OR . .
- Atomics.store() â . .
- Atomics.sub() â . .
- Atomics.xor() â XOR . .
Atomics.add() . , , .
Atomics.add(typedArray, index, value) : mixed
- typedArray â . Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array Uint32Array.
- index â typedArray value.
- value â .
- return â (typedArray[index]).
- TypeError, typedArray .
- TypeError, typedArray .
- RangeError, index typedArray.
var sab = new SharedArrayBuffer(1024); var ta = new Uint8Array(sab); Atomics.add(ta, 0, 12);
Atomics.add()
,
MDN Web Docs .
Wait notify
wait() wake() futexes («fast user-space mutex» â mutex ) Linux , true, .
Atomics.wait()
, -. «ok», «not-equal» «timed-out». , ( wait() ).
- Atomics.wait() â , -. «ok», «not-equal» «timed-out». , ( wait() ).
- Atomics.wake() â , . , .
- Atomics.isLockFree(size) â , . true, ( ). .
workers. , .
, , :
while (sharedArray [0] === 123);
sharedArray [0] ( sharedArray â , - ). :
const tmp = sharedArray [0]; while (tmp === 123);
, .
â :
, . , , :
workers, .
Atomics, .
:
.Atomics workers. , :
Atomics.load (TypedArray <T>, index) : T Atomics.store (TypedArray <T>, index, value: T) : T
, , Atomics (, ) , . , , Atomics.
, , Atomics ( sharedArray):
:
.
while , Atomics , : Atomics.wait (Int32Array, index, value, timeout) Atomics.wake (Int32Array, index, count).
:
atomic operationsAtomics , . Zum Beispiel:
Atomics.add (TypedArray <T>, index, value) : T
, : index += value;
c .
â (): â , .
«Tear-Free Reads» , , :
- , Typed Arrays ( DataViews).
- : sharedArray.byteOffset% sharedArray.BYTES_PER_ELEMENT === 0
- .
, , :
, Atomics .
Shared Array Buffers
Shared Array Buffers JavaScript « ». JavaScript « »: , . , , , .
Shared Array Buffers (RTC): , , . , RTC: Shared Array Buffers, .
, RTC. await.
Shared Array Buffers emscripten pthreads asm.js. emscripten:
[En] [Shared Array Buffers allow] Emscripten applications to share the main memory heap between web workers. This along with primitives for low level atomics and futex support enables Emscripten to implement support for the Pthreads (POSIX threads) API.
[Ru] [Shared Array Buffers ] Emscripten -. futex Emscripten API Pthreads ( POSIX).
C C ++ asm.js.
, WebAssembly. , web workers , , WebAssembly . , WebAssembly.
,
( 32 ). , â . , , :
- TextEncoder TextDecoder: Uint8Array, .
- stringview.js: , . .
- FlatJS: JavaScript (, ) (ArrayBuffer SharedArrayBuffer). JavaScript + FlatJS JavaScript. JavaScript (TypeScript . .) .
- TurboScript: JavaScript- . asm.js WebAssembly.
, , â â . , .
, Shared Array?. ( "
A Taste of JavaScript's New Parallel Primitives â», , web workers. 4 web workers , , , , 6,9 (1 web worker) 25,4 (4 web workers). web workers , .
, , .
Shared Array Buffers :
JavaScript, :
Atomics Object
,
MDN Web Docs .
9. Async functions
Async function AsyncFunction constructor
AsyncFunction async function. JavaScript AsyncFunction.
, AsyncFunction . , .
Object.getPrototypeOf(async function(){}).constructor
new AsyncFunction([arg1[, arg2[, ...argN]],] functionBody)
arg1, arg2,⊠argN â , . , JavaScript , ; , «x», «theValue», «a,b».
functionBody â , JavaScript.
async function, AsyncFunction constructor , . , async function expression , .
, , , .
AsyncFunction constructor ( new) , .
async functions AsyncFunction constructor, ; . , , AsyncFunction constructor. eval async function.
async function AsyncFunction constructor
function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor var a = new AsyncFunction('a', 'b', 'return await resolveAfter2Seconds(a) + await resolveAfter2Seconds(b);'); a(10, 20).then(v => { console.log(v);
async function
async function , AsyncFunction. async-, async function.
async function name([param[, param[, ... param]]]) {
name â .
param â , .
statements â , .
async Promise. , Promise , . async , Promise (throws) .
async await, async Promise, async .
await . SyntaxError.
async/await promises Promises. Promises callback-, async/await promises.
Beispiel function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function add1(x) { const a = await resolveAfter2Seconds(20); const b = await resolveAfter2Seconds(30); return x + a + b; } add1(10).then(v => { console.log(v);
?
JS- .js , . , . .
, JS â , . , , , , . , . (You-Dont-Know-JS/async & performance, Jake Archibald).
? console.log() , .
«» , :
ajax( "http://some.url.1", function myCallbackFunction(data){ console.log( data );
.
3 getUser, getPosts, getComments.
const { getUser, getPosts, getComments } = require('./db'); getUser(1, (error, user) => { if(error) return console.error(error); getPosts(user.id, (error, posts) => { if(error) return console.error(error); getComments(posts[0].id, (error, comment) => { if(error) return console.error(error); console.log(comments); }); }); });
, .
Callback Hell . , () , .
Promise (
, . . .
getUser(1) .then(user => getPosts(user,id)) .then(posts => getComments(posts[0].id)) .then(comments => console.log(comments)) .catch(error => console.error(error));
Promise Generators (
. , Promise, â , . try...catch. â Promise , . ,
co . .
co(function* () { try { let user = yield getUser(1); let posts = yield getPosts(user.id); let comments = yield getComments(posts[0].id); console.log(comments); } catch (error) { console.log(error); } }); function co(generator) { const iterator = generator(); return new Promise((resolve, reject) => { function run(prev) { const { value, done } = iterator.next(prev); if (done) resolve(value); else if (value instanceof Promise) value.then(run, reject); else run(value); } run(); }); }
.
(Calback functions) â , .
(Promises) â , .
(Generators) â , , .
(Promises) (Generators), , .
, , :
function getUser(id) { return { id: 1 }; } let user = getUser(1); console.log(user);
( async), Promise id.
async function getUser(id) { return { id: 1 }; } let user = getUser(1); console.log(user);
, , Promis ( Promis ). , .
then().
async function getUser(id) { return { id: 1 }; } getUser(1) .then(user => console.log(user));
await .
( HTTP .
fetch(`https://jsonplaceholder.typicode.com/users/1`) .then(data => data.json()) .then(data => console.log(data));
Promise.
, .
async function sendRequest() { let response= await fetch(`https://jsonplaceholder.typicode.com/users/1`); return response.json(); } async function main() { var a = await sendRequest(); console.log(a); } main();
async . main(). then(), .
async function sendRequest() { let response= await fetch(`https://jsonplaceholder.typicode.com/users/1`); return response.json(); } sendRequest() .then((data) => console.log(data));
fetch(). await, : fetch() response. : fetch() .
Promise async function
await , .
try...catch.
async function sendRequest() { let response = await fetch(`https://jsonplaceholder.typicode.com/users/1`); try { throw new Error("Unexpected error"); return response.json(); } catch(error) { console.log(error);
âŠ
Async Function Definitions
,
MDN Web Docs .