ES6-數(shù)值的擴(kuò)展-和-函數(shù)的擴(kuò)展

此文包含數(shù)值的擴(kuò)展响迂、函數(shù)的擴(kuò)展热监,總結(jié)了一些我認(rèn)為有可能會(huì)用到的堪置,而去除了一些稍稍復(fù)雜一時(shí)難以去學(xué)習(xí)理解且目前不想去研究去總結(jié)的知識(shí)點(diǎn)呼胚。


一茄唐、數(shù)值的擴(kuò)展

0.二進(jìn)制和八進(jìn)制表示法

ES6 提供了二進(jìn)制和八進(jìn)制數(shù)值的新的寫(xiě)法,分別用前綴0b(或0B)和0o(或0O)表示蝇更。

1.Number.isFinite(), Number.isNaN()

S6 在Number對(duì)象上沪编,新提供了Number.isFinite()Number.isNaN()兩個(gè)方法呼盆。
Number.isFinite()用來(lái)檢查一個(gè)數(shù)值是否為有限的(finite),即不是Infinity漾抬。Number.isNaN()用來(lái)檢查一個(gè)值是否為NaN宿亡。

2.Number.parseInt(), Number.parseFloat()

ES6 將全局方法parseInt()和parseFloat(),移植到Number對(duì)象上面纳令,行為完全保持不變挽荠。這樣做的目的,是逐步減少全局性方法平绩,使得語(yǔ)言逐步模塊化圈匆。

3.Number.isInteger()

Number.isInteger()用來(lái)判斷一個(gè)數(shù)值是否為整數(shù)。

4.Math 對(duì)象的擴(kuò)展
0??捏雌、Math.trunc()

Math.trunc方法用于去除一個(gè)數(shù)的小數(shù)部分跃赚,返回整數(shù)部分。也就是說(shuō)正數(shù)的話相當(dāng)于Math.floor方法性湿,負(fù)數(shù)的話相當(dāng)于Math.ceil方法纬傲。

1??、Math.sign()

Math.sign方法用來(lái)判斷一個(gè)數(shù)到底是正數(shù)肤频、負(fù)數(shù)叹括、還是零。對(duì)于非數(shù)值宵荒,會(huì)先將其轉(zhuǎn)換為數(shù)值汁雷。

2??、雙曲函數(shù)方法

ES6 新增了 6 個(gè)雙曲函數(shù)方法报咳。
Math.sinh(x)返回x的雙曲正弦(hyperbolic sine)
Math.cosh(x)返回x的雙曲余弦(hyperbolic cosine)
Math.tanh(x)返回x的雙曲正切(hyperbolic tangent)
Math.asinh(x)返回x的反雙曲正弦(inverse hyperbolic sine)
Math.acosh(x)返回x的反雙曲余弦(inverse hyperbolic cosine)
Math.atanh(x)返回x的反雙曲正切(inverse hyperbolic tangent)

5.指數(shù)運(yùn)算符

ES2016 新增了一個(gè)指數(shù)運(yùn)算符()侠讯,需要注意的是:這個(gè)運(yùn)算符的一個(gè)特點(diǎn)是右結(jié)合,而不是常見(jiàn)的左結(jié)合暑刃。多個(gè)指數(shù)運(yùn)算符連用時(shí)厢漩,是從最右邊開(kāi)始計(jì)算的。
例如:2 ** 3 ** 2 相當(dāng)于2
(3**2)=2的9次方 = 512


二岩臣、函數(shù)的擴(kuò)展

0.函數(shù)參數(shù)的默認(rèn)值
0??袁翁、基本用法

ES6 之前,不能直接為函數(shù)的參數(shù)指定默認(rèn)值婿脸,只能采用變通的方法粱胜。ES6 允許為函數(shù)的參數(shù)設(shè)置默認(rèn)值,即直接寫(xiě)在參數(shù)定義的后面狐树。且注意:參數(shù)變量是默認(rèn)聲明的焙压,所以不能用letconst再次聲明。

1??、與解構(gòu)賦值默認(rèn)值結(jié)合使用 §
2??涯曲、參數(shù)默認(rèn)值的位置

通常情況下野哭,定義了默認(rèn)值的參數(shù),應(yīng)該是函數(shù)的尾參數(shù)幻件。因?yàn)檫@樣比較容易看出來(lái)拨黔,到底省略了哪些參數(shù)。

