Foreword ES6 Knowledge points study arrangement and record
directory
This chapter shares ES6 grammar core commonly used knowledge point development must be – the interview must;
- let , const
- Deconstruction assignment
- String, re, array, object, function extension + Symbol
- Set, Map Data structure,
- Proxy Proxy/intercept, Reflect
- The Generator function
- Async function
- Promise object
- Class class
- The module module,
For ES6 knowledge points to do a brief overview and practice, commonly used core knowledge points will be told a little bit more detailed, the other are slightly over, I am also struggling in the study of small white, hope you big guys a lot of advice.
ES6 adds the let, const command to declare variables. Its use is similar to var;
Let let declare a block-level variable 1, there is no variable promoted n = 10; let n ; // Let n = 1; // Let n = 1; Var m = 2} // n is not defined, m // 2 3, {let n = 1; let n; } // The console will report an error, not to allow repeated declarations
Const const declares a read-only constant. Once declared, the value of the constant cannot be changed; 1, const n = 10 cannot be modified after a constant declaration; n = 101; // If you declare an array or an object, you can write values, but you can’t assign values directly
const arr = [];
arr.push(1) / / [1]
arr[1] = 2 / / [1, 2]
arr = [1.2.3] // The console will report an error telling you that constants cannot be assigned
Copy the code
Deconstruction assignment
ES6 allows fetching values from arrays and objects and assigning values to variables in a pattern known as Destructuring.
To put it crudely: unstructure variables to assign values to corresponding structures, hahaha, with a simple example
var a = 1;
var b = 2;
var c = 3;
// ES5 simplifies a bit
var a = 1, b = 2, c = 3;
// ES6 is written like this
var [a, b, c] = [1.2.3];
Copy the code
Isn’t that easy? That’s pattern matching, so as long as the structure patterns on both sides are the same, the variables on the left will be assigned to the values on the right. Let’s look at a few more cases
Destruct assignment of arrays
let [a, [[b], c]] = [1The [[2].3]];
a / / 1
b / / 2
c / / 3
let [ , , c] = ["a"."b"."c"];
c // "c"
let [x, , y] = [1.2.3];
x / / 1
y / / 3
let [x, ...arr] = [1.2.3.4];
x / / 1
arr // [2, 3, 4]... The expansion operator that we'll talk about later
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z / / []
Copy the code
Object
var { a, b} = { a: "aaa".b: "bbb" };
a // aaa
b // bbb
var { b, a } = { a: "aaa".b: "bbb" };
a // "aaa"
b // "bbb"
var { c } = { a: "aaa".b: "bbb" };
c // undefined
/ / see an extension, the above var = {a, b} {a: "aaa", b: "BBB"}; It actually looks like this
var { a: a, b: b } = { a: "aaa".b: "bbb" };
a // aaa
b // bbb
// Let's try another way
var { a: aa, b: bb } = { a: "aaa".b: "bbb" };
a // a is not defined
b // a is not defined
// -- dividing line --
aa // aaa
bb // bbb
Key :value; key:value
Copy the code
And strings, and booleans, and the way functions can be deconstructed and assigned, and I’m not going to list them all,
conclusion
- Simplify variable declaration, fast and convenient
- Simplify array, object manipulation
- Function arguments are assigned by default
- If the pattern on the left of the equals sign does not match the value on the right, undefined or XX is not defined is output by default
String, re, array, object, function extension + Symbol
When it comes to these types of expansion is more relaxed and happy, why say so, because read the official documents of small partners must be shocked, all kinds of god operation, all kinds of simplified, all kinds of cool, there is a good saying, has been working overtime a straight, here I want to say: has been extended a straight.
Extension of arrays
The array.from () array. from method converts two types of objects into true arrays: array-like objects and iterable objects (including the new ES6 data structures Set and Map).
1, here is an array-like object, array. from turns it into a real Array.
var arr = {
'0': 'a'.'1': 'b'.'2': 'c'.length: 3
};
// ES5
var arr1 = [].slice.call(arr); // ['a', 'b', 'c']
// ES6
let arr2 = Array.from(arr); // ['a', 'b', 'c']
Copy the code
Let’s do another example
// Map objects will be added later in ES6
var map = new Map()
map // Map(0) {}
Array.from(map) / / []
// The Set object is added in ES6
var set = new Set()
set // Set(0) {}[[Entries]]No propertiessize: (...) __proto__: Set
Array.from(set) / / []
Copy the code
2, array.from () also provides a callback function similar to.map
var arr = {
'0': 'a'.'1': 'b'.'2': 'c'.length: 3
};
let arr = Array.from(arr,(i,n) = > {
// The callback function is similar to arr.map(() => {... })
});
Copy the code
The array.of () array.of method is used to convert a set of string values to an Array
Array.of(1.2.3) / / [1, 2, 3]
Array.of(1) / / [1]
Array.of(1).length / / 1
Copy the code
Entries (), keys(), and values() are often used to traverse an array instance. Can be used for… Of loop traversal
for (let index of ['a'.'b'].keys()) {
console.log(index);
}
/ / 0
/ / 1
Copy the code
Keys () is traversal of key names, values() is traversal of key values, and entries() is traversal of key-value pairs.
An operator…
let arr = [1.2.3.4]
console.log(... arr)// 1, 2, 3, 4
// Merge the array
let arr2 = [5]
let concat = [...arr,...arr2] // (5) [1, 2, 3, 4, 5]
// This is basically an array expansion operator
Copy the code
Extension of a function
Default values for function arguments
// Use the official example
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello'.'China') // Hello China
log('Hello'.' ') // Hello
Copy the code
scope
// Use the official example
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2) / / 2
// When the function f is called, the variable x has its own scope
// follow y = x
// Then print y to output 2
Copy the code
Let’s do the other one
let x = 1;
function f(y = x) {
let x = 2;
console.log(y);
}
f() / / 1
// Declare x globally
// function f assigns x to y by default, where x = 1;
// declare local variable x inside function f
// Print y, y equals the default value x, fixed output 1
// If global x is not declared, then an error is reported
Copy the code
Arrow function
Anyone who has used the Vue/React framework has used the arrow function concept. Let’s look at a simple example
var f = () = > 5;
/ / is equivalent to
var f = function () { return 5 };
//--------
var sum = (num1, num2) = > num1 + num2;
/ / is equivalent to
var sum = function(num1, num2) {
return num1 + num2;
};
Copy the code
It’s actually a shorthand for an ES5 function to make the syntax simpler and clearer. Let’s look at it through an example
let getNumber= num= > ({ num: num, name: "tom" });
// Convert to ES5
var getNumber = function (num) {
return {
num: num,
name: "tom"}}// Note that if you want to return an object directly, you must enclose () parentheses, otherwise an error will be reported
Copy the code
1. The “this” object in the body of the function refers to the object that was defined, not the object that was used. In fact, there is no concept of this in the arrow function, so the direction of this in the arrow function does not change. 2, cannot be used as a constructor, that is, cannot use the new command, otherwise an error will be thrown. 3. Do not use arguments. This object does not exist in the function body. If you want to use rest (added in ES6)
Object extension
ES6 allows you to write variables and functions as properties and methods of an object directly inside curly braces. This writing is more concise.
variable
const x = 'x';
const y = {x};
y // {x: "x"}
/ / is equivalent to
const y = {x: x};
Copy the code
function
function f(x, y) {
return {x, y};
}
/ / is equivalent to
function f(x, y) {
return {x: x, y: y};
}
f(1.2) // Object {x: 1, y: 2}
Copy the code
Property traversal mode
ES6 has five methods to traverse the properties of an object
/ / the commonly used
for. in// for... The in loop iterates over the object's own and inherited enumerable attributes (excluding the Symbol attribute).
Object.keys(obj)
// object. keys returns an array containing the keys of all the enumerable properties of the Object itself (not inherited), but not the Symbol property.
// Not commonly used
Object.getOwnPropertyNames(obj)
/ / Object. GetOwnPropertyNames returns an array that contains all attributes of the Object itself (excluding Symbol attribute, but cannot be enumerated attribute) of keys.
Object.getOwnPropertySymbols(obj)
/ / Object. GetOwnPropertySymbols returns an array that contains all the Symbol attribute of the Object itself the key name.
Reflect.ownKeys(obj)
// reflect.ownkeys returns an array containing all the key names of the object itself, whether the key names are Symbol or string, and whether they are enumerable or not.
Copy the code
Set, Map Data structure
Set ES6 provides a new data structure, Set. It’s like an array, but the values of the members are unique, there are no duplicate values, so let’s recognize it
const s = new Set(a); sSet(0) {}
[[Entries]]
No properties
size: (...).__proto__: Set
Copy the code
The add method, used to add an element
s.add(1)
Set(1) {1}
s
Set(1) {1}[[Entries]]
0: 1
size: (...).__proto__: Set
// We can see that the s object has a data_0:1
Copy the code
When a value is added to a Set, the cast does not occur.
An array deset function can accept an array of values
const set = new Set([1.2.3.4.4]);
set // Set(4) {1, 2, 3, 4}
[[Entries]]
0: 1
1: 2
2: 3
3: 4
size: (...).__proto__: Set
Copy the code
You can see that a set returns an object that looks like an array, so how do you convert it to a real array format and there are two ways that ES6 can do that, as we’ve seen above
const set = new Set([1.2.3.4.4]);
[...set] // [1, 2, 3, 4]
Array.from(set) // [1, 2, 3, 4]
Copy the code
Properties and methods of the Set instance
Set. The prototype. The constructor: constructor, the default is Set function. Set.prototype.size: Returns the total number of members of the Set instance. The methods of a Set instance fall into two broad categories: operation methods (for manipulating data) and traversal methods (for traversing members). Here are four methods of operation.
Set.prototype.add(value) : Adds a value, returning the Set structure itself. Set.prototype.delete(value) : deletes a value. A Boolean value is returned to indicate whether the value is successfully deleted. Set.prototype.has(value) : Returns a Boolean value indicating whether the value is a member of a Set. Set.prototype.clear() : clears all members. No value is returned.
Map
JavaScript objects are essentially collections of key-value pairs (Hash structures), but traditionally only strings can be used as keys, which limits their use.
In fact, Map deconstruction is similar to Set, so let’s get to know the Map structure
const m = new Map(a); mMap(0) {}
[[Entries]]
No properties
size: (...).__proto__: Map
Copy the code
The method of adding and deleting Map data structure
// Use the official example
const m = new Map(a);const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
Copy the code
The above code uses the set method of the Map structure to treat the object o as a key of m, then reads the key using the get method, and then deletes the key using the delete method.
Map data destructor can also take an array as an argument, such as:
const map = new Map([['name'.'Joe'],
['title'.'Author']]); map.size/ / 2
map.has('name') // true
map.get('name') // "Zhang SAN"
map.has('title') // true
map.get('title') // "Author"
Copy the code
You pass an array as an argument, and all you’re doing is doing one iteration, new Map multiple times
const items = [
['name'.'Joe'],
['title'.'Author']].const map = new Map(a); items.forEach(([key, value]) = > map.set(key, value)
);
Copy the code
So what’s different about Map? What problem does Map solve
const aa = new Map(a); aa.set({obj:'obj key-value pair equivalent key'},"123")
Map(1){{... } = >"123"}
[[Entries]]
0: {Object= > "123"}
key: {obj: "Obj key-value pair equivalent key"} / / the key the key
value: "123" / / key value
size: (...).__proto__: Map
Copy the code
Official explanation:
JavaScript objects are essentially collections of key-value pairs (Hash structures), but traditionally only strings can be used as keys, which limits their use.
Map solution: To solve this problem, ES6 provides a Map data structure. It is similar to an object in that it is also a collection of key-value pairs, but the range of “keys” is not limited to strings, and all types of values (including objects) can be used as keys. In other words, the Object structure provides a “string value” correspondence, and the Map structure provides a “value value” correspondence, which is a more complete implementation of the Hash structure.
Map instance properties and methods
Map.prototype.set(key, value) The set method sets the key value corresponding to key to value and returns the entire Map structure. If the key already has a value, the key value is updated, otherwise the new key is generated. Map.prototype.get(key) The get method reads the key corresponding to the key. If the key cannot be found, undefined is returned.
The map.prototype. has(key) has method returns a Boolean value indicating whether a key is in the current Map object.
Map.prototype.delete(key) The delete method removes a key, returning true. If deletion fails, return false.
The map.prototype.clear () clear method clears all members without returning a value.
Set: Obviously, we talked about the classic array demap: also obviously, with the key-value pair solved, the “key” can be a variety of types
Proxy
Proxy can be understood as that a layer of “interception” is set up before the target object, and the external access to the object must pass this layer of interception first. Therefore, it provides a mechanism to filter and rewrite the external access. The original meaning of the word Proxy is Proxy, used here to mean that it “proxies” some operation.
Let’s get to know proxy with an official example
var obj = new Proxy({}, {
get: function (target, key, receiver) {
console.log(`getting ${key}! `);
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`setting ${key}! `);
return Reflect.set(target, key, value, receiver); }});// The above code sets up a layer of interception on an OBj object and redefines the properties' get and set behavior
obj.a = 1
// VM888:7 setting a!
obj.a / / 1
++obj.a
// VM888:3 getting a!
// VM888:7 setting a!
obj.a / / 2
Copy the code
We can see that we intercepted obj.a’s unique write operation.
Var proxy = new proxy (target, handler); The new Proxy() parameter generates a Proxy instance, the target parameter indicates the target object to intercept, and the Handler parameter is also an object to customize the interception behavior. In this case, accessing the proxy is equivalent to accessing the target object, for example:
var target = {};
var handler = {};
var proxy = new Proxy(target, handler);
proxy.a = 'b';
target.a // "b"
Copy the code
Extended properties: Interception operations supported by the Proxy
get(target, propKey, receiver)
// Intercepts reading of object properties, such as proxy.foo and proxy['foo'].
set(target, propKey, value, receiver)
Foo = v or proxy['foo'] = v, and return a Boolean value.
has(target, propKey)
// Intercept the propKey in proxy operation and return a Boolean value.
deleteProperty(target, propKey)
// Intercept the delete proxy[propKey] operation and return a Boolean value.
ownKeys(target)
/ / interception Object. GetOwnPropertyNames (proxy), Object. GetOwnPropertySymbols (proxy), Object. Keys (proxy) for... In loop that returns an array. This method returns the property names of all of the target Object's own properties, whereas object.keys () returns only the traversable properties of the target Object itself.
getOwnPropertyDescriptor(target, propKey)
/ / interception Object. GetOwnPropertyDescriptor (proxy, propKey), returns the attributes describe objects.
defineProperty(target, propKey, propDesc)
// Intercept object.defineProperty (proxy, propKey, propDesc), object.defineProperties (proxy, propDescs) and return a Boolean value.
preventExtensions(target)
// Intercept object.preventExtensions (proxy) and return a Boolean value.
getPrototypeOf(target)
// Intercept object.getProtoTypeof (proxy) and return an Object.
isExtensible(target)
// Intercepts object.isextensible (proxy) and returns a Boolean value.
setPrototypeOf(target, proto)
// Intercept object.setPrototypeof (proxy, proto) and return a Boolean value. If the target object is a function, there are two additional operations that can be intercepted.
apply(target, object, args)
// Intercepts the operation of a Proxy instance as a function call, such as Proxy (... The args), proxy. Call (object,... The args), proxy. Apply (...). .
construct(target, args)
// Intercepts the operation of a Proxy instance as a constructor call, such as new Proxy (... The args).
Copy the code
The Generator function
Generator functions are an asynchronous programming solution provided by ES6 with a syntax behavior completely different from traditional functions.
Let’s start with Generator function 1. There is an asterisk between the function keyword and the function name. 2. Use yield expressions inside the function body to define different internal states
A Generator function is called in a slightly different way than a normal function. A normal function call is just fun(). A Generator function is called in a way that requires.next(), which is fun().next(), to move the pointer to the next state; That is, each time the next method is called, the internal pointer is executed from the head of the function or where it stopped last, until the next yield expression (or return statement) is encountered. In other words, the Generator function is executed in segments, the yield expression is a marker to pause execution, and the next method can resume execution.
For those of you who have read my Javascript Advanced article 2, you should know that function currying is a bit similar to GO Javascript Advanced 2
Let’s look at a practical example
function* Gen () {
yield 'Hi';
yield 'Sen';
return "HiSen";
}
var G = Gen()
G.next()
{value: "Hi".done: false}
G.next()
{value: "Sen".done: false}
G.next()
{value: "HiSen".done: true}
G.next()
{value: undefined.done: true}
Copy the code
The result is obvious: the variable G equals the function Gen(), and the g.ext () execution goes to the next state, returning an object at a time whose value property is the value of the current yield expression, and whose done property value is false, indicating that the traversal is not complete. {value: “HiSen”, done: true}} {value: undefined, done: true}} {value: undefined, done: true}} {value: undefined, done: true}}
To summarize, call the Generator function and return a traverser object that represents an internal pointer to the Generator function. Later, each time the next method of the traverser object is called, it returns an object with two properties, value and done. The value attribute represents the value of the current internal state and is the value of the expression following the yield expression; The done property is a Boolean that indicates whether the traversal is complete.
async await
What is an async function? In short, it is the syntactic sugar for Generator functions. Async and await have clearer semantics than asterisks and yields. Async means that there are asynchronous operations in the function, and await means that the following expression needs to wait for the result (an asynchronous task).
Basic usage: A function is preceded by the async keyword to indicate that there are asynchronous operations within the function. When you call this function, it immediately returns a Promise object that I’ll talk about later. Await is generally used inside async functions.
Let’s take a look at async functions with a simple example
async function as () {
return 2;
}
as(a)// Promise {<resolved>: 2}
Copy the code
We can see that a promise object is returned and that the default resolved callback succeeds in passing parameter 2. We can conclude that the value returned by the return statement inside the async function will become the parameter of the then method callback.
Next, let’s get to know the await. Normally, the await command is followed by a Promise object that returns the result of that object. If it is not a Promise object, the corresponding value is returned. So let’s try it out
function setTime () {
return new Promise(function (resolve,reject) {
setTimeout(
function () {
resolve("Success")},2000)
})
}
setTime() Return a Promise {
} object
// await accepts a Promise object, which we isolate using the setTime function.
async function as () {
var num = 1;
num = await setTime(); // Await followed by a Promise object
console.log(num)
}
as(a)// Promise {
} return "Success" after 2 seconds
Copy the code
Analysis: The setTime function returns a promise object and calls resolve(” successful “) after 2 seconds. Then we define an async await function as. Await setTime() means to wait for the result of setTime() before proceeding 3, so it will print successfully after 2 seconds
A simple async await function appears in front of everyone. It is very simple and amazing, and the code looks completely synchronous. Declare variables, assign variables, print variables, but contain asynchronous tasks. The await command can be followed by Promise objects and primitive values (numeric, string, and Boolean), but this automatically converts to an immediately resolved Promise object.
Promise
What is a Promise object? Promise is a solution to asynchronous programming that is more rational and powerful than the traditional solution callback function. ES6 writes it into the language standard, unifying usage and providing Promise objects natively. Check the Promise
Let’s start with the basics
// Create a Promise object
var promise=new Promise(function(resolve,reject){
/ /... some async code
// Call resolve or reject based on the result of asynchrony
})
// Success and failure callbacks
promise.then(function(res){
//success
},function(error){
// error
});
Copy the code
Before we analyze it, we need to know how Promise works
Note that a Promise can only be in one state at a time
This parameter is fulfilled fulfilled. Pending: The execution is fulfilled
The state can only be changed from pending to Resolved or Rejected. Once the state change is complete, it cannot be changed (irreverability).
Fulfilled (Resolved) Pending —— “Fulfilled (resolved) pending——
Ok, now that we know how it works, let’s take a look at the code: After the asynchronous operation is complete, call Resolve and reject for different results.
Resolve and reject are two functions. Resolve is called when an asynchronous operation succeeds, passing the return value of the asynchronous operation as an argument. Reject is called when an asynchronous operation makes an exception, passing the error message as an argument.
After the asynchronous result is passed, use the THEN method to get the result returned by the asynchronous, which is promise.then(…) shown above. Is that clear, guys? The simple answer is: 1, define a promise object, do an asynchronous operation in it, get the result 2, call resolve or reject based on the result, make an asynchronous callback 3, and execute the corresponding callback
Of course, I believe that many children have seen in various blogs, forums, promise to deal with callback hell, in fact, the principle is very simple, is a successful callback chain call, a simple example.
var promise=new Promise(function(resolve,reject){
resolve(1)
})
promise.then(res= > {
return res;
}).then(res= >
console.log(++res)
)
// 2
Copy the code
The obvious result is that you need to return the last successful callback, and then the chain call is used all the time.
class
In ES6, class is a new class that can be inherited through the extends keyword, which is much cleaner and easier than ES5’s implementation of inheritance by modifying the prototype chain.
Get to know the class class
/ / class
class parent{}// Child inherits parent, which can be implemented directly on the console
class child extends parent{}typeof parent
// "function"
Copy the code
Class parent {} ES2015 function parent () {} ES2015 function parent () {
Let’s expand on that
/ / class
class parent{
constructor(x, y) {
this.x = 1;
this.y = 2; }}// Child inherits parent, which can be implemented directly on the console
class child extends parent{
constructor(x, y, z) {
super(x, y); Constructor (x, y) = constructor(x, y);
this.z= 3; }}Copy the code
Function parent (constructor(x,y) {this.x=x; constructor(x,y) {this.x=x; this.y=y; } This code should be familiar to anyone who has written react projects.
Super () Super represents the constructor of the superclass. ES6 requires that the constructor of a subclass must execute the super function once.
Module is briefly introduced here, and I will write a post on modularization later
CommonJS: For the Node.js environment
/ / export
module.exports = moduleA.func;
/ / import
const moduleA = require( url );
Copy the code
AMD: For node.js environment, browser. The asynchronous mode is home to the module -> requireJS
// Define the module
define( 'module'['dep'].function(dep) {
return exports; })// Import the module
require(['module'].function(module) {})Copy the code
ES6 modularity: Needs to be converted to ES5 run
/ / export
export function hello(){};
export default {};
/ / import
import { A } from url;
import B from url;
Copy the code
Welcome to like, a little encouragement, a lot of growth