摘要:在客戶端中,一些方法等也返回類數(shù)組對(duì)象。對(duì)象接下來重點(diǎn)講講對(duì)象。在函數(shù)體中,指代該函數(shù)的對(duì)象。下一篇文章深入之創(chuàng)建對(duì)象的多種方式以及優(yōu)缺點(diǎn)深入系列深入系列目錄地址。
類數(shù)組對(duì)象JavaScript深入系列第十三篇,講解類數(shù)組對(duì)象與對(duì)象的相似與差異以及arguments的注意要點(diǎn)
所謂的類數(shù)組對(duì)象:
擁有一個(gè) length 屬性和若干索引屬性的對(duì)象
舉個(gè)例子:
var array = ["name", "age", "sex"]; var arrayLike = { 0: "name", 1: "age", 2: "sex", length: 3 }
即便如此,為什么叫做類數(shù)組對(duì)象呢?
那讓我們從讀寫、獲取長(zhǎng)度、遍歷三個(gè)方面看看這兩個(gè)對(duì)象。
讀寫console.log(array[0]); // name console.log(arrayLike[0]); // name array[0] = "new name"; arrayLike[0] = "new name";長(zhǎng)度
console.log(array.length); // 3 console.log(arrayLike.length); // 3遍歷
for(var i = 0, len = array.length; i < len; i++) { …… } for(var i = 0, len = arrayLike.length; i < len; i++) { …… }
是不是很像?
那類數(shù)組對(duì)象可以使用數(shù)組的方法嗎?比如:
arrayLike.push("4");
然而上述代碼會(huì)報(bào)錯(cuò): arrayLike.push is not a function
所以終歸還是類數(shù)組吶……
調(diào)用數(shù)組方法如果類數(shù)組就是任性的想用數(shù)組的方法怎么辦呢?
既然無法直接調(diào)用,我們可以用 Function.call 間接調(diào)用:
var arrayLike = {0: "name", 1: "age", 2: "sex", length: 3 } Array.prototype.join.call(arrayLike, "&"); // name&age&sex Array.prototype.slice.call(arrayLike, 0); // ["name", "age", "sex"] // slice可以做到類數(shù)組轉(zhuǎn)數(shù)組 Array.prototype.map.call(arrayLike, function(item){ return item.toUpperCase(); }); // ["NAME", "AGE", "SEX"]類數(shù)組轉(zhuǎn)對(duì)象
在上面的例子中已經(jīng)提到了一種類數(shù)組轉(zhuǎn)數(shù)組的方法,再補(bǔ)充三個(gè):
var arrayLike = {0: "name", 1: "age", 2: "sex", length: 3 } // 1. slice Array.prototype.slice.call(arrayLike); // ["name", "age", "sex"] // 2. splice Array.prototype.splice.call(arrayLike, 0); // ["name", "age", "sex"] // 3. ES6 Array.from Array.from(arrayLike); // ["name", "age", "sex"] // 4. apply Array.prototype.concat.apply([], arrayLike)
那么為什么會(huì)講到類數(shù)組對(duì)象呢?以及類數(shù)組有什么應(yīng)用嗎?
要說到類數(shù)組對(duì)象,Arguments 對(duì)象就是一個(gè)類數(shù)組對(duì)象。在客戶端 JavaScript 中,一些 DOM 方法(document.getElementsByTagName()等)也返回類數(shù)組對(duì)象。
Arguments對(duì)象接下來重點(diǎn)講講 Arguments 對(duì)象。
Arguments 對(duì)象只定義在函數(shù)體中,包括了函數(shù)的參數(shù)和其他屬性。在函數(shù)體中,arguments 指代該函數(shù)的 Arguments 對(duì)象。
舉個(gè)例子:
function foo(name, age, sex) { console.log(arguments); } foo("name", "age", "sex")
打印結(jié)果如下:
我們可以看到除了類數(shù)組的索引屬性和length屬性之外,還有一個(gè)callee屬性,接下來我們一個(gè)一個(gè)介紹。
length屬性Arguments對(duì)象的length屬性,表示實(shí)參的長(zhǎng)度,舉個(gè)例子:
function foo(b, c, d){ console.log("實(shí)參的長(zhǎng)度為:" + arguments.length) } console.log("形參的長(zhǎng)度為:" + foo.length) foo(1) // 形參的長(zhǎng)度為:3 // 實(shí)參的長(zhǎng)度為:1callee屬性
Arguments 對(duì)象的 callee 屬性,通過它可以調(diào)用函數(shù)自身。
講個(gè)閉包經(jīng)典面試題使用 callee 的解決方法:
var data = []; for (var i = 0; i < 3; i++) { (data[i] = function () { console.log(arguments.callee.i) }).i = i; } data[0](); data[1](); data[2](); // 0 // 1 // 2
接下來講講 arguments 對(duì)象的幾個(gè)注意要點(diǎn):
arguments 和對(duì)應(yīng)參數(shù)的綁定function foo(name, age, sex, hobbit) { console.log(name, arguments[0]); // name name // 改變形參 name = "new name"; console.log(name, arguments[0]); // new name new name // 改變arguments arguments[1] = "new age"; console.log(age, arguments[1]); // new age new age // 測(cè)試未傳入的是否會(huì)綁定 console.log(sex); // undefined sex = "new sex"; console.log(sex, arguments[2]); // new sex undefined arguments[3] = "new hobbit"; console.log(hobbit, arguments[3]); // undefined new hobbit } foo("name", "age")
傳入的參數(shù),實(shí)參和 arguments 的值會(huì)共享,當(dāng)沒有傳入時(shí),實(shí)參與 arguments 值不會(huì)共享
除此之外,以上是在非嚴(yán)格模式下,如果是在嚴(yán)格模式下,實(shí)參和 arguments 是不會(huì)共享的。
傳遞參數(shù)將參數(shù)從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù)
// 使用 apply 將 foo 的參數(shù)傳遞給 bar function foo() { bar.apply(this, arguments); } function bar(a, b, c) { console.log(a, b, c); } foo(1, 2, 3)強(qiáng)大的ES6
使用ES6的 ... 運(yùn)算符,我們可以輕松轉(zhuǎn)成數(shù)組。
function func(...arguments) { console.log(arguments); // [1, 2, 3] } func(1, 2, 3);應(yīng)用
arguments的應(yīng)用其實(shí)很多,在下個(gè)系列,也就是 JavaScript 專題系列中,我們會(huì)在 jQuery 的 extend 實(shí)現(xiàn)、函數(shù)柯里化、遞歸等場(chǎng)景看見 arguments 的身影。這篇文章就不具體展開了。
如果要總結(jié)這些場(chǎng)景的話,暫時(shí)能想到的包括:
參數(shù)不定長(zhǎng)
函數(shù)柯里化
遞歸調(diào)用
函數(shù)重載
...
歡迎留言回復(fù)。
下一篇文章JavaScript深入之創(chuàng)建對(duì)象的多種方式以及優(yōu)缺點(diǎn)
深入系列JavaScript深入系列目錄地址:https://github.com/mqyqingfeng/Blog。
JavaScript深入系列預(yù)計(jì)寫十五篇左右,旨在幫大家捋順JavaScript底層知識(shí),重點(diǎn)講解如原型、作用域、執(zhí)行上下文、變量對(duì)象、this、閉包、按值傳遞、call、apply、bind、new、繼承等難點(diǎn)概念。
如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。如果喜歡或者有所啟發(fā),歡迎star,對(duì)作者也是一種鼓勵(lì)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82908.html
摘要:深入系列第十二篇,通過的模擬實(shí)現(xiàn),帶大家揭開使用獲得構(gòu)造函數(shù)實(shí)例的真相一句話介紹運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類型之一也許有點(diǎn)難懂,我們?cè)谀M之前,先看看實(shí)現(xiàn)了哪些功能。 JavaScript深入系列第十二篇,通過new的模擬實(shí)現(xiàn),帶大家揭開使用new獲得構(gòu)造函數(shù)實(shí)例的真相 new 一句話介紹 new: new 運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具...
摘要:寫在前面深入系列共計(jì)篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順底層知識(shí)的系列。深入系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫在前面 JavaScript 深入系列共計(jì) 15 篇已經(jīng)正式完結(jié),這是一個(gè)旨在幫助大家,其實(shí)也是幫助自己捋順 JavaScript 底層知識(shí)的系列。重點(diǎn)講解了如原型、作用域、執(zhí)行上下文、變量對(duì)象、this、...
摘要:但是,我們可以借用類數(shù)組方法不難看出,此時(shí)的在調(diào)用數(shù)組原型方法時(shí),返回值已經(jīng)轉(zhuǎn)化成數(shù)組了。很多時(shí)候,深入看看源代碼也會(huì)讓你對(duì)這個(gè)理解的更透徹。的前端樂園原文鏈接深入理解類數(shù)組 起因 寫這篇博客的起因,是我在知乎上回答一個(gè)問題時(shí),說自己在學(xué)前端時(shí)把《JavaScript高級(jí)程序設(shè)計(jì)》看了好幾遍。于是在評(píng)論區(qū)中,出現(xiàn)了如下的對(duì)話:showImg(https://segmentfault.c...
摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫在前面: 隔了很長(zhǎng)時(shí)間了,也不知道寫點(diǎn)什么。最近一直在研究ES6,一直想寫出來的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
摘要:剛開始看到的函數(shù)和時(shí),非常的模糊,不知所云,然后看書,網(wǎng)上查詢多少知道點(diǎn)了眉目,下面是我做的筆記,希望和大家分享,有不對(duì)之處希望各位多多指正,共同進(jìn)步。。。 剛開始看到j(luò)avascript的函數(shù)apply和call時(shí),非常的模糊,不知所云,然后看書,網(wǎng)上查詢多少知道點(diǎn)了眉目,下面是我做的筆記,希望和大家分享,有不對(duì)之處希望各位多多指正,共同進(jìn)步。。。本文將從三個(gè)方面介紹apply,ca...
閱讀 2094·2021-11-24 10:34
閱讀 3067·2021-11-22 11:58
閱讀 3727·2021-09-28 09:35
閱讀 1739·2019-08-30 15:53
閱讀 2791·2019-08-30 14:11
閱讀 1566·2019-08-29 17:31
閱讀 557·2019-08-26 13:53
閱讀 2153·2019-08-26 13:45