3??绰沥、函數(shù)的 length 屬性

指定了默認(rèn)值以后篱蝇,函數(shù)的length屬性,將返回沒(méi)有指定默認(rèn)值的參數(shù)個(gè)數(shù)徽曲。也就是說(shuō)零截,指定了默認(rèn)值后,length屬性將失真秃臣。即:函數(shù)length屬性的返回值涧衙,等于函數(shù)的參數(shù)個(gè)數(shù)減去指定了默認(rèn)值的參數(shù)個(gè)數(shù)。
特別注意:如果設(shè)置了默認(rèn)值的參數(shù)不是尾參數(shù)奥此,那么length屬性也不再計(jì)入后面的參數(shù)了弧哎。

4??、作用域
ar x = 1;

function f(x, y = x) {
  console.log(y);
}

f(2) // 2

上面代碼中稚虎,參數(shù)y的默認(rèn)值等于變量x撤嫩。調(diào)用函數(shù)f時(shí),參數(shù)形成一個(gè)單獨(dú)的作用域祥绞。在這個(gè)作用域里面非洲,默認(rèn)值變量x指向第一個(gè)參數(shù)x鸭限,而不是全局變量x蜕径,所以輸出是2。

5??败京、應(yīng)用

利用參數(shù)默認(rèn)值兜喻,可以指定某一個(gè)參數(shù)不得省略,如果省略就拋出一個(gè)錯(cuò)誤赡麦。

1.rest 參數(shù)

ES6 引入 rest 參數(shù)(形式為...變量名)朴皆,用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了泛粹。rest 參數(shù)搭配的變量是一個(gè)數(shù)組遂铡,該變量將多余的參數(shù)放入數(shù)組中。

function add(...values) {
  let sum = 0;

  for (var val of values) {
    sum += val;
  }

  return sum;
}

add(2, 5, 3) // 10

下面是一個(gè) rest 參數(shù)代替arguments變量的例子晶姊。

// arguments變量的寫(xiě)法
function sortNumbers() {
  return Array.prototype.slice.call(arguments).sort();
}

// rest參數(shù)的寫(xiě)法
const sortNumbers = (...numbers) => numbers.sort();

注意扒接,rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個(gè)參數(shù)),否則會(huì)報(bào)錯(cuò)。

// 報(bào)錯(cuò)
function f(a, ...b, c) {
  // ...
}

函數(shù)的length屬性钾怔,不包括 rest 參數(shù)碱呼。

2.嚴(yán)格模式

從 ES5 開(kāi)始,函數(shù)內(nèi)部可以設(shè)定為嚴(yán)格模式宗侦。ES2016 做了一點(diǎn)修改愚臀,規(guī)定只要函數(shù)參數(shù)使用了默認(rèn)值解構(gòu)賦值矾利、或者擴(kuò)展運(yùn)算符姑裂,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式,否則會(huì)報(bào)錯(cuò)梦皮。
原因是:函數(shù)內(nèi)部嚴(yán)格模式炭分,同時(shí)適用函數(shù)體和函數(shù)參數(shù),而在執(zhí)行的時(shí)候先執(zhí)行的是參數(shù)剑肯,而在函數(shù)體內(nèi)才知道是不是嚴(yán)格模式捧毛,這樣是不合理的。

兩種方法可以規(guī)避這種限制让网。第一種是設(shè)定全局性的嚴(yán)格模式呀忧,這是合法的。

'use strict';

function doSomething(a, b = a) {
  // code
}

第二種是把函數(shù)包在一個(gè)無(wú)參數(shù)的立即執(zhí)行函數(shù)里面溃睹。

