歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

前端必備之ES6 javascript 開發(fā)技巧

發(fā)布時間:2018-04-23 22:17  回復(fù):0  查看:2697   最后回復(fù):2018-04-23 22:17  
本文和大家分享的主要是一些ES6 javascript 的實用開發(fā)技巧,一起來看看吧,希望對大家 學(xué)習(xí)前端開發(fā) 有所幫助。
  定義變量/常量
  ES6 中新增加了 let 和 const 兩個命令,let 用于定義變量,const 用于定義常量 兩個命令與原有的 var 命令所不同的地方在于,let, const 都是塊級作用域,其有效范圍僅在代碼塊中,實例如下:
  //es5if(1==1){
  var b = 'foo';
}console.log(b);
//foo
  //es6if(1==1){
  let b = 'foo';
}console.log(b);
//undefined
  定義常量對象
  const a = {a:1,b:2};
  a.b = 3;
console.log(a);
//{a:1,b:3}
  上例中,常量 a 中的內(nèi)容在定義后,再進(jìn)行修改依然有效,原因是對于對象類型的使用是指針式引用,常量只是指向了對象的指針,對象本身的內(nèi)容卻依然可以被修改,注意,數(shù)組(Array) 也是對象; 那么如果在定義常量時使用基礎(chǔ)數(shù)據(jù)類型:string, number, boolean 等
  const a = 1;
a = 2;
// Uncaught TypeError: Assignment to constant variable.
  在使用中,建議使用 let 與 const 完全代替 var 命令
  數(shù)值擴(kuò)展 轉(zhuǎn)換
  Number.parseInt - 將字符串或數(shù)字轉(zhuǎn)換為整數(shù) Number.parseFloat - 將字符串或數(shù)字轉(zhuǎn)換為浮點數(shù)
  Number.parseInt, Number.parseFloat 與 parseInt, parseFloat 功能一致,在ES6中,推薦使用 Number. 的方式進(jìn)行調(diào)用,這么做的目的是為了讓代碼的使用方式盡可能減少全局性方法,使用得語言逐步模塊化
  測試函數(shù)
  //測試是否整數(shù)Number.isInteger(21)//trueNumber.isInteger(1.11)//false
  //測試是否NaNNumber.isNaN(Nan)//trueNumber.isNaN(1)//false
  字符串?dāng)U展 字符串內(nèi)容測試
'abcdef'.includes('c');
//true'abcdef'.includes('ye');
//false'abcdef'.startsWith('a');
//true'abcdef'.endsWitch('f');
//true
//includes(), startsWith(), endsWith() 都支持第二個參數(shù),
//類型為數(shù)字類型,意為從第 n 個字符開始,endsWith()的第二個參數(shù)有點不一樣'abcdef'.includes('c', 4);
//false 從第5個字符開始查找是否有 'c' 這個字符'abcdef'.startsWith('d', 3);
//true 從第4個字符開始查找是否是以 'd' 字符為開頭'abcdef'.endsWith('d', 4);
//true 前面的4個字符里,是否以 'd' 字符為結(jié)尾
  字符串內(nèi)容重復(fù)輸出
'a'.repeat(5);
//aaaaa 重復(fù)輸出5遍
  原生支持模板語言
  //es5
  $('#result').append(
  'There are ' + basket.count + ' ' +
  'items in your basket, ' +
  '' + basket.onSale +
  ' are on sale!'
);
//es6
//在es6中,內(nèi)容模板,可以定義在 `` 包起來的字符串中,其中的內(nèi)容會保持原有格式
//另外可以在字符串中直接使用模板語言進(jìn)行變量填充,優(yōu)雅而簡潔
  $('#result').append(`
  There are ${basket.count} items
  in your basket, ${basket.onSale}
  are on sale!
  `);
  字符串遍歷輸出
  //for ...of 格式為 es6 中的 Iterator 迭代器的輸出方式for(let c of 'abc'){
  console.log(c);
  }//a//b//c
  字符串補(bǔ)全
