像數組又不是數組:JS函數的參數列表到底是什麼?

2020-12-05 Web前端號

在之前介紹模擬函數重載效果的時候,我們看到JS中的函數中,其實有一個「隱形」的東西來存儲實參所有的實參,這個東西就是arguments對象。但在實際使用過程中它的使用方式和數組簡直一模一樣,用起來感覺就是數組,沒有任何毛病,但實際上它並不是一個數組。

arguments看起來,用起來都像是數組

1 調用方法類似:都可以通過中括號下標的形式來訪問具體某個參數。

2 有length屬性:直接可以獲取實參的個數。

3 和數組一樣,用中括號將內容包含起來。

究竟是不是數組?

結合我們之前所學關於數組的知識點,剛好把它們串起來,從三個角度來驗證下arguments是不是數組。

1 如果是數組,就可以使用前面介紹過的數組的方法,比如用push函數給arguments插入一個元素。

結果報錯,arguments並不像正常的數組一樣,有push函數

2 正面確認下,用我們之前判斷數組的方法來判斷一下:

結果為false,直接說明arguments不是數組。

3 這一切從控制臺看的更為真切:

通過toString函數執行結果可以看出,arguments其實是「[object Arguments]」,其實將其直接列印出來的__proto__屬性值就可以看出,arguments是Object。但是,這個arguments對象又跟我們看到的普通(正常)對象又有區別,因為一般的對象是大括號,而arguments對象是中括號,這一點又像數組。

綜上,arguments本質上是對象,而且是具有數組特性的對象,包括表現形式都用中括號,這種就是艱巨對象和數組特性的數據類型就叫做類數組

橫空出世:類數組

為了更深入的理解類數組,我們一步步來構造一個類數組。。

先從一個普通對象car開始,特別之處在於增加了數字作為屬性,以及增加一個length屬性,這樣,我們就基本可以模擬出數組的使用方式了,並且仍然保持了對象的特性,如下圖

但這個時候,雖然有點像了,但還有兩點沒有做到,一就是這個時候仍然不能使用數組的方法,二就是該對象列印出來還是使用大括號,也就是仍然只是一個對象。下面給這個對象添加數組的方法試試,以push和splice連個函數為例。

可以看到,在Object對象原型上增加數組的push和splice方法後,該對象之前的大括號也變成了數組的中括號,下面試試新增加的方法是否有效

可以看到,push方法成功將新的元素添加到對象中,類數組car就創建完成了。

需要特別說明的是:

1 數組的方法需要挨個添加到類數組中,需要哪個就添加哪個,並不是一次吧數組的所有方法一次性搬過來了

2 在對象中添加數組的位置,除了剛剛的在對象原型上添加,還可以在類數組中單獨添加,這樣只對本類數組有效,剛剛的方法會導致之後所有的對象都自帶添加的數組方法。

之後創建的對象都自帶數組操作

在類數組對象中添加數組的操作方法,只在本對象有效,不影響其他對象。

過程有點複雜,但是也正是通過這些,讓我們透過表面的數據類型,有機會窺探原型,數組和對象的背後,看到 一些近乎顛覆三觀的知識。類數組是一個難點,但是因為它兼具對象和數組的特性,非方便,所以經常要使用到,所以必須理解準確到位,使用熟練。

如果有哪裡講的不對或者需要補充,歡迎評論交流。最後來個很奇葩的大廠筆試題,以上知識學懂沒學懂,評論區裡見真章。