const doSomething = (function () {
  'use strict';
  return function(value = 42) {
    return value;
  };
}());
3.箭頭函數(shù)
  • 如果箭頭函數(shù)的代碼塊部分多于一條語(yǔ)句而账,就要使用大括號(hào)將它們括起來(lái),并且使用return語(yǔ)句返回因篇。
  • 由于大括號(hào)被解釋為代碼塊泞辐,所以如果箭頭函數(shù)直接返回一個(gè)對(duì)象,必須在對(duì)象外面加上括號(hào)竞滓,否則會(huì)報(bào)錯(cuò)咐吼。
  • 箭頭函數(shù)的一個(gè)用處是簡(jiǎn)化回調(diào)函數(shù)。
  • 函數(shù)體內(nèi)的this對(duì)象商佑,就是定義時(shí)所在的對(duì)象锯茄,而不是使用時(shí)所在的對(duì)象。
  • 不可以當(dāng)作構(gòu)造函數(shù)茶没,也就是說(shuō)肌幽,不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤抓半。
  • 不可以使用arguments對(duì)象喂急,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用笛求,可以用 rest 參數(shù)代替廊移。
  • 不可以使用yield命令讥蔽,因此箭頭函數(shù)不能用作 Generator 函數(shù)。

關(guān)于this作用域的問(wèn)題画机,下面給出一個(gè)例子:

function Timer() {
  this.s1 = 0;
  this.s2 = 0;
  // 箭頭函數(shù)
  setInterval(() => this.s1++, 1000);
  // 普通函數(shù)
  setInterval(function () {
    this.s2++;
  }, 1000);
}

var timer = new Timer();

setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
// s1: 3
// s2: 0

解析:上面代碼中,Timer函數(shù)內(nèi)部設(shè)置了兩個(gè)定時(shí)器步氏,分別使用了箭頭函數(shù)和普通函數(shù)。前者的this綁定定義時(shí)所在的作用域(即Timer函數(shù))荚醒,后者的this指向運(yùn)行時(shí)所在的作用域(即全局對(duì)象)。所以界阁,3100 毫秒之后,timer.s1被更新了 3 次泡躯,而timer.s2一次都沒(méi)更新贮竟。
再來(lái)一個(gè)例子:

var handler = {
  id: '123456',

  init: function() {
    document.addEventListener('click',
      event => this.doSomething(event.type), false);
  },

  doSomething: function(type) {
    console.log('Handling ' + type  + ' for ' + this.id);
  }
};

上面代碼的init方法中咕别,使用了箭頭函數(shù),這導(dǎo)致這個(gè)箭頭函數(shù)里面的this惰拱,總是指向handler對(duì)象。否則啊送,回調(diào)函數(shù)運(yùn)行時(shí),this.doSomething這一行會(huì)報(bào)錯(cuò)馋没,因?yàn)榇藭r(shí)this指向document對(duì)象。
接著來(lái)一個(gè)例子披泪,請(qǐng)問(wèn)下面的代碼之中有幾個(gè)this搬瑰?

function foo() {
  return () => {
    return () => {
      return () => {
        console.log('id:', this.id);
      };
    };
  };
}

var f = foo.call({id: 1});

var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

上面代碼之中,只有一個(gè)this泽论,就是函數(shù)foo的this艾少,所以t1、t2翼悴、t3都輸出同樣的結(jié)果缚够。因?yàn)樗械膬?nèi)層函數(shù)都是箭頭函數(shù)幔妨,都沒(méi)有自己的this,它們的this其實(shí)都是最外層foo函數(shù)的this.

長(zhǎng)期以來(lái)谍椅,JavaScript 語(yǔ)言的this對(duì)象一直是一個(gè)令人頭痛的問(wèn)題误堡,在對(duì)象方法中使用this,必須非常小心雏吭。箭頭函數(shù)”綁定”this锁施,很大程度上解決了這個(gè)困擾。

不適用場(chǎng)合

由于箭頭函數(shù)使得this從“動(dòng)態(tài)”變成“靜態(tài)”杖们,下面兩個(gè)場(chǎng)合不應(yīng)該使用箭頭函數(shù)。
第一個(gè)場(chǎng)合是定義函數(shù)的方法,且該方法內(nèi)部包括this簿透。

const cat = {
  lives: 9,
  jumps: () => {
    this.lives--;
  }
}

上面代碼中羹令,cat.jumps()方法是一個(gè)箭頭函數(shù),這是錯(cuò)誤的孝治。調(diào)用cat.jumps()時(shí)列粪,如果是普通函數(shù),該方法內(nèi)部的this指向cat谈飒;如果寫(xiě)成上面那樣的箭頭函數(shù)篱竭,使得this指向全局對(duì)象,因此不會(huì)得到預(yù)期結(jié)果步绸。

