關於js高級程序設計第三版中關於arguments論述的一個錯誤

圖片描述

這本紅寶書相信你們很熟悉,甚至比我讀過的次數要多,不過今天在閱讀函數傳參部分章節時,發現了書中一個能夠算是小錯誤的知識點。數組

咱們知道,arguments做爲一個類數組,和函數的傳參是一一對應的,那麼若是改變其中一個的值,會對另外一個有什麼影響呢?瀏覽器

在紅寶書第66頁第一段,做者給予了論述:編輯器

function doAdd(num1,num2){
    arguments[1]=10;
    alert(arguments[0]+num2)
   }

「每次執行這個doAdd()函數都會重寫第二個參數,將第二個參數的值修改成10。由於arguments對象中的值會自動反映到對應的命名參數,因此修改arguments[1],也就修改了num2,結果它們的值都會變成10。不過,這並非說讀取這兩個值會訪問相同的內存空間;它們的內存空間是獨立的,但它們的值會同步。但這種影響是單向的:修改命名參數不會改變argument中對應的值函數

這段解讀很是深入,因而我趕快打開編輯器進行嘗試。我是這樣作的:spa

function add1(num1,num2){
    arguments[1]=10;
    alert(num1+num2);
}
function add2(num1,num2){
    num2=10;
    alert(arguments[0]+arguments[1]);
}
add1(20,5);
add2(3,5);
add1(20);

這兩個函數,分別對arguments[1]和其對應的傳參num2作出修改,並彈出結果。在第一個函數中,由於給arguments[1]賦值這個動做將num2的值強行替換爲10,因此在調用add1(20,5)時,咱們獲得的是num1+num2=20+10=30。這和書中論述無異。
然而在第二個函數add2中,將num2強行賦值爲10,輸出arguments[0]+arguments[1],按照做者以上的論述(斜體字部分),argument裏的值應該保持不變,結果應該爲3+5=8纔對。可是瀏覽器結果最後給出的結果爲13(3+10),在火狐、谷歌和IE下結果一致。這說明,改變傳參的值,一樣能夠反過來改變對應arguments的值,二者的改變是相通的。code

另外,若是隻給add1傳入一個參數,瀏覽器最後給出的結果爲NaN,這說明:若是隻傳了一個值,那麼爲arguments[1]設置的值不會反應到命名參數中去,由於arguments對象的長度是由傳入的參數個數決定的。此時num2的值始終爲undefined,所以纔會有輸出NaN這一結果。對象

相關文章
相關標籤/搜索