料青山看我應如是
2019-12-04 12:34:13
我為什么可以這樣做:Array.prototype.foo = function() { this.splice(0, this.length); return this.concat([1,2,3]);}但是我不能這樣做:Array.prototype.foo = function() { return this = [1,2,3];}這兩個函數都破壞了this的值并將其更改為,[1,2,3]但是第二個函數拋出以下錯誤:Uncaught ReferenceError: Invalid left-hand side in assignment我懷疑這是因為允許分配意味著我可以將數組更改為其他內容(例如字符串),但是我希望那里的人可以肯定并且/或者有更詳細的解釋。
3 回答

波斯汪
TA貢獻1811條經驗 獲得超4個贊
您正在將對象與引用混淆。
當您像[1,2,3]創建新數組一樣使用文字時,數組就是一個對象。
變量名稱(例如this或)a是對對象的引用。如果有幫助,可以將一個對象想象為一個人,將引用想象為其昵稱。您可以對同一對象有多個引用,例如:
var a = [1,2];
var b = a;
b.push(3);
alert(a.length); // Gives "3"
想象一下,如果您有一個名為Sarah的朋友。您有時也稱她為“ Ace”。如果Sarah有一天理發,那么Ace也會理發,因為“ Sarah”和“ Ace”是同一個人的不同名字。
如果您使用諸如a.push或a.splice(concat但是不是一個?。┲惖淖儺悢到M方法,則您將更改現有的Array對象,并且a仍然引用相同的對象。這就像剪頭發-您看起來可能有所不同,但您仍然是同一個人。
使用分配對新值的引用時a = [1,2,3],您將創建一個新數組,并更改a為引用它。這就像找到一個有著不同頭發的新朋友,然后決定給她打A牌一樣。
現在this是由Javascript生成的特殊名稱。它不是像Sarah這樣的名字,而是更多的標題,例如“ mother”。您的媽媽可以換個新發型,但是您不能換個新媽媽。同樣,您不能this從函數內部更改引用的內容。
添加回答
舉報
0/150
提交
取消