// 箭頭函式
let f = a => a + 1;
// 等價於
var f = function(a) {
return a + 1;
}
// 模版字串
let a = 'react'
let s = `hello ${a}`; // hello react
// 解構賦值
let [lang, ...other] = ['js', 'java', 'react']; // js , ['java', 'react']
// 擴充套件運算子 合併陣列
let arr1 = ['a', 'a1'];
let arr2 = ['b'];
let newArr = [...arr1, ...arr2] // ['a', 'a1', 'b']
// 物件解構
let {
person: {
name,
age
},
foo
} = {
person: {
name: 'tom',
age: 4
},
foo: 'foo'
}
console.log(name, foo, age) // tom , foo , 4
// 預設值
let t = (a = 1) => a + 2
t(2) // 4
t() // 3
let o = '';
let temp = o || 1 // 1
// map用法
arr1.map(item => (
item
))
// filter
arr1.filter(item => (item != 'a')) // a1
// swap 變數值交換
let foo = 1
let bar = 2
;
[foo, bar] = [bar, foo] // foo = 2 , bar = 1
複製程式碼
一、babel轉化
1.環境搭建:
建立目錄:
src:書寫ES6程式碼的資料夾,寫的js程式都放在這裡。
dist:利用Babel編譯成的ES5程式碼的資料夾,在HTML頁面需要引入的時這裡的js檔案。
(1)在專案資料夾 命令列初始化 npm init -y
(2)全域性安裝babel-cli npm install -g babel-cli
(3)本地安裝babel-preset-es2015 和 babel-cli :
npm install --save-dev babel-preset-es2015 babel-cli
(4)新建.babelrc
配置轉碼包:
"presets":[
"es2015"
],
"plugins":[]
}
複製程式碼
在pakejson中配置轉碼命令:
"scripts": {
"build": "babel src/index.js -o dist/index.js"
},
//命令列執行npm run build 即可將js轉碼到dist資料夾
複製程式碼
二、語法:
// ------------------1.變數的解構賦值--------------------------
// ES6允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構
// *陣列解構
let [a, b, c] = [1, 2, 3]; //可以從陣列中提取值,按照位置的物件關係對變數賦值。
let [q, [w], e] = [1, [2], 3] //陣列模式和賦值模式統一:
let [t, y = 'js'] = ['技s']; //解構的預設值
console.log(t + y);
//*物件的解構賦值
let { foo, bar } = { foo: 'ss', bar: 'ee' };
// 物件的解構與陣列有的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。
let oop;({oop} = {oop:'slce'})// 如果在物件解構前定義了變數 再用此變數解構時會出錯,表示式外加()即可
//*字串解構
const [z,x,m,v,ll,n] = "JSPang";
//物件的函式解構
// 直接把這個JSON格式資料當作引數,傳遞到函式內部進行處理
{
let jsons = {
"pp":"aa",
"bb":"cc"
}
function lop ({pp,bb}) {
console.log(pp,bb)
}
lop(jsons);
}
//陣列的函式解構
{
let ayy = [88,77,55];
function ayys (a,b,c) {
console.log(a- b -c);
}
ayys(...ayy);
}
// ----------------------------------------2.擴充套件運算子和rest運算子(解決引數和物件陣列未知情況下的程式設計,讓程式碼更健壯和簡潔。)
//(1)傳入的引數不確定可以用...
function oop (...pl) {
console.log(pl);
}
oop(1,2,3,4);
//(2)解決對記憶體堆疊的引用,真正的賦值(用物件擴充套件運算子解決)原理是用[].concat(_a)
let a = [1];
let b = a; //對記憶體堆疊的引用,不是真正的賦值
b.push(2);
console.log(a) //[1,2]
{
let a = [1];
let b = [...a];
b.push(2);
console.log('...解決變數的賦值' + a + "---" +b);
}
//reset運算子可以用做實參(代替它前面的實參所對應的形參所後面剩餘的形參) 返回array型別
function rest (o,l,...p) {
console.log(p);
}
rest(2,4,6,8,0);
document.write('jdf'.repeat(3));//複製3個字串
//---------------------------------------------------------------3.js對數字操作-------------------------------
//(1)數字判斷和轉換
console.log(Number.isFinite(098)) //只要是數字則返回true,否則false;
console.log(Number.isInteger(0.33)); //判斷是否為整數,是---true,否則false
console.log(Number.parseInt(3.3)) //3 浮點數轉換為整數
console.log(Number.MAX_SAFE_INTEGER); //最大安全整數
console.log(Number.MIN_SAFE_INTEGER); //最小安全整數
let a = Math.pow(2, 53) - 1;
console.log(Number.isSafeInteger(a));//false 安全整數判斷isSafeInteger()
//----------------------------------------------------------------4.陣列---------------------------
// (1).json陣列轉換為陣列
let json = {
'0': 'ssss',
'1': 'aaaa',
'2': 'cccc',
length: 3
}
console.log(Array.from(json)); //["ssss", "aaaa", "cccc"] -----ES6中絕大部分的Array操作都存在於Array物件裡。用Array.from(xxx)來進行轉換
console.log(Array.of(2,'kk')) // 將文字||變數轉換為陣列
//find()例項方法: val:表示當前查詢的值。 index:表示當前查詢的陣列索引。 arr:表示當前陣列。
// 所謂的例項方法:就是並不是以Array物件開始的,而是必須有一個已經存在的陣列
console.log(
[1, 2, 3, 4].find(
(val, index, arr) => {
return val > 1; //找到了符合條件的值,如果找不到會顯示undefined。
}
)
);
//(2).fill() 方法用於將一個固定值替換陣列的元素。
//array.fill(value, start, end)
//value 必需。填充的值。
// start 可選。開始填充位置。從0開始
// end 可選。停止填充位置(預設為 array.length)
['ni','hao','me','me','da'].fill('哈哈',0,1);
//(3). keys() 方法用於從陣列建立一個包含陣列鍵的可迭代物件。 如果物件是陣列返回 true,否則返回 false。
//返回值:一個陣列可迭代物件。
Object.keys({p:'d'})//用於物件返回其鍵 //p
["Banana", "Orange", "Apple", "Mango"].keys().next().value; //0 建立一個可迭代的物件,該物件包含陣列的鍵
for (let i of [3,4,5].keys()) {
console.log(i); //迴圈陣列 返回陣列的索引 0 1 2
}
{let a = [3, 4, 5, 6];
let s = a.keys();
console.log(s.next().value);//0
console.log(s.next().value)//1 -----------逐個輸出陣列的索引
}
//(4). entries() 方法返回一個陣列的迭代物件,該物件包含陣列的鍵值對(key / value) 。
//迭代物件中陣列的索引值作為 key, 陣列元素作為 value。
for (let [index,val] of [7,8].entries()) {
'use strict';
console.log(index + 'h' + val); //0h7 1h8 //同時輸出陣列索引和其對應的值; [7,8].entries().next().value 輸出[0,7]
}
//---------------------------------------------5.函式--------------------------------------------------
// (1)函式中的嚴謹模式
// 我們在ES中就經常使用嚴謹模式來進行程式設計,但是必須寫在程式碼最上邊,相當於全域性使用。在ES6中我們可以寫在函式體中,相當於針對函式來使用。
// function add(aS, bS = 1) {
// 'use strict'
// if (aS == 0) {
// throw new Error('This is error');
// }
// return aS + bS;
// }
// console.log(add(1));
// 上邊的程式碼,瀏覽器控制檯報錯,這是ES6中的一個坑,。這個錯誤的原因就是使用了預設值,再使用嚴謹模式的話,就會有衝突,所取消預設值的操作。
function add(aS, bS) {
'use strict'
if (aS == 0) {
throw new Error('This is error');
}
return aS + bS;
}
console.log(add(1, 2));
//in 方法判斷物件或陣列中是否有某個值
// 判斷物件中是否有某個值
{
let lkj = {
"oop":"oop",
"shift":"shfit"
}
console.log('oop' in lkj);
}
// 判斷陣列中是否有某個值
// 之前用陣列的length來判斷陣列是否為空,但是有弊端,
// 比如:[,,,].length //3 其實是空值
//用in解決判斷索引
console.log(0 in [,,,]); //false
console.log(0 in ['q','w','e']); //true
// join()方法 在陣列元素中間,加了一些間隔,開發中很有用處。
let arr = ['j', 'w', 'e'];
console.log(arr.join('|')); //j|w|e
//---------------------------------------------------6.物件-------------------------------
// (1).d物件賦值:
// ES6允許把宣告的變數直接賦值給物件:
{
let [ab,ba] = [1,2];
var obs = {ab,ba}
}
// (2).物件Key值構建
// 擷取數字
var yaoxi = "http://172.16.2.77:10800/play.html?channel=44";
var nani = parseInt(yaoxi.slice(yaoxi.split('').indexOf('=') + 1));
console.log(typeof nani + nani);
var yaoxi = "http://172.16.2.77:10800/play.html?channel=44";
console.log(yaoxi.split('=')[1].split('l').toString())
Object.is() //物件比較
// 物件的比較方法, 以前進行物件值的比較,經常使用 === 來判斷,比如下面的程式碼:
var obj1 = { name: 'eeee' };
var obj2 = { name: 'eeee' };
console.log(obj1.name === obj2.name);//true
// 那ES6為我們提供了is方法進行對比。
var obj1 = { name: 'eeee' };
var obj2 = { name: 'eeee' };
console.log(obj1.name === obj2.name);//true
console.log(Object.is(obj1.name, obj2.name)); //true
// 區分 === 和 is方法的區別是什麼,看下面的程式碼輸出結果。
console.log(+0 === -0); //true
console.log(NaN === NaN); //false
console.log(Object.is(+0, -0)); //false
console.log(Object.is(NaN, NaN)); //true
// === 為同值相等,is()為嚴格相等。
Object.assign() //物件合併
{
let a = {a:'opop',bd:12};
let b = {v:'pppp',dd:12};
console.log(Object.assign(a,b));
}
// symobol在物件中的作用 對物件元素的保護
// symobol是es6新增的原始資料型別 它是JavaScript的第七種資料型別 表示獨一無二的值
// Symbol值通過Symbol函式生成,只要屬性名是屬於Symbol型別的,就是獨一無二的,可以保證不會與其他屬性名產生衝突。
let s = Symbol('name'); //symbol 代表的是 唯一且不與其他任何型別相同的值
// 用Symbol構建物件的Key,並呼叫和賦值。
{
let sy = Symbol();
var sys = {
[sy]:'la'
}
console.log(sys[sy]) //la
}
// 用Symbel對對物件的某個值進行保護 不讓其輸出
{
let hu = {name:"hh",phone:'000',age:12};
// 不讓程式輸出age
// 先複製後刪除
let ageClone = hu.age;
delete hu.age;
let ages = Symbol();
hu[ages] = ageClone;
for (let x in hu) {
console.log(hu[x]) //{name: "hh", phone: "000", Symbol(): 12}
}
}
// ------------------------7、Set和WeakSet及map的資料結構-----------------------------
// 1.Set的資料結構(是以陣列的形式構建的,實質並不是陣列) 返回一個類陣列
// Set和Array的顯著區別:Set不允許陣列有重複的元素()去重
new Set([1, 2, 3, 4, 1, 1, 1, 1]) //{1, 2, 3, 4}
// (1)Set 的增刪改查
// add新增元素
new Set([1]).add('hh') //{1, "hh"}
{
//delete刪除元素
let del = new Set([1,1,2]);
del.delete(1); //刪除陣列元素1
console.log(del) //{2}
}
{
// has查詢元素是否存在 返回Boolea
let cha = new Set([1,2,4,4]);
cha.has(4);//true 查詢是否存在元素4
}
{
//clear 清空陣列內容
let vb = new Set([2,3,45]);
vb.clear();
console.log(vb); //{}
}
{
//size是Set的內建屬性 獲得Set值的數量
new Set([1,2,3,4]).size //4
let bop = new Set([1,2,3]);
bop.forEach((item) => {console.log(item)})
}
// 2. weakSet 傳入的值必須是物件 返回一個物件陣列
{
let weakObj = new WeakSet();
let obj = { a: '33', b: '44' }
let obj1 = obj;
weakObj.add(obj);
weakObj.add(obj1);
console.log(weakObj); //value: { a: "33", b: "44" } value是他的內建屬性
}
//3.map資料結構 (常見處理物件的鍵和值) 可以將其看成key/value 返回類陣列
{
let ma = {
name:'ppp',
age:111
}
let map = new Map();
map.set(ma,'dep') //key: "ppp" value: "llll"
map.get(ma) //dep 得到value
map.delete(ma);//{} 清空鍵
}
//---------------------------------------8鉤子函式--------------------------------
// 鉤子函式:在執行函式前初始化一些資料,在改變物件值後做一些善後處理。這些都算鉤子函式(可理解為是函式或者物件的生命週期。)
// Proxy的應用可以使函式更加強大,業務邏輯更加清楚,而且在編寫自己的框架或者通用元件時非常好用
new Proxy ({},{});
// 第一個花括號就相當於方法的主體,後邊的花括號是Proxy代理處理區域,相當寫鉤子函式的地方。
{
var obj = {
add:function (x) {
return 2 + x
}
}
console.log(obj.add(2));
// 用 new Proxy()處理obj
var objProxy = new Proxy(
{
add:function (xx) {
return xx + 22
},
name: 'new Proxy',
ads:function () {
}
},
{
get: function (target,key,property) {
new function () {
alert(0);
}
console.log('在函式方法執行前執行鉤子函式');
return target[key];
//target代表 new Proxy({},{})中第一個括號中的內容,[key]值代表第一個{}中的屬性值
}
}
)
console.log(objProxy.name); //輸出-》 //在函式方法執行前執行鉤子函式 // new Proxy
// add屬性函式執行前先執行get屬性的函式
// get屬性;
// get屬性是在得到某物件屬性值時預處理的方法,他接受三個引數
// target:得到的目標值
// key:目標的key值,相當於物件的屬性
// property:不太常用
//-----------------------------------------------------9.Promise物件的使用-----------------------------------
// Promise解決了:es5函式的多層巢狀(回撥地獄),程式碼層次過多,難以維護和二次開發
let state = 1;
function step1(resolve, reject) {
if (state == 1) {
resolve('ff');
} else {
reject('ww');
}
}
new Promise(step1).then(function (val) {
console.log(val + 'e'); //ffe
})
// 一個全新的 promise 物件從每個 then 的呼叫中返回。
// Promise的then()方法有三個引數: 成功回撥,失敗回撥,前進回撥
// Promise物件狀態:
// Promise 物件代表一個非同步操作,其不受外界影響,有三種狀態:
// 1.Pending(進行中、未完成的)
// 2.Resolved(已完成,又稱 Fulfilled)
// 3.Rejected(已失敗)。
}
```
複製程式碼