下面是測試代碼:Javascript:形式參數和參數對象之間有什麼區別?
function fn(i, j) {
arguments = [3, 4];
console.log(i, j); // 1, 2
console.log(arguments); // [3, 4]
}
fn(1, 2);
的功能,我重置arguments
對象
然而,爭論對象改變,但在不chaned傳遞的形式參數,我想他們是一樣的,那麼有什麼區別?
下面是測試代碼:Javascript:形式參數和參數對象之間有什麼區別?
function fn(i, j) {
arguments = [3, 4];
console.log(i, j); // 1, 2
console.log(arguments); // [3, 4]
}
fn(1, 2);
的功能,我重置arguments
對象
然而,爭論對象改變,但在不chaned傳遞的形式參數,我想他們是一樣的,那麼有什麼區別?
arguments
是一個類似數組的對象,它引用了傳遞給它的所有參數。在這裏,你只是重新分配arguments
指向一些其他的對象。如果你想改變實際的參數,你必須改變的arguments
的元素,像這樣
function fn(i, j) {
arguments[0] = -1;
console.log(i, j); // -1, 2
console.log(arguments); // { '0': -1, '1': 2 }
}
fn(1, 2)
arguments對象引用不是一個數組。它與Array類似,但 除長度外沒有任何數組屬性。例如,它沒有彈出方法 。
然而,它可以被轉換爲一個真正的數組:
變參= Array.prototype.slice.call(參數);
如果陣列泛型 是可用的,可以使用代替下列:
變參= Array.slice(參數);
您正在用新數組替換參數數組(實際上是一個類似數組的對象)。它們是獨立的對象並且並排存在。替換arguments
變量的引用不會使該函數使用新數組作爲參數,它仍然具有對原始對象的內部引用。
如果更改arguments
對象的內容,它將反映在函數參數:
function fn(i, j) {
arguments[0] = 3;
arguments[1] = 4;
console.log(i, j); // 3, 4
console.log(arguments); // [3, 4]
}
fn(1, 2);
'函數fn(I,J){ 參數[0] = 3; 參數[1] = 4; console.log(i,j); // 1,2現在是3,4 console.log(arguments); // [3,4] }' 'fn(1,2);' 使用參數對象的數組索引可以更改正式參數! –
如果您對參數對象和局部變量如何協同工作更感興趣,我會向您推薦一個答案,我發佈了一個不同的問題,我試圖在代碼中編寫ECMA規範中編寫的內容([LINK]( http://stackoverflow.com/a/17478232/1258878))。簡而言之:它可以與getter和setter一起使用局部變量。這也應該表明,你不能忽略整個對象而不會失去這種行爲(就像其他人已經正確發佈)。 – basilikum