簡體   English   中英

來自array.splice的意外結果

[英]Unexpected result from array.splice

我創建了一個JavaScript函數,以剔除數組中的項目並返回最終項目。 但這實際上是在不應該從主數組中刪除項目的情況下。

功能:

function oneRemaining(arr) {
    tmp = arr;
    while (tmp.length > 1) {
        tmp.splice(~~(Math.random() * tmp.length), 1);
    }
    return tmp[0];
}

因此,在運行此命令之后,進入的數組應該仍然相同,因為它從未更改過,但是當我在控制台中運行此命令時,其中只有一項。

為什么輸入數組被更改?

您的數組發生變化是因為:

  1. 您創建的引用不是克隆/副本(最后要觸摸相同的數組)
  2. Splice更改了基礎數組,它是這樣做的少數方法之一( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

如果您希望這樣做,請將第二行替換為:

tmp = arr.concat([])

希望這可以幫助。

它正在被更改,因為tmp是對arr的引用而不是其副本。 每當您更改引用對象中的某些內容時,它也會同時更改原始對象

數組是javascript中的引用類型,因此以下行不會復制輸入數組,只需將變量tmp分配給輸入數組的引用即可。 最后,您總是在內存中編輯相同的數組。

tmp = arr;

您可以使用arr.slice(0)真正復制您的輸入數組。

(您可能已經錯過了tmp變量聲明中的var in,除非您希望它是全局變量?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM