摘要:所以,當(dāng)函數(shù)傳參為時(shí),短路操作符會(huì)給定默認(rèn)值。對于來說,無論是否在嚴(yán)格模式下,更改參數(shù)值的行為都不會(huì)同步更改對象。且箭頭函數(shù)中的值無法改變而非箭頭函數(shù)也正因?yàn)槿绱?,箭頭函數(shù)無法作為構(gòu)造函數(shù),因?yàn)橹禑o法綁定至構(gòu)造函數(shù)的實(shí)例。
如同我們所看到的,ES6 中引入來箭頭函數(shù),相比 ES5 來講是最為直觀而明顯的特性。
在 ES6 之前,聲明一個(gè)函數(shù):
function add(a, b) { return a + b; } add(1, 2); // 3
如果用箭頭函數(shù)的形式寫:
const add = (a, b) => a + b; add(1, 2); // 3
計(jì)算圓面積的例子:
const square = (r) => { const PI = 3.14; return PI*r*r; } square(4);
形式上的改變僅僅是一部分,接下來關(guān)注一個(gè)很有用的特性:默認(rèn)值。
默認(rèn)值在 ES6 之前,函數(shù)內(nèi)給定參數(shù)的默認(rèn)值,只能這樣:
function add(a, b) { console.log(arguments[0]); a = a || 2000; b = b || 333; return a + b; } add(); // 2333
但是此方案遇到 boolean 為 false 的 js 值無法工作,例如:
add(0); // 2333
顯然,結(jié)果錯(cuò)誤。運(yùn)算中 a 仍舊采用了默認(rèn)值。
所以,當(dāng)函數(shù)傳參為 null, undefined, "", 0, -0, NaN 時(shí),短路操作符 || 會(huì)給定默認(rèn)值。
修訂版成了這樣:
function add(a, b) { a = (typeof a !== "undefined") ? a : 2000; b = (typeof b !== "undefined") ? b : 333; return a + b; } add(0); // 333
而在 ES6 中,只需要給參數(shù)直接賦予默認(rèn)值即可:
const add = (a = 2000, b = 333) => a + b; add(); // 2333 add(0); // 333默認(rèn)值對 arguments 的影響
在 ES5 中:
function add(a, b) { console.log(arguments.length); console.log(a === arguments[0]); console.log(b === arguments[1]); a = 200; b = 33; console.log(a === arguments[0]); console.log(b === arguments[1]); } add(1, 2); // 2 // true // true // true // true
如果在嚴(yán)格模式下運(yùn)行,結(jié)果是這樣的:
function add(a, b) { "use strict"; console.log(arguments.length); console.log(a === arguments[0]); console.log(b === arguments[1]); a = 200; b = 33; console.log(a === arguments[0]); console.log(b === arguments[1]); } add(1, 2); // 2 // true // true // false // false
在 ES5 中的非嚴(yán)格模式下,更改參數(shù)值將會(huì)同步的更改 arguments 對象內(nèi)的參數(shù)值,而在嚴(yán)格模式下不會(huì)更改。
對于 ES6 來說,無論是否在嚴(yán)格模式下,更改參數(shù)值的行為都不會(huì)同步更改 arguments 對象。
function add(a = 2000, b = 333) { console.log(arguments.length); console.log(a === arguments[0]); console.log(b === arguments[1]); a = 200; b = 33; console.log(a === arguments[0]); console.log(b === arguments[1]); } add(0); // 1 // true // false // false // false
再來看個(gè)例子:
const add = (a = 2000, b = 333) => { console.log(arguments.length); console.log(a === arguments[0]); console.log(b === arguments[1]); a = 200; b = 33; console.log(a === arguments[0]); console.log(b === arguments[1]); } add(0); // Uncaught ReferenceError: arguments is not defined
另外需要注意的點(diǎn)是,箭頭函數(shù)沒有自己的 arguments 對象。但它可以訪問外圍函數(shù)的 arguments 對象:
function add(a = 2000, b = 333) { return (() => arguments[0] + arguments[1])(); } add(); // NaN add(200, 33); // 233this
在 ES6 的箭頭函數(shù)中,this 值總是綁定到函數(shù)的定義:
const obj = { name: "Rainy", say: function () { setTimeout(() => { console.log(`I"m ${this.name}`); }) } } obj.say(); // I"m Rainy
而如果是普通函數(shù),由于 setTimeout 函數(shù)內(nèi)的 this 指向 window,所以找不到 name 值:
const obj = { name: "Rainy", say: function () { setTimeout(function () { console.log(`I"m ${this.name}`); }) } } obj.say(); // I"m
可以將箭頭函數(shù)的該行為看作:
const obj = { name: "Rainy", say: function () { const self = this; setTimeout(function () { console.log(`I"m ${self.name}`); }) } } obj.say(); // I"m Rainy
實(shí)際上這是由于箭頭函數(shù)本身沒有 this,其中的 this 實(shí)際上是外部函數(shù)的 this 綁定。
且箭頭函數(shù)中的 this 值無法改變:
const obj = { name: "Rainy", say: function () { setTimeout((() => console.log(`I"m ${this.name}`)).bind({name: "Null"})) } } obj.say(); // I"m Rainy
而非箭頭函數(shù):
const obj = { name: "Rainy", say: function () { setTimeout((function () {console.log(`I"m ${this.name}`)}).bind({name: "Null"})) } } obj.say(); // I"m Null
也正因?yàn)槿绱?,箭頭函數(shù)無法作為構(gòu)造函數(shù),因?yàn)?this 值無法綁定至構(gòu)造函數(shù)的實(shí)例。
參考《深入理解 ES6》
《實(shí)戰(zhàn) ES2015》
MDN
-EOF-
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94952.html
摘要:在之前,中沒有常量聲明方式,有的僅僅是一種命名上的約定。這樣就可以最大程度上規(guī)避變量的意外變化來使程序發(fā)生異常的可能性。為了避免作用域的污染,在中需要使用一個(gè)立即執(zhí)行函數(shù)來確保變量的作用域范圍。 在 ES6 之前,JS 中沒有常量聲明方式,有的僅僅是一種命名上的約定。 var PI = 3.14; PI = 4; console.log(PI); // 4 我們用大寫變量名來標(biāo)識(shí)這是一...
摘要:以下,請求兩個(gè),當(dāng)兩個(gè)異步請求返還結(jié)果后,再請求第三個(gè)此處為調(diào)用后的結(jié)果的數(shù)組對于來說,只要參數(shù)數(shù)組有一個(gè)元素變?yōu)闆Q定態(tài),便返回新的。 showImg(https://segmentfault.com/img/remote/1460000015444020); Promise 札記 研究 Promise 的動(dòng)機(jī)大體有以下幾點(diǎn): 對其 api 的不熟悉以及對實(shí)現(xiàn)機(jī)制的好奇; 很多庫(比...
摘要:在年正式發(fā)布了,簡稱,又稱為。再次簡寫循環(huán)迭代數(shù)組每個(gè)元素都執(zhí)行一次回調(diào)函數(shù)。方法用于調(diào)用數(shù)組的每個(gè)元素,并將元素傳遞給回調(diào)函數(shù)。注意對于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。 轉(zhuǎn)載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關(guān)系。ECMA是標(biāo)準(zhǔn),Jav...
摘要:在年正式發(fā)布了,簡稱,又稱為。再次簡寫循環(huán)迭代數(shù)組每個(gè)元素都執(zhí)行一次回調(diào)函數(shù)。方法用于調(diào)用數(shù)組的每個(gè)元素,并將元素傳遞給回調(diào)函數(shù)。注意對于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的。 轉(zhuǎn)載請注明出處 原文連接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的關(guān)系。ECMA是標(biāo)準(zhǔn),Jav...
一、語法規(guī)則 選擇器{ 屬性1:屬性值1; 屬性2:屬性值2; ...... } /*注釋*/ 二、如何在html中應(yīng)用CSS 1. 外部引用css文件 css文件:css/layout.css(css文件夾和HTML位于同一個(gè)目錄下) 2. 內(nèi)部嵌入css /*css代碼*/ 3...
閱讀 2043·2021-11-11 16:54
閱讀 2121·2019-08-30 15:55
閱讀 3621·2019-08-30 15:54
閱讀 398·2019-08-30 15:44
閱讀 2239·2019-08-30 10:58
閱讀 431·2019-08-26 10:30
閱讀 3055·2019-08-23 14:46
閱讀 3204·2019-08-23 13:46