亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

淺談讓你的代碼更簡短,更整潔,更易讀的ES6小技巧

2024-05-06 16:46:35
字體:
來源:轉載
供稿:網友

寫在文章前面

這篇文章翻譯自ES6 tips and tricks to make your code cleaner, shorter, and easier to read!. 文章就代碼整潔方面對es6進行了總結。如有錯誤歡迎指出。

template literals 模板字符串

模板字符串使字符串的使用變得比以前更簡單了,他們以反引號開始(`),并且能過使用${變量}來插入變量。我們來比較一下下面兩行代碼。

var fName = 'Peter', sName = 'Smith', age = 43, job= 'photographer';var a = 'Hi, I/'m ' + fName + ' ' + sName + ', I/'m ' + age + ' and work as a ' + job + '.';var b = `Hi, I'm ${ fName } ${ sName }, I'm ${ age } and work as a ${ job }.`;

一切都變得很美好了是不是,代碼更易讀了是不是?你可以在大括號內放入任何東西:變量,等式,或者函數的調用。 我將會在后面的整個文章的示例中使用這些方式。

塊級作用域語法

JavaScript是使用函數作用域的,這就是為什么我們是為什么我們越來越頻繁的使用匿名的立即執行函數表達式(iife)來實現整個JavaScript文件的封裝。我們這么做是為了把所有的變量隔離在文件內從而避免變量沖突。
現在我們有了塊級作用域和兩個嶄新的塊級作用域的變量聲明

let declaration let命令

這個命令和var很相似但卻又有著顯著的不同。因為他是有塊級作用域的,聲明一個相同名字的新變量可以完全不影響外部的變量。

var a = 'car' ;{  let a = 5;  console.log(a) // 5}console.log(a) // car

因為他是被限制在塊級作用域的,他解決了那道非常經典的面試題:“下面這個代碼的輸出是什么,如何修改讓他運行之后成為你想的那個樣子?”

for (var i = 1; i < 5; i++){  setTimeout(() => { console.log(i); }, 1000);}

這個例子中,輸出是“5 5 5 5 5”因為變量i在每次迭代中都會改變。

如果我們把var變為let,一切都變了。 現在,每次循環都會創建一個全新的塊級作用域吧i限制在當前的循環,他可以理解為這樣:

{let i = 1; setTimeout(() => { console.log(i) }, 1000)} {let i = 2; setTimeout(() => { console.log(i) }, 1000)} {let i = 3; setTimeout(() => { console.log(i) }, 1000)} {let i = 4; setTimeout(() => { console.log(i) }, 1000)} {let i = 5; setTimeout(() => { console.log(i) }, 1000)} 

var 和 let的另外一個區別是 let 不會像 var一樣被變量提升

{   console.log(a); // undefined  console.log(b); // ReferenceError  var a = 'car';  let b = 5;}

因為他有更為局限的作用域,以及更能被預測的行為,因此一些人甚至認為你應該使用let來代替var, 除非當你真的特別需要變量提升或者更寬松的作用域范圍,你再使用var

Const

在以前,如果你想在JavaScript中聲明一個常量, 習慣性的做法是使用全大寫來命名。然鵝,這不是真的去保護了這個變量不能被更改---只是讓其他的開發者知道,這是一個常量,它不應該被更改。

現在我們有了const命令.

const沒有讓變量完全不可變,只是鎖定他的賦值,當你有一個復雜的變量(數組或者對象)的時候,值還是可以被修改的。

{  const d = [1, 2, 3, 4];  const dave = { name: 'David Jones', age: 32};  d.push(5);   dave.job = "salesman";  console.log(d); // [1, 2, 3, 4, 5]  console.log(dave); // { age: 32, job: "salesman", name: 'David Jones'}}

Problem with block scoping functions函數塊級作用域化帶來的問題

函數的聲明也可以限制在塊級作用域中。

{  bar(); // works  function bar() { /* do something */ }}bar(); // doesn't work

但是當你在一個if語句中聲明一個函數的時候問題來了。

想一下這種情況:

if ( something) {  function baz() { console.log('I passed') }} else {  function baz() { console.log('I didn/'t pass') } } baz();

在ES6之前,這兩個函數聲明都被變量提升,而且結果一定是I didn't pass 不論條件中的something是什么。但現在我們會得到輸出ReferenceError, 因為 baz一直被限定在塊級作用域內。

Spread 擴展運算符

ES6介紹了...操作符,這個操作符指的就是‘擴展運算符‘。他的主要用途有兩個:1. 將一個數組或者對象放到一個新的數組或者對象中 2. 將數組中的多個參數合并在一起

第一個用途可能是你將會使用的最多的。所以我們先來看他。

let a = [3, 4, 5];let b = [1, 2, ...a, 6];console.log(b); // [1, 2, 3, 4, 5, 6]

如果我們想把一個數組內的一組參數傳遞給函數,這個時候擴展運算符就十分的有用了。

function foo(a, b, c) { console.log(`a=${a}, b=$, c=${c}`)} let data = [5, 15, 2];foo( ...data); // a=5, b=15, c=2

一個對象也可以擴展的,它會把每個鍵值對寫入新的對象中。( 對象擴展已經在提議的第四階段,而且將會在es2018中正式出現 。但這種特性目前只被chrome60及以后的版本,Firefox55及以后,node 6.4.0及以后的版本所支持)【譯者注:在2ality博客中的es2018一文中得知,在剛剛結束的TC39會議中,ECMA2018的特性被敲定了。

let car = { type: 'vehicle ', wheels: 4};let fordGt = { make: 'Ford', ...car, model: 'GT'};console.log(fordGt); // {make: 'Ford', model: 'GT', type: 'vehicle', wheels: 4}

擴展運算符的另一個特點是,他可以生成一個新的數組或者對象. 下面的這個例子,就是b就是新建的數組,但c只是引用同一個數組。

let a = [1, 2, 3];let b = [ ...a ];let c = a;b.push(4);console.log(a); // [1, 2, 3]console.log(b); // [1, 2, 3, 4] 不同的數組c.push(5);console.log(a); // [1, 2, 3, 5] console.log(c); // [1, 2, 3, 5] 同一個數組

第二個用法是把變量聚集到一個數組里面。當你不知道一個函數到底有多少的傳參的時候會這個方法會變得非常的有用。

function foo(...args) {  console.log(args); } foo( 'car', 54, 'tree'); // [ 'car', 54, 'tree' ] 

Default Parameter 參數默認值

函數現在可以使用默認的參數值來定義了。不傳參或者未定義值都被初始化為默認值。但是需要注意的是,null和false都會被強轉為0.

function foo( a = 5, b = 10) {  console.log( a + b);} foo(); // 15foo( 7, 12 ); // 19foo( undefined, 8 ); // 13foo( 8 ); // 18foo( null ); // 10 as null is coerced to 0

默認值的類型可以不僅僅是值類型---還可以是表達式或者函數。

function foo( a ) { return a * 4; }function bar( x = 2, y = x + 4, z = foo(x)) {  console.log([ x, y, z ]);}bar(); // [ 2, 6, 8 ]bar( 1, 2, 3 ); //[ 1, 2, 3 ] bar( 10, undefined, 3 ); // [ 10, 14, 3 ]

Destructuring解構

解構是拆開等號左邊的數組或者對象的過程。這個數組或者對象可以來自一個變量,一個函數,或者一個等式

let [ a, b, c ] = [ 6, 2, 9];console.log(`a=${a}, b=$, c=${c}`); //a=6, b=2, c=9function foo() { return ['car', 'dog', 6 ]; } let [ x, y, z ] = foo();console.log(`x=${x}, y=${y}, z=${z}`); // x=car, y=dog, z=6

對象類型的結構,可以在花括號內列出對象的鍵來提取鍵值對。

function bar() { return {a: 1, b: 2, c: 3}; }let { a, c } = bar();console.log(a); // 1console.log(c); // 3console.log(b); // undefined

有時,你可能想提取出值然后費賠給新的變量,這個可以通過在等號左側使用一個“key:variable”(鍵:變量名)來完成。

function baz() {   return {    x: 'car',    y: 'London',    z: { name: 'John', age: 21}  }; }let { x: vehicle, y: city, z: { name: driver } } = baz();console.log(  `I'm going to ${city} with ${driver} in their ${vehicle}.`); // I'm going to London with John in their car. 

此外,對象的結構允許給多個變量賦值。

let { x: first, x: second } = { x: 4 };console.log( first, second ); // 4, 4

對象字面量和屬性的簡潔表達法

當你從許多參數創建對象字面量的時候,ES6允許你在鍵與變量名字相同的情況下省略該鍵。

let a = 4, b = 7;let c = { a: a, b: b };let concise = { a, b };console.log(c, concise) // {a: 4, b: 7}, {a: 4, b: 7}

這個還可以與解構一起用來使你的代碼更干凈整潔。

function foo() {  return {    name: 'Anna',     age: 56,    job: { company: 'Tesco', title: 'Manager' }  };} // pre ES6let a = foo(), name = a.name, age = a.age, company = a.job.company;// ES6 destructuring and concise parameters let { name, age, job: {company}} = foo();

簡潔表示法還可以用于解構對象并把它傳入函數。方法1和2是你在es6之前要怎么做, 方法三是使用解構和簡潔表達法。

let person = {  name: 'Anna',   age: 56,  job: { company: 'Tesco', title: 'Manager' }};// method 1function old1( person) {  var yearOfBirth = 2018 - person.age;  console.log( `${ person.name } works at ${ person.job.company } and was born in ${ yearOfBirth }.`);}// method 2function old1( person) {  var age = person.age,    yearOfBirth = 2018 - age,     name = person.name,    company = person.job.company;  console.log( `${ name } works at ${ company } and was born in ${ yearOfBirth }.`);} // method 3function es6({ age, name, job: {company}}) {  var yearOfBirth = 2018 - age;  console.log( `${ name } works at ${ company } and was born in ${ yearOfBirth }.`);} 

通過使用ES6,我們能提取出age,name,和 company,而不需要任何其他的變量聲明。

動態屬性名稱

ES6添加了使用動態分配的鍵創建或添加屬性的功能。

let city= 'sheffield_';let a = {  [ city + 'population' ]: 350000};a[ city + 'county' ] = 'South Yorkshire';console.log(a); // {sheffield_population: 350000, sheffield_county: 'South Yorkshire' }

箭頭函數

箭頭函數有兩個比較重要的特點: 他們的結構以及他們的this 指向

他們比傳統的函數有更簡單的結構因為他們不需要關鍵字function 而且他們可以自動返回在箭頭后面的一部分,無論箭頭后面的是什么。

var foo = function( a, b ) {  return a * b;} let bar = ( a, b ) => a * b;

如果函數有多于一個的計算式,可以使用花括號來包起來,然后函數返回塊作用域返回的任何內容。

箭頭函數一個最重要的用途之一就是應用在數組的相關函數中,像.map,.forEach,.sort等等。

let arr = [ 5, 6, 7, 8, 'a' ];let b = arr.map( item => item + 3 );console.log(b); // [ 8, 9, 10, 11, 'a3' ]

在擁有一個更短的表達方式的同時,箭頭函數還修復了有關于this綁定行為經常出現的問題。ES6之前解決這個問題通常是使用一個self變量來存儲這個指向。

var clickController = {  doSomething: function (..) {    var self = this;    btn.addEventListener(      'click',       function() { self.doSomething(..) },       False    );  } };

這個this的賦值是一定要做的,因為this的綁定是動態的。這就意味著this在eventlistener內部和在doSomething內部指的并不是同一個東西。

在箭頭函數內部,this的綁定是語義上的就是指當前的,而不是動態的。這也是箭頭函數的主要設計特點。

雖然這種詞法上的this很棒,但是有些時候,他卻不是我們想要的那樣。

let a = {  oneThing: ( a ) => {     let b = a * 2;     this.otherThing(b);  },   otherThing: ( b ) => {....} };a.oneThing(6);

當我們使用a.oneThing(6),  這個this.otherThing(6) 會拋出引用失敗的錯誤,因為this沒有指向對象a,而是指向了環境作用域。如果你正在使用ES6的代碼使用ES6的語法,這個是你需要注意的事情。

for...of loops (for...of循環)

ES6新添加了一種方式來迭代數組中的每個值,這個方式是與已經存在的for...in的通過索引的循環方式不同。

let a = ['a', 'b', 'c', 'd' ];// ES6 for ( var val of a ) {  console.log( val );} // "a" "b" "c" "d"// pre-ES6 for ( var idx in a ) {  console.log( idx );} // 0 1 2 3

使用新的for ... of循環,在每個循環內部保存了一個let val = a[idx]。

數組,字符串,generator以及從collection 在標準JavaScript中都是可迭代的。普通的對象無法正常的使用for...of來迭代,除非你自己定義一個迭代器。

Number Literals 數字字面量

ES5代碼很好處理了十進制和十六進制的數字格式,但并未指定八進制的格式。實際上,八進制在嚴格模式中是被禁止使用的。

ES6 添加了一個全新的格式,在最開始的0后面添加一個o來聲明一個八進制的數。與此同時,在es6中還添加了二進制格式。

Number( 29 ) // 29Number( 035 ) // 35 in old octal form. Number( 0o35 ) // 29 in new octal form Number( 0x1d ) // 29 in hexadecimal Number( 0b11101 ) // 29 in binary form

更多

ES6還提供了我們很多很多其他的方式來使我們的代碼更簡潔,更易讀,以及更穩定。我的目標時寫一篇這篇文章的延續,來包括一些ES6中不太知名的部分。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91探花福利精品国产自产在线| 欧洲成人性视频| 7777kkkk成人观看| 在线视频欧美日韩精品| 午夜精品三级视频福利| 色综合色综合网色综合| 国产精品揄拍一区二区| 国产亚洲精品成人av久久ww| 日韩欧美高清在线视频| 亚洲国产天堂久久综合网| 亚洲一区二区久久| 日韩在线视频中文字幕| 精品一区二区三区四区在线| 亚洲欧美中文日韩v在线观看| 欧美日韩精品国产| 亚洲美腿欧美激情另类| 在线视频日本亚洲性| 久久琪琪电影院| 欧亚精品中文字幕| 日韩电影在线观看永久视频免费网站| 国产在线视频欧美| 国产精品视频公开费视频| 亚洲欧美制服中文字幕| 欧美专区在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 午夜精品久久久99热福利| 在线成人激情视频| 久久亚洲精品网站| 欧美日韩福利在线观看| 欧美日韩国产一区在线| 亚洲天堂av高清| 欧美成人中文字幕| 欧美裸体视频网站| 亚洲第一免费播放区| 91国产中文字幕| 国产精品视频男人的天堂| 欧美极品美女视频网站在线观看免费| 97久久伊人激情网| 色播久久人人爽人人爽人人片视av| 草民午夜欧美限制a级福利片| 欧美日韩激情视频8区| 91亚洲国产精品| 亚洲人成电影网站色| 亚洲最大福利网| 亚洲高清在线观看| 日韩精品免费综合视频在线播放| 欧美剧在线观看| 精品国产依人香蕉在线精品| 欧美性猛交xxxxx免费看| 最近2019中文字幕mv免费看| 欧美日韩亚洲精品内裤| 91爱爱小视频k| 欧美精品电影免费在线观看| 国产欧美日韩丝袜精品一区| 成人免费在线视频网站| 久久99精品久久久久久琪琪| 91亚洲va在线va天堂va国| 欧美一区二区三区免费观看| 亚洲国产精品系列| 亚洲国产日韩欧美在线图片| 少妇激情综合网| 欧美在线性视频| 日韩av电影院| 97视频在线观看视频免费视频| 亚洲国产三级网| 欧美亚洲日本黄色| 亚洲aⅴ男人的天堂在线观看| 国产精品激情av在线播放| 久久国产精品网站| 日韩中文字幕在线视频| 欧美另类69精品久久久久9999| 91精品在线国产| 亚洲欧美日韩成人| 国产精品免费视频久久久| 亚洲一区二区久久久久久| 成人精品网站在线观看| 91国在线精品国内播放| 欧美日韩国产中文字幕| 精品国产91久久久久久老师| 亚洲精品国精品久久99热| 国产精品成人av在线| 8050国产精品久久久久久| 亚洲国内精品在线| 亚洲精选一区二区| 久久久久久综合网天天| 国产日韩欧美在线视频观看| 亚洲精品综合久久中文字幕| 欧美在线视频一二三| 国产精品观看在线亚洲人成网| 日韩久久免费视频| 一区二区三区国产在线观看| 精品国产鲁一鲁一区二区张丽| 永久免费精品影视网站| 日韩美女免费视频| 欧美中文在线字幕| 91欧美视频网站| 美女啪啪无遮挡免费久久网站| 久久久久久91香蕉国产| 欧美精品videofree1080p| 欧美激情视频一区二区三区不卡| 亚洲老司机av| 亚洲自拍偷拍在线| 精品露脸国产偷人在视频| 米奇精品一区二区三区在线观看| 91国产高清在线| 欧美精品性视频| 一区二区三区 在线观看视| 亚洲精品免费网站| 欧美成人在线网站| 久久久中文字幕| 57pao成人永久免费视频| 国自产精品手机在线观看视频| 欧美大片在线影院| 亚洲欧美综合精品久久成人| 欧美一级电影免费在线观看| 国产精品美女www爽爽爽视频| 成人淫片在线看| 黄色成人av在线| 欧美激情xxxx| 最近2019中文字幕第三页视频| 丁香五六月婷婷久久激情| 久久激情五月丁香伊人| 亚洲成人xxx| 国产精品青青在线观看爽香蕉| 中文字幕精品网| 日韩免费av片在线观看| 国产视频精品一区二区三区| 日韩在线观看精品| 91中文字幕在线| 91po在线观看91精品国产性色| 亚洲午夜激情免费视频| 日韩免费在线视频| 精品美女国产在线| 69av视频在线播放| 久久在线免费观看视频| 日韩色av导航| 色综合91久久精品中文字幕| 国内精品久久久久久久久| 欧美高清理论片| 欧美成人sm免费视频| 久久久亚洲精选| 国产一区在线播放| 国产亚洲一级高清| 欧美日韩国产中字| 亚洲欧美国产精品久久久久久久| 成人黄色免费在线观看| 国产精品久久久久免费a∨大胸| 性色av一区二区三区在线观看| 亚洲影院色无极综合| 亚洲精品国产精品国自产观看浪潮| 久久精品国产成人| 中文字幕自拍vr一区二区三区| 日韩综合中文字幕| 亚洲理论电影网| 97在线免费观看视频| 国产日韩视频在线观看| 欧美成人免费全部| 亚洲已满18点击进入在线看片| 91爱视频在线| 精品国产91乱高清在线观看| 精品国产一区二区三区久久狼黑人| 国产精品免费久久久久久| 亚洲已满18点击进入在线看片| 高清亚洲成在人网站天堂|