摘要:引言今天小問了我一個面試題,怎么實現(xiàn)一個實方法,在實現(xiàn)的過程中我還是犯了一些錯,實現(xiàn)完以后,對一些知識點的理解又加深了。此時還是在上,并且至少在當(dāng)前的方法中不會再被改變了,因為沒有哪個指針能指向它了。
引言
今天小K問了我一個面試題,怎么實現(xiàn)一個實reverse方法,在實現(xiàn)的過程中我還是犯了一些錯,實現(xiàn)完以后,對一些知識點的理解又加深了。
錯誤的寫法最開始我是這么寫的
var arr = [1,2,3,4,5] var reverse1 = function (arr) { let newArr = [] while (arr.length>0){ newArr.push(arr.pop()) } console.log(arr,newArr) // [],[5,4,3,2,1] arr = newArr //讓arr等于反轉(zhuǎn)后的新數(shù)組 console.log(arr) // [5,4,3,2,1] return arr } reverse1(arr)
結(jié)果有點打臉
console.log(arr) // []函數(shù)參數(shù)的傳遞方式
上面的現(xiàn)象顯示:我將arr當(dāng)參數(shù)傳入reverse1里面,我可以改變arr里面的內(nèi)容但是我卻無法改變arr(arr由[1,2,3,4,5]pop()五次變成[ ],但是隨后的賦值操作卻沒有成功)
為什么會出現(xiàn)這個問題,我們得從函數(shù)的參數(shù)傳遞方式說起
函數(shù)的參數(shù)都是值傳遞
怎么理解這句話,按照高程的說法,如果這里是引用傳遞,那么我在代碼第8行已經(jīng)讓arr變成了[5,4,3,2,1],那么外面的arr也應(yīng)該變,但是現(xiàn)在外面arr卻是[ ],所以函數(shù)的參數(shù)的傳遞方法都是值傳遞
如果你覺得這么說還是比較抽象,你可以聽聽鄙人陋見,我們完全可以把js里面數(shù)組名當(dāng)成一個指針變量,儲存的是實際的數(shù)組對象的地址。指針意味著我們通過它可以訪問它指向的對象。變量意味者我可以改變這個變量。
在函數(shù)參數(shù)里面當(dāng)我們傳入一個arr的時候,實際傳遞的是一個形參address1,儲存arr這個對象在內(nèi)存里的地址,address1=xxxx xxxxx xxxx xxx1。通過address1可以對arr進(jìn)行任何操作,一旦現(xiàn)在我為address1賦上新的地址值,也就是address1=xxxx xxxxx xxxx xxx2。address1就和arr失去了聯(lián)系。此時arr還是在xxxx xxxxx xxxx xxx1上,并且至少在當(dāng)前的reverse1方法中不會再被改變了,因為沒有哪個指針能指向它了。
正確的寫法ok說了這么多,實際想說的是,你在方法中可以通過索引,通過原生方法操作一個當(dāng)參數(shù)傳進(jìn)來的數(shù)組,但是絕對不允許對數(shù)組名直接進(jìn)行賦值
那么這個題目我們就可以嘗試使用原生方法來操作傳進(jìn)來的數(shù)組,這里提供一種思路
var arr = [1,2,3,4,5] var reverse1 = function () { for(var i = 0; i < arr.length; i ++){ arr.splice(i,0,arr.pop()) } } reverse1(arr) console.log(arr) // [5,4,3,2,1]
但是我們可以看到上面的方法還是不是很好,這是因為這個reverse1貌似只能對arr進(jìn)行操作,耦合性太強(qiáng),我們需要解耦,讓reverse1對所有的數(shù)組都適用,這里適用this和原型方面的知識
//一個完美的寫法: Array.prototype.reverse1 = function () { for(var i = 0; i < this.length; i ++){ //this 解耦 this.splice(i,0,this.pop()) } return this }總結(jié)
今天介紹了一下reverse的實現(xiàn)思路,this解耦,以及函數(shù)參數(shù)是值傳遞這么一個概念,
建議在方法中通過索引,通過原生方法改變一個當(dāng)參數(shù)傳進(jìn)來的數(shù)組,但是絕對不允許對數(shù)組名直接進(jìn)行賦值
希望對大家有所幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/103666.html
摘要:引言有一段時間沒更新了,最近挺忙的懶病犯了。例數(shù)組累加例計算總價蘋果桃子西瓜自己實現(xiàn)一個方法知道了的兩種模式利用遞歸實現(xiàn)它并不復(fù)雜參數(shù)有個。數(shù)據(jù)從這些方法組成的管道中流淌一遍出來就得到想要的結(jié)果了。 showImg(https://segmentfault.com/img/bVbuHVn?w=598&h=419); 引言 有一段時間沒更新了,最近挺忙的(懶病犯了)。今天偶然想到之前去去...
摘要:規(guī)則使用語言,讓函數(shù)獲取傳遞的參數(shù),并以相反的順序返回字符串。測試用例思路方法通過把字符串轉(zhuǎn)換成數(shù)組,并使用數(shù)組的反轉(zhuǎn)數(shù)組,然后使用重新拼接成字符串方法向后循環(huán)字符串或字符數(shù)組以生成新字符串 雖然都是很簡單的算法,每個都只需5分鐘左右,但寫起來總會遇到不同的小問題,希望大家能跟我一起每天進(jìn)步一點點。更多的小算法練習(xí),可以查看我的文章。 規(guī)則 Using the JavaScript l...
摘要:題目旋轉(zhuǎn)數(shù)組給定一個數(shù)組,將數(shù)組中的元素向右移動個位置,其中是非負(fù)數(shù)。例如將到反轉(zhuǎn)將到反轉(zhuǎn)全部翻轉(zhuǎn)得到最后結(jié)果。這里要注意下還有這樣的情況即大于數(shù)組長度的情況。次旋轉(zhuǎn)次旋轉(zhuǎn)轉(zhuǎn)回來了次旋轉(zhuǎn)次旋轉(zhuǎn)轉(zhuǎn)回來了次旋轉(zhuǎn)所以這里的有效等于對數(shù)組長度求余。 題目: 旋轉(zhuǎn)數(shù)組 給定一個數(shù)組,將數(shù)組中的元素向右移動 k 個位置,其中 k 是非負(fù)數(shù)。 示例: 輸入: [1,2,3,4,5,6,7] 和 k...
摘要:可交互視頻此視頻是可以交互的,你可以隨時暫停視頻,編輯視頻中的代碼。源代碼下載每日前端實戰(zhàn)系列的全部源代碼請從下載代碼解讀定義,只有個元素居中顯示定義容器尺寸用偽元素畫出個像寶路薄荷糖狀的黑色圓環(huán)接下來制作動畫效果。 showImg(https://segmentfault.com/img/bVbhIKv?w=400&h=300); 效果預(yù)覽 按下右側(cè)的點擊預(yù)覽按鈕可以在當(dāng)前頁面預(yù)覽,...
閱讀 556·2021-10-19 11:45
閱讀 1372·2021-09-30 09:48
閱讀 1481·2021-08-16 10:56
閱讀 744·2021-07-26 23:38
閱讀 3216·2019-08-30 13:15
閱讀 2602·2019-08-30 12:45
閱讀 1838·2019-08-29 12:14
閱讀 2087·2019-08-26 18:42