摘要:學習筆記函數擴展函數參數的默認值如果參數默認值是變量,那么參數就不是傳值的,而是每次都重新計算默認值表達式的值。屬性函數的屬性,返回該函數的函數名。箭頭函數詳細鏈接參考引用函數擴展
es6學習筆記-函數擴展_v1.0 函數參數的默認值
function Point(x = 0, y = 0) { this.x = x; this.y = y; } var p = new Point(); console.log(p) // { x: 0, y: 0 }
如果參數默認值是變量,那么參數就不是傳值的,而是每次都重新計算默認值表達式的值。也就是說,參數默認值是惰性求值的。
let x = 99; function foo(p = x + 1) { console.log(p); } foo() // 100 x = 100; foo() // 101與解構賦值默認值結合使用
function foo({x, y = 5}) { console.log(x, y); } foo({}) // undefined, 5,觸發默認值 foo({x: 1}) // 1, 5 ,觸發默認值 foo({x: 1, y: 2}) // 1, 2 //因為參數是一個對象,對象之后才會解析x y參數 foo() // TypeError: Cannot read property "x" of undefined
//雙重默認值,第一重是對象默認值,第二重是對象里面的屬性的默認值 function fetch(url, { method = "GET" } = {}) { console.log(method); } //當觸發兩重的默認值的時候,會使用最里面的默認值 fetch("http://example.com") // "GET"
function foo(x = 5, y = 6) { console.log(x, y); } //undefiend會觸發默認值,null則不會 foo(undefined, null) // 5 null函數的 length 屬性
指定了默認值以后,函數的length屬性,將返回沒有指定默認值的參數個數。也就是說,指定了默認值后,length屬性將失真。
console.log((function (a) {}).length) // 1 console.log((function (a = 5) {}).length) // 0 console.log((function (a, b, c = 5) {}).length) // 2作用域
一旦設置了參數的默認值,函數進行聲明初始化時,參數會形成一個多帶帶的作用域(context)。等到初始化結束,這個作用域就會消失。這種語法行為,在不設置參數默認值時,是不會出現的。
var x = 1; //即使x=1,但是沒有影響里面的值 function f(x, y = x) { console.log(y); } f(2) // 2 //--------------------------- let x = 1; //同理,不過這里是函數里面設置了x值來測試 function f(y = x) { let x = 2; console.log(y); } f() // 1
如果參數的默認值是一個函數,該函數的作用域也遵守這個規則
let foo = "outer"; //設置了一個默認值func,是一個匿名函數,匿名函數返回的是foo變量 //這個變量指向的是外部的foo,因為默認值形成的多帶帶作用域沒有foo,所以會向上層繼續找 function bar(func = x => foo) { let foo = "inner"; console.log(func()); // outer } //觸發默認值,所以輸出 bar();
var x = 1; //y的默認值是一個匿名函數,并且里面設置了x=2, //這個x是指向參數里的x,他們屬于同一個多帶帶的作用域(默認值生成的) function foo(x, y = function() { x = 2; }) { var x = 3; y();//執行y后并沒有改變內部函數的x console.log(x);//所以輸出3 } foo() // 3 console.log(x) // 1,x沒有變化,所以是1應用
參數的默認值不是在定義時執行,而是在運行時執行(即如果參數已經賦值,默認值中的函數就不會運行)
//參數默認值設為undefined,表明這個參數是可以省略的。 function foo(optional = undefined) { ··· }rest參數
ES6 引入 rest 參數(形式為“...變量名”),用于獲取函數的多余參數,這樣就不需要使用arguments對象了。rest 參數搭配的變量是一個數組,該變量將多余的參數放入數組中。
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } //自動獲取了其他參數 console.log(add(2, 5, 3)) // 10
// arguments變量的寫法 function sortNumbers() { return Array.prototype.slice.call(arguments).sort(); } // rest參數的寫法 const sortNumbers = (...numbers) => numbers.sort();
function push(array, ...items) {//...的是數組 items.forEach(function(item) {//支持數組的方法forEach array.push(item); console.log(item); }); } var a = []; push(a, 1, 2, 3)擴展運算符
擴展運算符(spread)是三個點(...)。它好比 rest 參數的逆運算,將一個數組轉為用逗號分隔的參數序列。(輸出結果并沒有使用逗號分隔)
console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5替代數組的apply方法
由于擴展運算符可以展開數組,所以不再需要apply方法,將數組轉為函數的參數了。
// ES5的寫法 function f(x, y, z) { // ... } var args = [0, 1, 2]; f.apply(null, args); // ES6的寫法 function f(x, y, z) { // ... } var args = [0, 1, 2]; f(...args);
// ES5的寫法 Math.max.apply(null, [14, 3, 77]) // ES6的寫法 Math.max(...[14, 3, 77]) // 等同于 Math.max(14, 3, 77);擴展運算符的應用
(1)合并數組
var arr1 = ["a", "b"]; var arr2 = ["c"]; var arr3 = ["d", "e"]; // ES5的合并數組 console.log(arr1.concat(arr2, arr3)); // [ "a", "b", "c", "d", "e" ] // ES6的合并數組 console.log([...arr1, ...arr2, ...arr3]) // [ "a", "b", "c", "d", "e" ]
(2)與解構賦值結合
const [first, ...rest] = [1, 2, 3, 4, 5]; //位置是對應的 console.log(first) // 1 console.log(rest) // [2, 3, 4, 5] const [first, ...rest] = []; //當沒有參數的時候,rest參數能夠獲取空數組 console.log(first) // undefined console.log(rest) // []: const [first, ...rest] = ["foo"]; //有參數的時候,按順序 console.log(first) // "foo" console.log(rest) // []
(3)函數的返回值
直接返回多個值
var dateFields = [1,2,3,4,5]; var d = test(...dateFields); function test(x,y,z,a,b) { console.log(x); console.log(y); console.log(z); console.log(a); console.log(b); } d;
(4)字符串
將字符串轉為數組
[..."hello"] // [ "h", "e", "l", "l", "o" ]
(5)實現了Iterator接口的對象
任何Iterator接口的對象,都可以用擴展運算符轉為真正的數組。
在ES6中,有三類數據結構原生具備Iterator接口:數組、某些類似數組的對象、Set和Map結構,但是其他數據結構并沒有(主要是對象),需要自己手動設置
(6)Map和Set結構,Generator函數
擴展運算符內部調用的是數據結構的Iterator接口,因此只要具有Iterator接口的對象,都可以使用擴展運算符,比如Map結構。
ECMAScript 2016標準》做了一點修改,規定只要函數參數使用了默認值、解構賦值、或者擴展運算符,那么函數內部就不能顯式設定為嚴格模式,否則會報錯。
name 屬性函數的name屬性,返回該函數的函數名。
箭頭函數詳細鏈接
參考引用:
es6函數擴展
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82116.html
摘要:考慮到環境導致的行為差異太大,應該避免在塊級作用域內聲明函數。函數聲明語句函數表達式循環循環還有一個特別之處,就是循環語句部分是一個父作用域,而循環體內部是一個單獨的子作用域。聲明一個只讀的常量。 es6學習筆記-let,const和塊級作用域_v1.0 塊級作用域 javascript 原來是沒有塊級作用域的,只有全局作用域和函數作用域 例子1 因為沒有塊級作用域,所以每次的i都是一...
摘要:學習筆記數值的擴展有一些不常用或者還不支持的就沒有記錄了總體來說本篇只是一個備忘而已用來檢查一個數值是否為有限的。兩個新方法只對數值有效,非數值一律返回。參考引用數值擴展 es6學習筆記-數值的擴展 有一些不常用或者還不支持的就沒有記錄了,總體來說本篇只是一個備忘而已 Number.isFinite(), Number.isNaN() Number.isFinite()用來檢查一個數值...
摘要:學習筆記字符串的擴展字符的表示法允許使用的形式表示一個字符,但在之前,單個碼點僅支持到,超出該范圍的必須用雙字節形式表示,否則會解析錯誤。返回布爾值,表示參數字符串是否在源字符串的頭部。,是引入了字符串補全長度的功能。 es6學習筆記-字符串的擴展_v1.0 字符的Unicode表示法 JavaScript 允許使用uxxxx的形式表示一個字符,但在 ES6 之前,單個碼點僅支持u00...
摘要:學習筆記字符串模板實例模板編譯先組成一個模板使用放置代碼使用輸出表達式。這被稱為標簽模板功能。該數組的成員與數組完全一致參考引用字符串擴展 es6學習筆記-字符串模板_v1.0 實例:模板編譯 //先組成一個模板 var template = ` //使用放置JavaScript代碼 //使用輸出JavaScript表達式。 `; //這是編譯模板的函數,將模...
摘要:學習筆記頂層對象雖然是筆記但是基本是抄了一次大師的文章了頂層對象頂層對象,在瀏覽器環境指的是對象,在指的是對象。之中,頂層對象的屬性與全局變量是等價的。的寫法模塊的寫法上面代碼將頂層對象放入變量。參考引用頂層對象實戰 es6學習筆記-頂層對象_v1.0 (雖然是筆記,但是基本是抄了一次ruan大師的文章了) 頂層對象 頂層對象,在瀏覽器環境指的是window對象,在Node指的是gl...
閱讀 775·2023-04-25 16:55
閱讀 2806·2021-10-11 10:59
閱讀 2070·2021-09-09 11:38
閱讀 1782·2021-09-03 10:40
閱讀 1485·2019-08-30 15:52
閱讀 1125·2019-08-30 15:52
閱讀 954·2019-08-29 15:33
閱讀 3494·2019-08-29 11:26