//參數(shù)1:[number] 目標(biāo)字符串長度
//參數(shù)2:[string] 進(jìn)行補(bǔ)全的字符串'12345'.padStart(7, '0')
//0012345 - 字符串不足7位,在頭部補(bǔ)充不足長度的目標(biāo)字符串'12345'.padEnd(7, '0')
//1234500 - 在尾部進(jìn)行字符串補(bǔ)全
  數(shù)組擴(kuò)展 合并數(shù)組
let a = [1, 2];let b = [3];let c = [2, 4];let d = [...a, ...b, ...c];
//[1, 2, 3, 2, 4] 所有內(nèi)容合并,但并不會去除重復(fù)
  快速轉(zhuǎn)換為數(shù)組
Array.of(3,4,5)
//[3,4,5]
  數(shù)組內(nèi)容測試
  //判斷對象是否為數(shù)組if(Array.isArray(obj)){...}
  [1,2,3].includes(5);//false,檢索數(shù)據(jù)中是否有5
  //找出第一個匹配表達(dá)式的結(jié)果,注意是只要匹配到一項,函數(shù)即會返回let a = [1, 3, -4, 10].find(function(value, index, arr){
  return value < 0;
  });console.log(a);//-4
  //找出第一個匹配表達(dá)式的結(jié)果下標(biāo)let a = [1, 3, -4, 10].findIndex(function(value, index, arr){
  return value < 0;
});console.log(a);
//2
  內(nèi)容過濾
  //排除負(fù)數(shù)內(nèi)容let a = [1, 3, -4, 10].filter(function(item){
  return item > 0;
});console.log(a);
//[1, 3, 10]
  內(nèi)容實例
  keys() - 獲得數(shù)組中所有元素的鍵名(實際上就是下標(biāo)索引號)
  values() - 獲得數(shù)組中所有元素的數(shù)據(jù)
  entries() - 獲得數(shù)組中所有數(shù)據(jù)的鍵名和數(shù)據(jù)
  for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1
  for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'
  for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"
  .entries(), .keys(), .values() 功能與 Object 中的幾個同名函數(shù)功能類似,實際使用中實用性不高,對于數(shù)組的操作,直接進(jìn)行遍歷即可
  對象擴(kuò)展 屬性的簡潔表示
  //直接使用變量/常量的名稱個為對象屬性的名稱let a = 'abc';let b = {a};//{a: 'abc'}
function f(x, y){ return {x, y};}
//等效于function f(x, y){ return {x: x, y: y}}
  let o = {
  f(){ return 1; }
}
//等效于let o = {
  f: function(){ return 1; }
  }
  判斷對象是否為數(shù)組
  if(Object.isArray(someobj)){}
  對象內(nèi)容合并
  let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5};let d = Object.assign(a, b, c);
  console.log(d);//{a:1,b:4,c:5}
console.log(a);//{a:1,b:4}
//上面的合并方式會同時更新 a 對象的內(nèi)容,a 的屬性如果有多次合并會被更新數(shù)據(jù),
//但自身沒有的屬性,其它對象有的屬性不會被添加到 a 身上;
//參數(shù)列中的對象只會影響第一個,后面的參數(shù)對象不會被修改數(shù)據(jù)
//推薦使用這種方式進(jìn)行對象數(shù)據(jù)合并let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5};let d = Object.assign({}, a, b, c);
//第一個參數(shù)增加一個空對象,在合并時讓它被更新,不影響實際的對象變量內(nèi)容
console.log(d);//{a:1,b:4,c:5}
//與上面的方式合并結(jié)果一致,使用這種方式, a 對象的內(nèi)容就不會被影響了
  對象內(nèi)容合并的方向是從參數(shù)順序的后向前合并
  對象內(nèi)容集合
  Object.keys() - 獲得對象中所有的鍵名,以數(shù)組的形式返回
  var obj = { a:1,b:2 };var names = Object.keys(obj);//['a', 'b']
  Object.values() - 獲得對象中所有的值內(nèi)容,以數(shù)組的形式返回
  var obj = { a:1,b:2 };var values = Object.values(obj);//[1, 2]
  Object.entries() - 獲得對象中所有的成員數(shù)據(jù),以數(shù)組的形式返回,成員的內(nèi)容也是數(shù)組形式
  var obj = { a:1,b:2 };var values = Object.entries(obj);//[['a',1], ['b',2]]
  其實觀察可發(fā)現(xiàn),Object.keys(), Object.values(), Object.entries(),與 Java 的 MAP 中的方法是一致的,不論是方法名還是具體的用法,這也可以幫忙理解這些功能 API
  解構(gòu)賦值