相關焦點

  • 一起學JAVA——數組和函數
    如果某個函數在執行的時候需要調用者傳入數據,那麼可以定義參數列表,用於接收數據。如果函數運行之後需要返回給調用者數據,那麼需要指定返回值類型,並且用關鍵字return返回。定義函數的3個必要條件:函數名、參數列表、返回值類型。
  • 你真的了解JS中的數組嗎?——數組API的總結
    查forEach(function(item,index,array){},thisPoint),循環數組的每一項,第一個參數是一個函數,函數有三個默認值,第一個參數是每次循環的元素,第二個參數是循環的該元素的下標,第三個參數是該數組;而第二個參數是改變的this的指向的,如果不填,默認是指向window;返回的是undefined
  • 程序江湖事——JS數組的知己知彼
    本篇主要介紹數組的基本使用,有興趣的朋友可以了解一下!最後有「彩蛋」——一個通過技術反思生活之人的獨白。程序江湖所有發生的事情絕非偶然,所有發生的事情也會真相大白;它不是依靠像柯南一樣的神秘偵探,而是它本身就具有像柯南一樣的搜尋能力。
  • JavaScript數組 - 引用詳解
    基本數據類型詳解在學習數組引用詳解前,我們先來看基本數據類型的詳解舉個小例子:我們聲明一個a = 10;然後聲明一個函數,這個函數裡面有個參數為a把這個參數的a改成5,a = 5; 並且再加上alert(a);函數外我們先去alert(a);再調用這個函數把a寫在裡面傳進去
  • NumPy ndarray數組的創建
    +Tab鍵查看可使用的函數,如果對其中一些函數的使用不是很清楚,還可以在對應函數加上?,再運行,就可以很方便地看到如何使用函數的幫助信息。輸入np.然後按 Tab 鍵,將出現如下界面:圖1:查看 NumPy 可以使用的函數運行如下命令,便可查看函數 abs 的詳細幫助信息。np.abs?
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    這兒就涉及到了如何將C語言中的複數數組(Complex array)類型與Python中的數據類型進行交互的問題。在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,前面多篇文章中已經講了傳遞數值/指針/字符串參數、傳遞結構體參數、傳遞普通數組類型的例子,大家可以回看一下,這樣可以更好的理解本次要講的內容。
  • NumPy的數組對象
    一、創建數組可以有多種方式創建NumPy數組:(1)使用NumPy的array函數從Python列表中創建數組,數組類型由列表中的數據類型確定;(2)使用NumPy的zeros函數創建數組元素全部為0的數組,默認情況下數組元素的類型為float64;(3)使用NumPy的ones函數創建數組元素全部為1的數組,默認情況下數組元素的類型為float64;(4)使用NumPy
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    前面兩篇已經講了傳遞數值/指針/字符串參數、傳遞結構體參數的例子,大家可以回看一下,這樣可以更好的理解本次要講的內容。詳細細節請參考:python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數、Python使用ctypes模塊調用DLL函數之傳遞結構體參數這次講一下在Python中使用ctypes模塊調用DLL中的庫函數傳遞數組參數的情況。
  • 看圖學NumPy:掌握n維數組基礎知識點,看這一篇就夠了
    ,數組元素的類型與列表元素類型相同。NumPy數組無法像Python列表那樣加長,因為在數組末尾沒有保留空間。., 2.]的浮點數組,可以更改arange輸出的類型:arange(3).astype(float)。但是有更好的方法:arange函數對數據類型敏感,如果將整數作為參數,生成整數數組;如果輸入浮點數(例如arange(3.)),則生成浮點數組。但是arange在處理浮點數方面並不是特別擅長:
  • Python Numpy-數組的常用函數
    下面介紹一些常用的數組操作函數和統計函數。將數組變形,參數是一個tuple。注意:數組元素總數要一致。concatenate() 級聯需要注意的點:1、級聯的參數是列表:一定要加中括號或者小括號2、維度必須相同3、形狀相符4、【重點】級聯的方向默認是shape這個tuple的第一個值所代表的維度方向5、可通過axis參數來改變級聯的方向示例1:垂直級聯 axis=0
  • Excel函數公式大全之利用MMULT函數計算兩個數組矩陣的乘積
    各位Excel天天學的小夥伴們大家好,歡迎收看Excel天天學出品的excel2019函數公式大全課程。今天我們依舊要學習的是Excel函數中的數學函數MMULT函數,計算兩個數組的矩陣乘積。今天這個例子也是非常的簡單,就是利用MMULT函數計算兩個不等數組的矩陣乘積。
  • java之數組作為方法參數的使用
    各位小夥伴們大家好,這次小編要介紹的是java作為方法參數,返回值的使用。首先,小編要介紹的是java作為方法參數的使用。static void main(String[] args){int[] array={1,2,34,78};//定義一個方法System.out.println(array);//地址值printArray(array);//(方法的調用)}/** 方法定義的三要素:* 1.返回值類型:只是進行列印,不需要進行計算,也沒有結果,用void* 2.方法名稱:printArray* 3.參數列表
  • EXCEL知識:數組運算是什麼?
    下面我主要介紹一些我自己理解的數組運算。什麼是數組在Excel中,數組可以理解為多個單元格的集合。單行數據,單列數據(一維數組),多行多列數據(二維數組),都可以是一個數組。如下圖所示:上圖中數組1和數組2為一維數組,數組4和數組5為二維數組。
  • NumPy庫中數組數據文件的讀寫
    數組數據文件的讀寫我們還沒有講如何讀取文件中的數據。NumPy這方面的內容很重要,用處很大,尤其是在處理數組中包含大量數據的情況時。假如你有一個數組要保存,例如數據分析過程中產生的結果,調用save( )函數即可,參數有兩個:要保存到的文件名和要保存的數組,其中文件名中的.npy擴展名系統會自動添加。
  • MATLAB數組的常用函數
    3  進行數組運算的常用函數在MATLAB中有一些常用函數,這些函數在日常的編程計算過程中會經常遇到,一般是基本的數學概念在MATLAB
  • 【ADAMS】矩陣/數組函數
    矩陣/數組函數可很方便地完成針對矩陣/數組的操作。(1)矩陣/數組的基本操作函數ALIGN 將數組轉換到從特定值開始ALLM 返回矩陣元素的邏輯值ANGLES 將方向餘弦矩陣轉換為指定旋轉順序下的角度矩陣ATAN(x) 數字表達式x 的反正切值ATAN2(x1,x2) 兩個數字表達式x1,x2 的四象限反正切值(3)取整函數INT(x)
  • Python語言中使用array模塊實現動態數組的操作
    Python中的array類似於列表list,如都可以動態增刪元素,但又有所區別,list中存儲的元素類型可以不一樣,但array中元素類型必須完全一樣。另外,由於list中每個元素同時存儲了其地址即指針(用以標記每個元素的數據類型)和實際的數據,所以,在存儲及操作效率上,array又遠遠高於列表。下面通過例子講解array模塊的常用操作。
  • Python入門教程(二):Numpy數組基礎
    ,其語法與python列表的標準切片語法相同,包括三個參數,分別是開始位置,結束位置,bu cha其表現形式如下:x[start:stop:step]一維子數組x = np.arange(10)x# array([0, 1, 2, 3, 4, 5,
  • Excel函數large、與數組在實際案例中的聯合運用
    在講述這些數組計算的過程,我們也穿插了一些簡單的函數的使用方法,比如函數randbetween、函數sumproduct等,另外由於我們在生活和學習當中可能更習慣於去數值之間的計算,而忽視了對數組計算方法的學習,所以在之前的文章當中,一直在將數值計算和數組計算進行比較。
  • Numpy的ndarray:一種多維數組對象
    #查看元組各維度大小In[9]:data.shapeOut[9]: (2, 3)#查看數組數據類型的對象In[10]:data.dtypeOut[10]: dtype('float64')創建ndarray創建數組最簡單的辦法就是使用array函數。