一、symbol javascript基本數據類型: null、undefined、number、boolean、string、symbol ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值(隨機生成的一個永遠都不會重覆的id串) 二、Set和Map 1、Set() 是es6提供的一 ...
一、symbol
javascript基本數據類型:
null、undefined、number、boolean、string、symbol
ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值(隨機生成的一個永遠都不會重覆的id串)
let s = Symbol();
typeof s
// "symbol"
二、Set和Map
1、Set()
是es6提供的一種新的數據結構,類似於數組,但是set裡面的數據具有唯一性
const s = new Set();
Set實例的屬性和方法
let set = new Set([1, 2, 3, 4, 4]);
//返回實例的總數
set.size //5
//操作方法
set.add(value) //添加某個值,返回結構本身
set.delete(value) //刪除某個值,返回一個布爾值
set.has(value) //返回一個布爾值,表示是否為set成員
set.clear() //清空所有成員,無返回值
//遍歷方法
keys(),values(),entries()
// 註:Set 結構沒有鍵名,只有鍵值,所以keys(),values()的行為完全一致
2、Map()
Map 數據結構,它類似於對象,但是鍵的範圍不限於字元串,可以為各種類型的值(包括對象)
let map = new Map();
let obj = {msg:'hello'}
//map設置和獲取值(用一個對象作為了鍵)
map.set(obj, 'content')
map.set('key', 'value')
map.get(obj) //'content'
//size 屬性
map.size //2
//返回一個布爾值,表示某個鍵是否在當前 Map 對象之中
map.has(obj) //true
//刪除某個鍵,返回true。如果刪除失敗,返回false
map.delete(obj) //true
//清除所有成員,沒有返回值。
map.clear()
//遍歷方法
keys(),values(),entries()
//註:Map 的遍歷順序就是插入順序
三、promise
是非同步編程的一種解決方案,可以處理多個非同步請求的執行順序等
//基本用法
let p1 = function(){
return new Promise((resolve,reject)=>{
//非同步操作1,成功執行resolve函數,失敗執行reject函數
})
}
let p2 = function(){
return new Promise((resolve,reject)=>{
//非同步操作2,成功執行resolve函數,失敗執行reject函數
})
}
p1.then((data)=>{
console.log('成功的回調')
},(err)=>{
console.log('失敗的回調')
})
//Promise.all方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例
let p = Promise.all([p1,p2])
p.then((data)=>{
//兩個都執行了resolve方法
}).catch((err)=>{
//一個不滿足就執行這裡
})
四、Generator函數 和 async函數
1、Generator函數
ES6 提供的一種非同步編程解決方案
操作繁瑣,需要手動調用next方法,不常用
function* test(){
yield 'hello'; //yield可以為一個非同步函數的返回結果
yield 'world';
...
}
let result = test();
console.log(result.next()); // { value: 'hello', done: false }
console.log(result.next()); // { value: 'world', done: false }
console.log(result.next()); // { value: undefined, done: true }
2、async函數(es7)
它就是 Generator 函數的語法糖
async函數返回一個 Promise 對象,可以使用then方法添加回調函數。
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, "finish");
});
}
async function asyncTimeSys(){
await timeout(1000);
console.log("第一層非同步結束!")
await timeout(1000);
console.log("第二層非同步結束!")
await timeout(1000);
console.log("第三層非同步結束!")
await timeout(1000);
console.log("第四層非同步結束!")
await timeout(1000);
console.log("第五層非同步結束!")
return "all finish";
}
asyncTimeSys().then((value)=>{
console.log(value);
});
五、Class類
通過class關鍵字,可以定義類
1、基本用法
//es6之前定義類(構造函數)
function Person(name,age){
this.name = name;
this.age = age;
}
let student = new Person('小明',18);
//定義共有方法
Person.prototype.say = function(){
return this.name +'今年'+ this.age;
}
console.log(student.say()) //小明今年18
//通過class定義類
class Person {
//靜態屬性,直接通過Person.type拿到值
static type = '地球人';
//靜態方法,通過Person.eat()調用
static eat(){
console.log('吃點啥');
}
//構造器定義類的屬性
constructor(name,age){
this.name = name;
this.age = age;
}
//定義共有方法
say(){
return this.name +'今年'+ this.age
}
}
let student = new Person('小明',18)
console.log(student.say()) //小明今年18
2、class的繼承
可以通過extends關鍵字實現繼承
class Person {
constructor(name){
this.name = name;
}
say(){}
}
class Teachaer extends Person{
constructor(name,job){
super(name); //需要用到this,則必須執行一次super函數,
this.job = job;
}
work(){
return `${this.name}的工作是${this.job}`;
}
}
let xiaoming = new Teachaer('小明','教書')
console.log(xiaoming .work()) //小明的工作是教書
六、Module語法
ES6之前已經出現了js模塊載入的方案,最主要的是CommonJS(用於伺服器端,如nodeJS)和AMD規範(用於瀏覽器,如requireJS)
1、export 導出
export用於對外輸出本模塊(一個文件可以理解為一個模塊)變數的介面
//1、一個一個的導出
//導出多個變數
export var name = "小明";
export var age = 18;
//導出方法
export function say(){}
//導出類
export class Person{}
//2、多個一起導出
let a = 1;
let b = 2;
let c = 3;
export { a, b, c }
//通過向大括弧中添加 a、b、c 變數並且export輸出,就可以將對應變數值以 a、b、c 變數標識符形式暴露給其他文件而被讀取到
2、import 導入
import用於在一個模塊中載入另一個含有export介面的模塊。
//1、引入所有成員
import * as items from '模塊路徑'
//註:* 代表所有,as後面跟別名
//2、引入指定成員
import { a, b } from '模塊路徑'
3、export default 導出預設成員
一個模塊只能有一個export default
var name = '小明'
export default name;
//引入default成員
import name from '模塊路徑'