Welcome to Our Website

mijn twaalf favoriete ES6/ES2015 functies

standaardparameters in ES6

wanneer we modules schrijven, moeten we rekening houden met gevallen waarin de argumenten zullen worden weggelaten. Met andere woorden, goede modules moeten slim genoeg zijn om standaardwaarden voor parameters te hebben. In ES5 zou je zoiets schrijven als de onderstaande code, die gebruik maakt van de logische OR (||):

deze statements werken goed, behalve voor de edge cases. Bijvoorbeeld, als de waarde 0 is — en omdat 0 falsy is in JavaScript-de voorwaarde standaard de hard-gecodeerde waarde in plaats van de waarde zelf, zoals je zou willen in sommige gevallen., Natuurlijk, wie heeft 0 nodig als waarde (#sarcasmfont), dus we negeerden deze fout en gebruikten de logica of toch…

of misschien event een if/else voorwaarde om te controleren op de ongedefinieerde waarde:

var getAccounts = function(limit) {
if (typeof limit == 'undefined') limit = 10
...
}

niet meer! In ES6, kunnen we de standaard waarden recht zetten in de handtekening van de functies als volgt:

var getAccounts = function(limit = 10) {
...
}
var link = function(height = 50, color = 'red', url = 'http://capitalone.io') {
...
}

Dit is niet alleen gebruikt minder regels code, maar heeft ook een verhoogde leesbaarheid. Trouwens, deze syntaxis is vergelijkbaar met Ruby en Python!,

Rest – en Spreadparameters in ES6

Als u ooit een JavaScript-functie met een variabele of zelfs een onbeperkt aantal argumenten hebt gebruikt of geschreven, kent u het argument-object. Dit object bevat alle parameters die aan de functie worden doorgegeven. Het probleem is dat dit object argumenten geen echte array is. Je moet het converteren naar een array als je functies als sort of map expliciet wilt gebruiken. Bijvoorbeeld, deze request functie converteert argumenten met behulp van call ():

dus is er een betere manier in ES6 om toegang te krijgen tot een onbepaald aantal argumenten als een array? Ja!, Het is rust parameters syntaxis en het is gedefinieerd met ellipsen…. Dit is bijvoorbeeld de ES6 functiehandtekening met de rest parameter callbacks die een array worden met de rest van de parameters:

function(url, options, ...callbacks) {
var callback1 = callbacks
var callback2 = callbacks
// ...
}

opmerking: in de rest array is de eerste parameter degene die geen naam heeft, bijvoorbeeld, de callback is op index 0, niet 2 zoals in de argumenten van ES5. Ook, het plaatsen van andere genoemde argumenten na de rest parameter zal een syntaxis fout veroorzaken. De rest parameter is een geweldige suikercoating toevoeging aan JavaScript, omdat het vervangt de argumenten object, dat was niet een echte array.,

in ES5, als u een array als argument voor een functie wilt gebruiken, moet u de functie apply() gebruiken:

function request(url, options, callback) { 
// ...
}
var requestArgs =
request.apply(null, requestArgs)

in ES6 kunnen we nu de spreadparameters gebruiken die vergelijkbaar zijn met de restparameters in de syntaxis omdat ze ellipsen gebruiken…:

function request(url, options, callback) { 
// ...
}
var requestArgs =
request(...requestArgs)

ES6 ontwikkelaars kunnen de spread operator In de volgende gevallen:

De spread operator heeft een soortgelijke syntaxis als de rest parameters, maar rest wordt gebruikt in de functiedefinitie/declaratie en spread wordt gebruikt in de calls en literals., Ze besparen ontwikkelaars van het typen van extra regels van imperatieve code, dus het kennen en gebruiken ervan is een goede vaardigheid.

Template literals in ES6

Template literals (of interpolatie zoals ze in andere talen bekend zijn) zijn een manier om variabelen uit te voeren in de string gemengd met wat tekst, meestal in gebruikersinterfaces. In ES5 moesten we de snaar zo breken.,

var name = 'Your name is ' + first + ' ' + last + '.'
var url = 'http://localhost:3000/api/messages/' + id

gelukkig kunnen we in ES6 een nieuwe syntaxis gebruiken ${NAME} in de back-ticked string:

var name = `Your name is ${first} ${last}.`
var url = `http://localhost:3000/api/messages/${id}`

Dit is netjes en stelt ontwikkelaars in staat om het eindresultaat van de strings in één oogopslag te zien in plaats van te proberen de concatenatie-expressie te evalueren.

ES6 string templates zijn goed, maar de syntaxis zal conflicten veroorzaken in de Markdown documentatie als u string templates en inline code markup gebruikt, (omdat in Markdown inline code ook wordt gemarkeerd door back-teken)., Trouwens, CoffeeScript heeft wat ik denk een betere oplossing als het dubbel afgeschreven strings interpoleert (vergelijkbaar met Ruby):

var name = "Your name is #{first} #{last}."
var url = "http://localhost:3000/api/messages/#{id}"

interpolatie is goed, maar hoe werk je met tekst met meerdere regels in JavaScript?

multi-line Strings in ES6

een andere yummy syntactic sugarcoating is multi-line string. In ES5 moesten we een van deze benaderingen gebruiken en het was lelijk., Bij aaneenschakeling:

of met escape slash:

var fourAgreements = 'You have the right to be you.\n\
You can only be you when you do your best.'

gebruik in ES6 gewoon de backticks als volgt:

var roadPoem = `Then took the other, as just as fair,
And having perhaps the better claim
Because it was grassy and wanted wear,
Though as for that the passing there
Had worn them really about the same,`
var fourAgreements = `You have the right to be you.
You can only be you when you do your best.`

multi-line strings zijn een nuttige toevoeging Als u veel tekst in uw JavaScript-code moet gebruiken.,

Destructuring Opdracht in ES6

Destructuring kan een harder concept om te begrijpen, dan multi-line strings, want er is iets bijzonders gaande is achter de scène… Laten we zeggen dat u hebt eenvoudige opdrachten waar de sleutel userId en rekeningnummer zijn variabelen gebruikers-id en het rekeningnummer:

var data = $('body').data(), // data has properties 
userId and accountNumber userId = data.userId, accountNumber = data.accountNumber

Andere voorbeelden van opdrachten waar de namen van de variabelen en object-eigenschappen zijn dezelfde:

In de ES6, kunnen we vervangen door de ES5 bovenstaande code, met deze instructies:

var { userId, accountNumber} = $('body').data() 
var {json} = require('body-parser')
var {username, password} = req.body

Dit werkt ook met de arrays. Gek!,

var = $('.column'),
= file.split('\n')

Het kan even duren om te wennen aan de syntaxis van de destructuring-opdracht, maar het is toch een zoete coating.

Enhanced Object Literals in ES6

wat u kunt doen met object literals in ES6 is verbluffend! We gingen van een verheerlijkte versie van JSON in ES5 naar iets dat sterk lijkt op klassen in ES6.

bij de ontwikkeling van ondernemingen is modularisatie van code belangrijk omdat projecten groter zijn en een groter aantal bewegende delen hebben. Met verbeterde object literals, kunt u echt sterke objecten geladen met functionaliteit te creëren.,

Hier is een typische ES5 object letterlijk met een aantal methoden en attributen/eigenschappen:

als we mooi willen zijn, kunnen we erven van serviceBase door er het prototype van te maken met het Object.maak methode:

ik weet het, accountServiceES5ObjectCreate en accountServiceES5 zijn NIET volledig identiek zijn, omdat een object (accountServiceES5) hebben de eigenschappen in de __proto__ object, zoals weergegeven in de afbeelding hieronder:

Maar omwille van dit voorbeeld, ik geef hen gelijk., In ES6 object literals kunnen we Steno ‘ s gebruiken voor toewijzing. Bijvoorbeeld, getAccounts: getAccounts, wordt gewoon getAccounts.

ook kunnen we super aanroepen en dynamische toetsen hebben. Bijvoorbeeld, toString () methode retourneert een JSON object als een string door super aan te roepen.valueOf (), en valueOf_1_2_3 is een dynamische eigenschapsnaam:

Dit is een grote verbetering voor goede oude object literals omdat ontwikkelaars meer logica kunnen inpakken en meer dingen kunnen doen dan met ES5 objecten!,

Pijlfuncties in ES6

Dit is waarschijnlijk de functie waar ik het meest op wachtte. Ik hield van CoffeeScript vanwege zijn dikke pijlen. Nu hebben we ze in ES6.

De fat pijlen zijn verbazingwekkend omdat ze ervoor zouden zorgen dat je dit goed zou gedragen, dat wil zeggen, Dit zal dezelfde waarde hebben als in de context van de functie — het zal niet muteren zoals gewoonlijk gebeurt elke keer dat je een afsluiting maakt. Dit gedrag was een van de ergste delen van JavaScript en vaak veroorzaakt veel verwarring met ontwikkelaars nieuw voor de taal., Met behulp van arrows functies in ES6 kunnen we stoppen met het gebruik van that = this of self = this of _this = this or .bind(dit).

bijvoorbeeld, deze code in ES5 is lelijk omdat je kunt vergeten om de context over te zetten naar de afsluiting met _this:

var _this = this
$('.btn').click(function(event){
_this.sendData()
})

de bind() of call() benaderingen zijn niet veel beter vanwege hun verbositeit. Maar kijk eens naar deze mooie ES6 code:

$('.btn').click((event) =>{
this.sendData()
})

helaas besloot de ES6 Commissie dat het lenen van skinny arrows van CoffeeScript te veel van een goede zaak was en liet ons in plaats daarvan een lange oude functie achter., (Skinny arrow in CoffeeScript werkt als reguliere functie in ES5 en ES6).

Hier is een ander voorbeeld waarin we de aanroep gebruiken om de context door te geven aan de logUpperCase() functie in ES5:

terwijl we in ES6 niet hoeven te rommelen met _this:

merk op dat je oude functie kunt mixen en matchen met => in ES6 zoals je wilt. En wanneer een pijl functie wordt gebruikt met een één lijn statement, wordt het een uitdrukking; dat wil zeggen,. het zal impliciet het resultaat van die ene verklaring teruggeven. Als je meer dan één regel hebt, moet je return expliciet gebruiken.,

deze ES5-code maakt een array aan van de messages array:

wordt dit in ES6:

var ids = 
var messages = ids.map(value => `ID is ${value}`) // implicit return

merk op dat ik de string templates heb gebruikt? Een andere functie van CoffeeScript… ik hou van hen!

de haakjes () zijn optioneel voor enkele params in een pijl functie handtekening. Echter, je hebt ze nodig bij het gebruik van meer dan één param. In ES5 heeft de code een functie met expliciete return:

nu is hier een meer welsprekende versie van de code in ES6 met haakjes rond params en impliciete return:

zijn fat pijlen niet geweldig? Gebruik ze.,

Beloften in ES6

Beloften zijn een controversieel ontwikkelingsthema geweest, vooral in grotere organisaties waar het moeilijker kan zijn om het eens te worden over een gemeenschappelijke aanpak. Een reden hiervoor is het aantal promise-implementaties met iets andere syntaxes-Q, bluebird, deferated.js, gelofte, avow, en jquery uitgesteld om slechts een paar te noemen. Een andere reden is dat sommige software-ingenieurs zeggen, ” we hebben geen beloften nodig en kunnen gewoon gebruik maken van async, generatoren, callbacks, enz.”

gelukkig is er een kans dat de debatten zullen kalmeren met de standaard Promise implementatie toegevoegd aan ES6!,

een triviaal voorbeeld van een uitgestelde asynchrone uitvoering met setTimeout():

setTimeout(function(){ console.log('Yay!') }, 1000)

We kunnen deze code in ES6 herschrijven met Promise:

var wait1000 = new Promise(function(resolve, reject) {
setTimeout(resolve, 1000)
}).then(function() {
console.log('Yay!')
})

of met ES6 arrow functies:

var wait1000 = new Promise((resolve, reject)=> {
setTimeout(resolve, 1000)
}).then(()=> {
console.log('Yay!')
})

tot nu toe hebben we het aantal regels code verhoogd van drie naar vijf zonder duidelijk voordeel. Dat klopt, het lijkt contra-intuïtief. Het voordeel zal komen als we meer geneste logica in de setTimeout() callback hebben., Bijvoorbeeld, deze ES5 code heeft twee geneste callbacks:

setTimeout(function(){
console.log('Yay!')
setTimeout(function(){
console.log('Wheeyee!')
}, 1000)
}, 1000)

Het kan opnieuw worden geschreven met ES6 Beloften als zo:

zoals u kunt zien, veranderde de code organisatie toen we refactored callbacks-only code in code met Beloften.

een ander voordeel dat niet wordt behandeld in dit essay — Beloften hebben ook een fail-and-catch-all callback, wat een leuke functie is. Neem een kijkje op deze post voor meer informatie over promises: Inleiding tot ES6 Promises.

Block-Scoped constructies: Let en Const

u hebt misschien al de vreemd klinkende let in ES6-code gezien., Dit is niet alleen een suikercoating functie. Het is ingewikkelder en voegt meer logica toe aan uw variabele declaraties.

let is een nieuwe var die ontwikkelaars toestaat om de variabele naar de blokken te scrollen. We definiëren blokken door de krullende beugels. In ES5 deden de blokken niets met de VAR ‘ s zoals hier te zien is:

in de code hierboven zal het resultaat 1000 zijn. Wow! Dat is een heel slecht insect. In ES6 gebruiken we let om de scope te beperken tot de blokken. VAR ‘ s zijn dan functie scoped.

in deze code is de waarde 0 omdat het if-blok ook de let-declaratie heeft., Als het niets had (bedrag = 1), dan zou de uitdrukking 1 zijn geweest.

als het gaat om const, zijn dingen makkelijker; het voorkomt gewoon opnieuw toewijzen, en het is ook Block-scoped zoals let. Om aan te tonen, hier zijn meerdere constanten en de code werkt prima omdat de const statements tot verschillende blokken behoren:

naar mijn bescheiden mening, laten en const de taal overcompliceren. Zonder hen hadden we slechts één gedrag, nu zijn er meerdere scenario ‘ s te overwegen., ;- (Voor mensen die nieuw zijn in JavaScript, die afkomstig zijn uit talen als Java, const en let bieden een nieuwe laag van ingebouwde bescherming tegen sommige onvoorspelbaar gedrag.

klassen in ES6

als je van objectgeoriënteerd programmeren (OOP) houdt, dan zul je van deze functie houden. Het maakt het schrijven van klassen in ES6, en erven van hen, net zo gemakkelijk als het houden van een reactie op Facebook.

in ES5 was het aanmaken en gebruiken van klassen op zijn zachtst gezegd moeilijk. Er was geen trefwoord klasse (het was gereserveerd, maar deed niets)., Naast dat, veel erfenis patronen zoals pseudo klassiek, klassiek, functioneel toegevoegd aan de verwarring, gieten benzine op de vurige divisies tussen JavaScript-ontwikkelaars.

Ik zal je niet laten zien hoe je een klasse in ES5 schrijft, omdat er veel patronen zijn. Laten we eens een kijkje nemen op de ES6 voorbeeld meteen. Ik kan u vertellen dat de ES6 klasse prototypes zal gebruiken, niet de function factory aanpak. We hebben een classbaseModel waarin we een constructor en een getName() methode kunnen definiëren:

merk op dat ik standaard parameterwaarden voor opties en gegevens gebruik., Ook hoeven methodenamen niet meer de woordfunctie of de dubbele punt (:) te hebben. Het andere grote verschil is dat je geen eigenschappen kunt toewijzen this.NAME op dezelfde manier als methoden, dat wil zeggen, Je kunt Naam niet zeggen op hetzelfde inspringniveau als een methode. Om de waarde van een eigenschap in te stellen, kunt u eenvoudig een waarde in de constructor toewijzen.,

Het AccountModel zal erven van basismodel met class NAME breidt PARENT_NAME uit:

class AccountModel extends baseModel {
constructor(options, data) {

om de bovenliggende constructor aan te roepen, kunt u moeiteloos super() aanroepen met params:

super({private: true}, ) // Call the parent method with super
this.name = 'Account Model'
this.url +='/accounts/'
}

Als u echt fancy wilt zijn, kunt u ook een getter als deze instellen met accountsData als een eigenschap:

get accountsData() { // Calculated attribute getter
// ... make XHR
return this.data
}
}

dus na al dit werk, hoe gebruik je eigenlijk deze klasse Abracadabra? Het is net zo makkelijk als een driejarige laten geloven in de Kerstman., Gebruik nieuwe operand:

let accounts = new AccountModel(5)
accounts.getName()
console.log('Data is %s', accounts.accountsData)

in het geval u zich afvraagt, de uitvoer is:

Class name: Account Model
Data is %s 32113123123,524214691

natuurlijk bestonden er klassen in CoffeeScript en oudere JavaScript standaarden, dus ze zijn niet volledig nieuw. Echter, in ES6 is het gebruik van klassen gemakkelijker gemaakt, wat vooral belangrijk is voor enterprise-ontwikkelaars omdat ze meestal werken aan grotere projecten verspreid over meerdere teams (dus de code vereist modularisatie).

Modules in ES6

zoals u wellicht weet, was er geen native modules ondersteuning in JavaScript voor ES6., Mensen kwamen met AMD, RequireJS, CommonJS en andere oplossingen, maar ze waren gewoon dat — oplossing en hacks. Met ES6 zijn er nu ingebouwde modules met import en export operanden.

in ES5 gebruikt u <script> tags met IIFE, of een bibliotheek zoals AMD, terwijl u in ES6 uw Klasse kunt exposeren met export. Omdat ik een knooppunt ben.js guy dus Ik zal CommonJS gebruiken, dat is ook een knoop.js syntaxis, om dit probleem op te lossen. Het is vrij eenvoudig om CommonJS gebruiken op de browser met de browserify bundler., Laten we zeggen dat we poort variabele en getAccounts methode in ES5 module.js:

module.exports = {
port: 3000,
getAccounts: function() {
...
}
}

in ES5 main.js, zouden we vereisen (‘module’) dat afhankelijkheid:

var service = require('module.js')
console.log(service.port) // 3000

in ES6 zouden we exporteren en importeren. Dit is bijvoorbeeld onze bibliotheek in de ES6 module.js-bestand:

export var port = 3000
export function getAccounts(url) {
...
}

In het hoofdbestand van het importeerbestand ES6.js, we gebruiken import {name} uit’ mijn-module ‘ syntaxis., Bijvoorbeeld, we kunnen objecten/methoden poort importeren, en krijgen accounts van de module genaamd module:

import {port, getAccounts} from 'module'
console.log(port) // 3000

of we kunnen alles importeren als een variabele service in main.js:

import * as service from 'module'
console.log(service.port) // 3000

merk op dat native ondersteuning voor ES6-modules in browsers niet snel komt (vanaf dit schrijven tenminste), dus je hebt iets als jspm nodig om ES6-modules te gebruiken.

bekijk deze tekst voor meer informatie en voorbeelden over ES6-modules. En vergeet niet, – Maakt niet uit wat, schrijf modulaire JavaScript!,

voor … van begrip in ES6

Hier is een probleem met ES5: als we willen herhalen over objecten met behulp van zijn sleutels, moeten we die sleutels eerst extraheren met Object.toets(). Bijvoorbeeld:

een ander probleem met forEach is dat je de word-functie moet schrijven. Maar er is een betere verklaring in ES6! De for … van statement vervangt standaard voor en forEach, en is vergelijkbaar met for…in behalve dat dat for…in itereert over sleutels en voor … over waarden.,

met Behulp van de vorige codefragment gegevens (boeken), kunnen we iterate, met voor…in en de toetsen of met behulp van de…van:

for (let key in books){
console.log(books)
}

Uitgangen van de toetsen:

Pro Express.js
React Quickly
Full Stack JavaScript
Azat

Terwijl het voor…van werken met waarden:

for (let book of books){
console.log(book)
}

De uitvoer van voor…van:

Pro Express.js
React Quickly
Full Stack JavaScript

Merk op dat de output van de…van de negeert de waarde met de toets auteur als zou forEach op een array:

Mijn persoonlijke ervaring in het werken met comprehensions is dat ze verhogen de code leesbaarheid. Dit is van het grootste belang voor code-onderhoud in zakelijke toepassingen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *