标签:rpo assign uid source lte inter repr prototype case
Note: A commonly accepted practice is to use const
except in cases of loops and reassignment. However, in this resource I‘ll be using let
in place of var
for all ES6 examples.
x
obj
arr
func
a
, b
, c
str
Understanding Variables, Scope, and Hoisting in JavaScript
Keyword | Scope | Hoisting | Can Be Reassigned | Can Be Redeclared |
---|---|---|---|---|
var |
Function scope | Yes | Yes | Yes |
let |
Block scope | No | Yes | No |
const |
Block scope | No | No | No |
ES6 introduced the let
keyword, which allows for block-scoped variables which cannot be hoisted or redeclared.
ES6 introduced the const
keyword, which cannot be redeclared or reassigned, but is not immutable.
The arrow function expression syntax is a shorter way of creating a function expression. Arrow functions do not have their own this
, do not have prototypes, cannot be used for constructors, and should not be used as object methods.
# ES5 function func(a, b, c) {} // function declaration var func = function(a, b, c) {} // function expression #ES6 let func = a => {} // parentheses optional with one parameter let func = (a, b, c) => {} // parentheses required with multiple parameters
MDN Reference: Arrow functions
Expressions can be embedded in template literal strings.
# ES5 var str = ‘Release date: ‘ + date # ES6 let str = `Release Date: ${date}`
MDN Reference: Expression interpolation
Using template literal syntax, a JavaScript string can span multiple lines without the need for concatenation.
#ES5 var str = ‘This text ‘ + ‘is on ‘ + ‘multiple lines‘ # ES6 let str = `This text is on multiple lines`
Note: Whitespace is preserved in multi-line template literals. See Removing leading whitespace in ES6 template strings.
The return
keyword is implied and can be omitted if using arrow functions without a block body.
# ES5 function func(a, b, c) { return a + b + c } # ES6 let func = (a, b, c) => a + b + c // curly brackets must be omitted
ES6 introduces a shorter notation for assigning properties to variables of the same name.
# ES5 var obj = { a: a, b: b, } # ES6 let obj = { a, b, }
MDN Reference: Property definitions
The function
keyword can be omitted when assigning methods on an object.
# ES5 var obj = { a: function(c, d) {}, b: function(e, f) {}, } # ES6 let obj = { a(c, d) {}, b(e, f) {}, }
obj.a() // call method a
MDN Reference: Method definitions
Use curly brackets to assign properties of an object to their own variable.
var obj = { a: 1, b: 2, c: 3 } # ES5 var a = obj.a var b = obj.b var c = obj.c # ES6 let { a, b, c } = obj
MDN Reference: Object initializer
A more concise syntax has been introduced for iteration through arrays and other iterable objects.
var arr = [‘a‘, ‘b‘, ‘c‘] # ES5 for (var i = 0; i < arr.length; i++) { console.log(arr[i]) } # ES6 for (let i of arr) { console.log(i) }
Functions can be initialized with default parameters, which will be used only if an argument is not invoked through the function.
# ES5 var func = function(a, b) { b = b === undefined ? 2 : b return a + b } # ES6 let func = (a, b = 2) => { return a + b } func(10) // returns 12 func(10, 5) // returns 15
MDN Reference: Default paramters
Spread syntax can be used to expand an array.
# ES6 let arr1 = [1, 2, 3] let arr2 = [‘a‘, ‘b‘, ‘c‘] let arr3 = [...arr1, ...arr2] console.log(arr3) // [1, 2, 3, "a", "b", "c"]
Spread syntax can be used for function arguments.
# ES6 let arr1 = [1, 2, 3] let func = (a, b, c) => a + b + c console.log(func(...arr1)) // 6
ES6 introducess the class
syntax on top of the prototype-based constructor function.
# ES5 function Func(a, b) { this.a = a this.b = b } Func.prototype.getSum = function() { return this.a + this.b } var x = new Func(3, 4) # ES6 class Func { constructor(a, b) { this.a = a this.b = b } getSum() { return this.a + this.b } } let x = new Func(3, 4) x.getSum() // returns 7
The extends
keyword creates a subclass.
# ES5 function Inheritance(a, b, c) { Func.call(this, a, b) this.c = c } Inheritance.prototype = Object.create(Func.prototype) Inheritance.prototype.getProduct = function() { return this.a * this.b * this.c } var y = new Inheritance(3, 4, 5) # ES6 class Inheritance extends Func { constructor(a, b, c) { super(a, b) this.c = c } getProduct() { return this.a * this.b * this.c } } let y = new Inheritance(3, 4, 5) y.getProduct() // 60
MDN Reference: Subclassing with extends
Modules can be created to export and import code between files.
# index.html <script src="export.js"></script> <script type="module" src="import.js"></script> # export.js let func = a => a + a let obj = {} let x = 0 export { func, obj, x } # import.js import { func, obj, x } from ‘./export.js‘ console.log(func(3), obj, x)
Promises represent the completion of an asynchronous function. They can be used as an alternative to chaining functions.
# ES5 callback function doSecond() { console.log(‘Do second.‘) } function doFirst(callback) { setTimeout(function() { console.log(‘Do first.‘) callback() }, 500) } doFirst(doSecond) # ES6 Promise let doSecond = () => { console.log(‘Do second.‘) } let doFirst = new Promise((resolve, reject) => { setTimeout(() => { console.log(‘Do first.‘) resolve() }, 500) }) doFirst.then(doSecond)
An example below using XMLHttpRequest
, for demonstrative purposes only (Fetch API would be the proper modern API to use).
# ES5 callback function makeRequest(method, url, callback) { var request = new XMLHttpRequest() request.open(method, url) request.onload = function() { callback(null, request.response) } request.onerror = function() { callback(request.response) } request.send() } makeRequest(‘GET‘, ‘https://url.json‘, function(err, data) { if (err) { throw new Error(err) } else { console.log(data) } }) # ES6 Promise function makeRequest(method, url) { return new Promise((resolve, reject) => { let request = new XMLHttpRequest() request.open(method, url) request.onload = resolve request.onerror = reject request.send() }) } makeRequest(‘GET‘, ‘https://url.json‘) .then(event => { console.log(event.target.response) }) .catch(err => { throw new Error(err) })
If you found this useful, please share!
ES6 Syntax and Feature Overview(待续)
标签:rpo assign uid source lte inter repr prototype case
原文地址:https://www.cnblogs.com/panpanwelcome/p/11758034.html