第二個(gè)場(chǎng)合是需要?jiǎng)討B(tài)this的時(shí)候掺逼,也不應(yīng)使用箭頭函數(shù)。

var button = document.getElementById('press');
button.addEventListener('click', () => {
  this.classList.toggle('on');
});

上面代碼運(yùn)行時(shí)瓤介,點(diǎn)擊按鈕會(huì)報(bào)錯(cuò)吕喘,因?yàn)閎utton的監(jiān)聽(tīng)函數(shù)是一個(gè)箭頭函數(shù),導(dǎo)致里面的this就是全局對(duì)象刑桑。如果改成普通函數(shù)氯质,this就會(huì)動(dòng)態(tài)指向被點(diǎn)擊的按鈕對(duì)象。

另外祠斧,如果函數(shù)體很復(fù)雜闻察,有許多行,或者函數(shù)內(nèi)部有大量的讀寫(xiě)操作琢锋,不單純是為了計(jì)算值辕漂,這時(shí)也不應(yīng)該使用箭頭函數(shù),而是要使用普通函數(shù)吴超,這樣可以提高代碼可讀性钉嘹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鲸阻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陈辱,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鹏浅,居然都是意外死亡隐砸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門褪那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)博敬,“玉大人偏窝,你說(shuō)我怎么就攤上這事武学。” “怎么了硼补?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵已骇,是天一觀的道長(zhǎng)褪储。 經(jīng)常有香客問(wèn)我乱豆,道長(zhǎng)吊趾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任揩尸,我火速辦了婚禮岩榆,結(jié)果婚禮上勇边,老公的妹妹穿的比我還像新娘折联。我一直安慰自己,他們只是感情好奕坟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布月杉。 她就那樣靜靜地躺著苛萎,像睡著了一般首懈。 火紅的嫁衣襯著肌膚如雪谨敛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天最仑,我揣著相機(jī)與錄音泥彤,去河邊找鬼卿啡。 笑死颈娜,一個(gè)胖子當(dāng)著我的面吹牛浙宜,可吹牛的內(nèi)容都是我干的蛹磺。 我是一名探鬼主播萤捆,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼市怎!你這毒婦竟也來(lái)了焰轻?” 一聲冷哼從身側(cè)響起辱志,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狞膘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后已球,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體智亮,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阔蛉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年状原,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苗踪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毕莱,死狀恐怖蛹稍,靈堂內(nèi)的尸體忽然破棺而出质和,到底是詐尸還是另有隱情稚字,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布瘫想,位于F島的核電站国夜,受9級(jí)特大地震影響车吹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窄驹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一乐埠、第九天 我趴在偏房一處隱蔽的房頂上張望囚企。 院中可真熱鬧龙宏,春花似錦、人聲如沸歹河。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)键菱。三九已至,卻和暖如春拭抬,著一層夾襖步出監(jiān)牢的瞬間侵蒙,已是汗流浹背纷闺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工犁功, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人署鸡。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓靴庆,卻偏偏與公主長(zhǎng)得像怒医,于是被迫代替她去往敵國(guó)和親裆熙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子入录,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前僚稿,不能直接為函數(shù)的參數(shù)指定默認(rèn)值蚀同,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,382評(píng)論 0 1
  • 前面的話 函數(shù)是所有編程語(yǔ)言的重要組成部分,在ES6出現(xiàn)前刹孔,JS的函數(shù)語(yǔ)法一直沒(méi)有太大的變化,從而遺留了很多問(wèn)題卦睹,...
    CodeMT閱讀 825評(píng)論 0 1
  • [TOC] 參考阮一峰的ECMAScript 6 入門參考深入淺出ES6 let和const let和const都...
    郭子web閱讀 1,781評(píng)論 0 1
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前障斋,不能直接為函數(shù)的參數(shù)指定默認(rèn)值垃环,只能采用變通的方法。 上面代碼檢查函數(shù)l...
    陳老板_閱讀 449評(píng)論 0 1
  • 她以前可漂亮了晴裹。 后來(lái)呢救赐? 她得癌癥了经磅,不能生育钮追。 后來(lái)呢? 她每天最幸福的事轧叽,就是傍晚時(shí)聽(tīng)到她老...
    七弦上閱讀 240評(píng)論 0 0