gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

es6有沒有arguments

es6有arguments,但箭頭函數是不識別arguments的,所以用rest(剩余參數)來取代arguments;剩余參數直接就固定到數組里了,而arguments是類數組(本質是個對象),還需要轉換。剩余參數語法允許將一個不定數量的參數表示為一個數組,不定參數定義方式,這種方式很方便的去聲明不知道參數情況下的一個函數。

es6有沒有arguments

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

一、arguments用法

1. 說明

es6中箭頭函數是不識別arguments的。所以用rest來取代arguments。

ES6之后,都用剩余參數代替arguments了,剩余參數直接就固定到數組里了,而arguments是類數組(本質是個對象),還需要轉換。

2. arguments的常用操作

(1). 獲取參數長度

(2). 根據索引獲取參數

(3). 獲取當前arguments所在的函數

代碼分享:

{   console.log("----------------1. arguments常用操作-------------------");   function Test1() {     // arguments長什么樣?---本質是一個對象     // {     //     '0': 1,     //     '1': 2,     //     '2': 3,     //     '3': 4,     //     '4': 5,     //     '5': 6,     //     '6': 7,     //     '7': 8     //   }     console.log(arguments);      // 常見的對arguments的操作是三個     // 1.獲取參數的長度     console.log(arguments.length);      // 2.根據索引值獲取某一個參數     console.log(arguments[0]);     console.log(arguments[1]);     console.log(arguments[2]);      // 3.callee獲取當前arguments所在的函數     console.log(arguments.callee);   }    //調用   Test1(1, 2, 3, 4, 5, 6, 7, 8); }
登錄后復制

3. 將arguments轉換成數組

{   console.log("----------------2. 將arguments轉換成數組-------------------");   function Test2() {     // 方案1-自己遍歷     {       let newArray = [];       for (let i = 0; i < arguments.length; i++) {         newArray.push(arguments[i]);       }       console.log(newArray);     }     // 方案2-Array.prototype.slice將arguments轉成array     {       let newArray2 = Array.prototype.slice.call(arguments);       console.log(newArray2);     }     // 方案3-ES6語法 Array.From     {       console.log(Array.from(arguments));     }     // 方案4-ES6語法 剩余參數     {       console.log([...arguments]);     }   }    //調用   Test2(1, 2, 3, 4, 5, 6, 7, 8); }
登錄后復制

4. 箭頭函數中沒有arguments

{   console.log("----------------3. 箭頭函數中沒有arguments-------------------");   let Test3 = () => {     console.log(arguments);   };   Test3(1, 2, 3, 4); }
登錄后復制

二. ES6剩余參數和展開運算符

1. 剩余參數(Rest Parameter)

 剩余參數語法允許我們將一個不定數量的參數表示為一個數組,不定參數定義方式,這種方式很方便的去聲明不知道參數情況下的一個函數。

代碼分享

{   console.log("-----------------1. 剩余參數---------------------");   function sum1(...nums) {     console.log(nums);     console.log(       nums.reduce((preValue, currentValue) => preValue + currentValue, 0)     ); //求和   }   //調用   sum1(1, 2); //[1,2]   sum1(1, 2, 3); //[1,2,3]   sum1(1, 2, 3, 4); //[1,2,3,4]    function sum2(num1, num2, ...nums) {     console.log(nums);     console.log(       nums.reduce(         (preValue, currentValue) => preValue + currentValue,         num1 + num2       )     ); //求和   }   //調用   sum2(1, 2); //[]   sum2(1, 2, 3); //[3]   sum2(1, 2, 3, 4); //[3,4] }
登錄后復制

2. 展開運算符(Spread Operator)

 把固定的數組內容“打散”到對應的參數。

代碼分享:

{   console.log("-----------------2. 展開運算符---------------------");   function sum1(num1, num2) {     console.log(num1 + num2);   }   // 調用   let arry1 = [10, 20];   sum1(...arry1);    function sum2(num1, num2, num3) {     console.log(num1 + num2 + num3);   }   //調用   let arry2 = [10, 20, 30];   sum2(...arry2); }
登錄后復制

總結:

1. Spread Operator 和 Rest Parameter 是形似但相反意義的操作符,簡單的來說 Rest Parameter 是把不定的參數“收斂”到數組,而 Spread Operator 是把固定的數組內容“打散”到對應的參數。

2. Rest Parameter 用來解決函數參數不確定的場景,Spread Operator 用來解決已知參數集合應用到固定參數的函數上

三. apply/call/bind用法總結

1. apply 和 call都是為了改變被調用函數中this的指向, 同時立即執行該函數

2. bind也是為了改變函數中this的指向,但它返回的是一個函數,需要被調用才能執行

3. apply 和 call的第一個參數都是傳入綁定到對象,用于改變this指向,但是

(1). apply是將需要傳入函數的參數放到一個數組里,傳入到第二個參數的位置

(2). call是從第2,3,4…..位置依次傳入需要的參數

4. bind 后續傳入參數的形式和call相同,從第2,3,4…..位置依次傳入需要的參數,bind返回的是一個函數,需要再次調用。

代碼分享:

// 案例1--隱式綁定 {   console.log("----------------案例1--------------------");   let name = "ypf1";   let age = 18;   let obj = {     name: "ypf2",     myAge: this.age,     getMsg: function () {       console.log(this.name, this.age);     },   };   // 調用   console.log(obj.myAge); //undefined (隱式綁定,this指向obj)   obj.getMsg(); //ypf2,undefined  (隱式綁定,this指向obj) }  //案例2--只綁定,不傳參 /*      注意1個細節,bind后面多了個(),bind返回的是一個新函數,必須調用才能執行 */ {   console.log("----------------案例2--------------------");   let name = "ypf1";   let age = 18;   let obj = {     name: "ypf2",     myAge: this.age,     getMsg: function () {       console.log(this.name, this.age);     },   };   let obj2 = { name: "ypf3", age: 35 };   // 調用   obj.getMsg.apply(obj2); //ypf 35 (apply顯式綁定優先級高于隱式綁定,this指向obj2)   obj.getMsg.call(obj2); //ypf 35 (call顯式綁定優先級高于隱式綁定,this指向obj2)   obj.getMsg.bind(obj2)(); //ypf 35 (bind顯式綁定優先級高于隱式綁定,this指向obj2) }  // 案例3--傳遞參數 /*      apply傳遞數組     call和bind都是依次寫參數     特別注意:bind可以多次傳遞參數 */ {   console.log("----------------案例3--------------------");   let name = "ypf1";   let age = 18;   let obj = {     name: "ypf2",     myAge: this.age,     getMsg: function (msg1, msg2) {       console.log(this.name, this.age, msg1, msg2);     },   };   let obj2 = { name: "ypf3", age: 35 };   //調用   obj.getMsg.apply(obj2, ["消息1", "消息2"]);   obj.getMsg.call(obj2, "消息1", "消息2");   //bind用法1   obj.getMsg.bind(obj2, "消息1", "消息2")();   //bind用法2--多次傳參   let fn1 = obj.getMsg.bind(obj2, "消息1");   fn1("消息2"); }
登錄后復制

四. apply/call/bind用js實現

1. apply

(1). xxFn.ypfapply(), 在ypfapply中,this指向xxFn函數

(2). 需要實現出入 null 或 undefined的時候,this指向window

(3). 使用 delete 可以刪除對象的某個屬性

(4). 通過Function.prototype原型添加

(5). || 用法

argArray = argArray?argArray:[] 等價于

argArray = argArray || []

代碼分享:

/**  * 利用js手寫call函數  * @param {Object|null|undefined} thisArg 待綁定的對象  * @param  {Array} argArray 調用函數的數組參數  */ Function.prototype.ypfapply = function (thisArg, argArray) {   // 1. this指向調用函數   let fn = this;    // 2. 獲取傳遞參數   thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;    //3. 賦值函數并調用   thisArg.fn1 = fn;   argArray = argArray || [];   let result = thisArg.fn1(...argArray);    //4. 刪除thisArg綁定的屬性   delete thisArg.fn1;    //5.返回結果   return result; };  // 測試 function test1() {   console.log(this); } function sum(num1, num2) {   console.log(this, num1, num2);   return num1 + num2; }  // 1. 利用系統自帶的apply測試 console.log("----------1.利用系統自帶的call測試---------------"); test1.apply(null); let result1 = sum.apply("ypf1", [10, 20]); console.log(result1);  // 2. 利用自己寫的測試 console.log("----------2.利用自己寫的測試---------------"); test1.ypfapply(null); let result2 = sum.ypfapply("ypf1", [10, 20]); console.log(result2);
登錄后復制

2. call

(1). xxFn.ypfcall(), 在ypfcall中,this指向xxFn函數

(2). 需要實現出入 null 或 undefined的時候,this指向window

(3). 使用 delete 可以刪除對象的某個屬性

(4). 通過Function.prototype原型添加

代碼分享:

/**  * 利用js手寫call函數  * @param {Object|null|undefined} thisArg 待綁定的對象  * @param  {...any} args 調用函數的參數  */ Function.prototype.ypfcall = function (thisArg, ...args) {   // 1. 指向待調用的函數   let fn = this;    //2. 獲取綁定對象   thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;    //3.調用函數   thisArg.fn1 = fn;   let result = thisArg.fn1(...args);    //4. 刪除多余的屬性   delete thisArg.fn1;    //5. 最終返回   return result; };  // 測試 function test1() {   console.log(this); } function sum(num1, num2) {   console.log(this, num1, num2);   return num1 + num2; }  // 1. 利用系統自帶的call測試 console.log("----------1.利用系統自帶的call測試---------------"); test1.call(undefined); let result1 = sum.call("ypf1", 10, 20); console.log(result1);  // 2. 利用自己寫的測試 console.log("----------2.利用自己寫的測試---------------"); test1.ypfcall(undefined); let result2 = sum.ypfcall("ypf1", 10, 20); console.log(result2);
登錄后復制

3. bind

(1). bind和call相同,接收到參數是依次傳遞,另外bind返回的是函數??!

(2). xxFn.ypfbind(), 在ypfbind中,this指向xxFn函數

(3). 需要實現出入 null 或 undefined的時候,this指向window

(4). 使用 delete 可以刪除對象的某個屬性

(5). 由于bind返回的是函數,所以需要聲明1個函數, 并返回這個函數

函數內部核心點:由于bind可以一次性傳遞參數,也可以多次傳遞參數,所以需要對兩個參數進行一下合并

代碼分享:

Function.prototype.ypfbind = function (thisArg, ...argArray) {   // 1. this指向調用的函數   let fn = this;    // 2. 處理綁定參數   thisArg = thisArg != null && thisArg != undefined ? Object(thisArg) : window;    // 3. 聲明一個函數   function DyFun(...argArray2) {     // 綁定函數     thisArg.fn1 = fn;     // 合并參數     let finalArgArray = [...argArray, ...argArray2];     // 調用函數     let result = thisArg.fn1(...finalArgArray);     // 刪除用完的屬性     delete thisArg.fn1;     // 返回結果     return result;   }    //4. 返回一個函數   return DyFun; };  // 測試 function test1() {   console.log(this); } function sum(num1, num2) {   console.log(this, num1, num2);   return num1 + num2; } // 1. 利用系統自帶的bind測試 console.log("----------1. 利用系統自帶的bind測試---------------"); test1.bind(undefined)(); let result1 = sum.bind("ypf1", 10, 20); console.log(result1()); let result2 = sum.bind("ypf2", 10); console.log(result2(30));  // 2. 利用自己寫的測試 console.log("----------2.利用自己寫的測試---------------"); test1.bind(undefined)(); let result3 = sum.bind("ypf1", 10, 20); console.log(result3()); let result4 = sum.bind("ypf2", 10); console.log(result4(30));
登錄后復制

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
精品久久久噜噜噜噜久久图片| 日本精品一区在线| 中文字幕の友人北条麻妃| 777视频在线| 欧美男女交配视频| 国产成人美女视频| 黄色a级三级三级三级| 亚洲老女人av| 岛国毛片在线播放| 捷克做爰xxxⅹ性视频| 欧美国产日韩另类| 交换做爰国语对白| 黄色一级视频播放| 成人在线视频一区二区三区| 久久久久久久久影视| 中文字幕55页| 男人天堂网站在线| 中文字幕无码精品亚洲35| 欧美精品一区二区三区免费播放| 激情综合在线观看| 亚洲欧美国产中文| 999一区二区三区| 国产精品秘入口18禁麻豆免会员| 国产美女三级视频| 欧美少妇一级片| 亚洲自偷自拍熟女另类| 手机av在线网| 国产日韩欧美精品在线观看| 男人舔女人下面高潮视频| 最新av免费在线观看| 精品久久久无码人妻字幂| 国产视频九色蝌蚪| 不卡的在线视频| 男女猛烈激情xx00免费视频| 激情网站五月天| 日本中文字幕一级片| 男女无套免费视频网站动漫| 日韩一级片一区二区| 久久久久久久片| 国产精品一色哟哟| 激情久久综合网| 成人免费xxxxx在线视频| 国产日韩欧美大片| 在线观看亚洲色图| 欧美少妇性生活视频| 穿情趣内衣被c到高潮视频| 欧美视频第三页| 久久国产午夜精品理论片最新版本| 一区二区三区免费播放| 97视频在线免费| 三级黄色片免费看| 午夜免费福利在线| 亚洲一级片免费观看| 中文字幕在线乱| 蜜臀久久99精品久久久酒店新书| 国产精品天天av精麻传媒| 日韩av影视大全| 亚洲欧美激情网| 国产自偷自偷免费一区| 久久综合色视频| 少妇大叫太大太粗太爽了a片小说| 在线观看免费的av| 日本爱爱免费视频| 国产裸体免费无遮挡| 啊啊啊一区二区| 日本免费一级视频| 欧美亚洲日本在线观看| 人妻熟女一二三区夜夜爱| 久久久久久久中文| 国内外成人激情视频| 欧美丰满熟妇bbbbbb百度| 妞干网在线视频观看| 无码中文字幕色专区| 草草视频在线免费观看| 国产人妻777人伦精品hd| 国产精品一区二区免费在线观看| 蜜桃传媒一区二区三区| 国产九九九九九| 999精品网站| 少妇一级淫免费放| 国产精品中文久久久久久| 伊人再见免费在线观看高清版 | 老司机激情视频| 欧美乱做爰xxxⅹ久久久| 99色这里只有精品| 日本黄网站免费| 欧美视频国产视频| 黄色污污在线观看| 日本国产在线播放| 中文字幕 日韩 欧美| 日韩中文在线字幕| 少妇高潮喷水在线观看| 99视频精品免费| 久久国产精品免费观看| 久久久久久久久久久福利| 亚洲一区日韩精品| 国产不卡一区二区视频| 99精品视频国产| 免费无遮挡无码永久视频| 特级丰满少妇一级| 狠狠干视频网站| 777视频在线| 少妇av一区二区三区无码| 九九热99视频| 免费黄色日本网站| 男女裸体影院高潮| 欧美成人xxxxx| 女人色极品影院| 一区二区在线免费看| 成人一对一视频| 国产又粗又爽又黄的视频| 天堂社区在线视频| www.日本在线播放| 看全色黄大色大片| 亚洲va综合va国产va中文| 黄色a级片免费| 日韩五码在线观看| 国产成人一区二区三区别| 国产精品v日韩精品v在线观看| 久久久亚洲精品无码| 国产一级不卡视频| 一级做a爱视频| 波多野结衣xxxx| 中文字幕国内自拍| 自拍偷拍 国产| 久久黄色免费看| 黄色片久久久久| 欧美激情国产精品日韩| 免费看日本毛片| 免费超爽大片黄| 日韩欧美一区二| 免费毛片小视频| 黄色av免费在线播放| 国产男女无遮挡| 日韩网址在线观看| 粗暴91大变态调教| 日韩a在线播放| 别急慢慢来1978如如2| 日韩精品无码一区二区三区免费| 免费观看日韩毛片| 女人扒开屁股爽桶30分钟| 久草综合在线观看| 国产又猛又黄的视频| 欧美wwwwwww| 一级黄色片播放| 欧美精品自拍视频| 日本免费观看网站| 91香蕉视频在线观看视频| 影音先锋男人的网站| 国产乱子伦精品无码专区| 欧美爱爱视频免费看| 成熟老妇女视频| 三年中文在线观看免费大全中国| 国产美女视频免费看| 久久天天东北熟女毛茸茸| 国产av熟女一区二区三区| 国产aaa一级片| 一起操在线视频| 精品少妇人欧美激情在线观看| 岳毛多又紧做起爽| 91插插插影院| 777精品久无码人妻蜜桃| 中文字幕第17页| 青青草精品视频在线| 国模私拍视频在线观看| 免费看毛片的网址| 天堂网在线免费观看| av日韩在线看| 色综合天天色综合| 国产高清av在线播放| 99九九99九九九99九他书对| 国产精品久久久久7777| 激情 小说 亚洲 图片: 伦| 91.com在线| 亚洲天堂av免费在线观看| 91传媒久久久| 日本wwwcom| 99亚洲精品视频| 天天爽人人爽夜夜爽| 日韩avxxx| 91黄色在线看| 成人在线观看毛片| 久久久精品高清| 可以免费观看av毛片| 真实国产乱子伦对白视频| 色乱码一区二区三区在线| 国产二区视频在线播放| 免费拍拍拍网站| 吴梦梦av在线| 国产永久免费网站| 亚洲黄色av网址| 日本999视频| 农村妇女精品一二区| 青青草原成人网| 人妻精品无码一区二区三区 | 成人免费观看在线| 玖玖精品在线视频| 三级黄色片免费观看| 在线观看岛国av| 欧美性受xxxxxx黑人xyx性爽|