let [a, b, c] = [1, 2, 3];
//定義了三個變量,并對應(yīng)賦了值;如果值的個數(shù)與變量名個數(shù)不匹配,沒有對應(yīng)上的變量值為 undefined
let [a, b, c='default'] = [1, 2];
//指定默認(rèn)值,在定義變量時就指定了默認(rèn)值,如果賦值時,沒有給定內(nèi)容,則會取默認(rèn)值
let [a, …b] = [1,2,3];//這里 b 的值為[2,3],這樣可以快速使用剩余的數(shù)據(jù)賦值給變量,
//但實際使用中為了避免代碼閱讀的歧義,不推薦這么使用,僅作了解即可
let [a,b,c] = 'yes';console.log(a);
//yconsole.log(b);
//econsole.log(c);
//s
  字符串的解構(gòu)賦值會以單個字符的方式進(jìn)行賦值
  let {length}='yes';console.log(length);//3
  以對象賦值的方式,如果名稱是字符串的自帶屬性,則會獲得屬性值
  let arr = [1,2];let obj = {a:1,b:2};function test ({a = 10, b}){
  console.log('a:',a);
  console.log('b:',b);
  }
  test(obj);
  解構(gòu)賦值的使用實例,作為函數(shù)傳參,并使用默認(rèn)值
  對象結(jié)構(gòu)解構(gòu)
  let obj = {a: 1, b: 2};let {a, b} = obj;//a=1,b=2
  使用變量的方式進(jìn)行結(jié)構(gòu)賦值,需要嚴(yán)格匹配名稱,數(shù)組的模式是嚴(yán)格匹配下標(biāo)
  let obj = {a: 1, b: 2};let {a=0, b=5} = obj;
  賦值并給定默認(rèn)值
  let obj = {a: 1, b: 2};let {a:A, b} = obj;//A=1,b=2,a報錯,變量未定義
  獲得內(nèi)容后,將變量進(jìn)行改名
  let obj = {a: 1, b: 2};let a = 0;
  ({a, b} = obj);
  對已存在的 a 進(jìn)行修改值,并生成新的變量 b
  let obj = {
  arr: ['aaa',{a:1}]
  };let {arr:[b, {a}]} = obj;//這里的arr互相映射
  console.log(b);
  console.log(a);
  獲得對象的子數(shù)據(jù),并映射到相應(yīng)的變量,這里需要注意的是結(jié)構(gòu)要對應(yīng)
  模塊化 最簡單實例的使用場景
  //a.jslet a = {a:1,b:2,c:3};export default a;
  //b.jsimport a from 'a.js';//假設(shè) a.js 與 b.js 同在一個目錄中console.log(a.a);//1
  以上簡單的實例就兩個腳本文件舉例說明了兩個文件在實際使用,可以進(jìn)行互相引用,并獲得目標(biāo)文件中的數(shù)據(jù);我們可以認(rèn)為一個腳本文件就是一個 模塊,那么在實際開發(fā)過程中,可以將業(yè)務(wù)處理內(nèi)容,或是數(shù)據(jù)處理過程 抽象 在一個文件中,在需要使用時,由其它模塊引入并使用其中的數(shù)據(jù)
您還未登錄,請先登錄

熱門帖子

最新帖子

?