ECMAScript 變數可能包含兩種不同資料型別的值:基本型別值和參考型別值。 基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。
5 種基本資料類型: Undefined、 Null、 Boolean、 Number 和 String。這 5 種基本資料類型是按值存取的,因為可以操作保存在變數中的實際的值。 ES6有多出一種Symbol類型。
引用類型的值是保存在記憶體中的對象,JavaScript 不允許直接存取記憶體中的位置,也就是說不能直接操作對象的記憶體空間。在操作物件時,實際上是在操作物件的參考而不是實際的物件。為此,引用類型的值是按引用存取的。
【複製變數值】複製基本型別變數的值,會在該變數物件上建立一個新值,然後把該值複製到新變數分配的位置上。任一變數值操作互不影響。
【複製引用指標】複製引用型別變數的值,同樣會將儲存在變數物件中的值複製一份放到新變數指派的空間中,不同的是這個值的副本實際上一個指針,而這個指針指向儲存在堆中的一個物件。複製後,兩個變數實際上將引用同一個物件。因此,改變任意變量,都會影響另一個變數。
ECMAScript 中所有函數的參數都是以值傳遞的。存取變數有按值和按引用兩種方式,而參數只能按值傳遞。
基本型別參數傳遞:傳給函數的是數值的複製,函數中對其的修改外部不可見。
var a = 1; var b = 2; function change(a, b) { var c = a; a = b; b = c; console.log(a); //2 console.log(b); //1 } change(a, b); console.log(a); //1 console.log(b); //2
引用類型參數傳遞:傳給函數的是數值的一個引用,函數中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見
var a = [1, 2, 3]; var b = [5, 6]; function change(a,b) { a[0] = 4; //对其属性的修改外部可见 var c = a; a = b; //用新引用覆盖 b = c; console.log(a); //"5,6" console.log(b); //"4,2,3" } change(a,b); console.log(a); //"4,2,3" console.log(b); //"5,6"
a,b是change函數中的變量,在調用函數時傳遞了a,b的引用賦給了這兩個變量,但是並不能改變全局中的a,b。因為用新引用覆蓋在外部不可見,因為函數只是拿到了引用 並沒有權力更改引用。
var a = [1, 2, 3]; var b = [5, 6]; function change() { var c = a; a[0] = 4; //对其属性的修改外部可见 a = b; //用新引用覆盖 b = c; } change(a,b); console.log(a); //"5,6" console.log(b); //"4,2,3"
因為js沒有區塊級作用域,所以它在change裡找不到變數a,b就會自覺的到上層去找,所以這裡的a,b是全域變數的參考。
☞☞☞深究JavaScript系列☜☜☜
ECMAScript 變數可能包含兩種不同資料型別的值:基本型別值與引用型別值。 基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。
5 種基本資料類型: Undefined、 Null、 Boolean、 Number 和 String。這 5 種基本資料類型是按值存取的,因為可以操作保存在變數中的實際的值。 ES6有多出一種Symbol類型。
引用類型的值是保存在記憶體中的對象,JavaScript 不允許直接存取記憶體中的位置,也就是說不能直接操作對象的記憶體空間。在操作物件時,實際上是在操作物件的參考而不是實際的物件。為此,引用類型的值是按引用存取的。
【複製變數值】複製基本型別變數的值,會在該變數物件上建立一個新值,然後把該值複製到新變數分配的位置上。任一變數值操作互不影響。
【複製引用指標】複製引用型別變數的值,同樣會將儲存在變數物件中的值複製一份放到新變數指派的空間中,不同的是這個值的副本實際上一個指針,而這個指針指向儲存在堆中的一個物件。複製後,兩個變數實際上將引用同一個物件。因此,改變任意變量,都會影響另一個變數。
ECMAScript 中所有函數的參數都是以值傳遞的。存取變數有按值和按引用兩種方式,而參數只能按值傳遞。
基本型別參數傳遞:傳給函數的是數值的複製,函數中對其的修改外部不可見。
var a = 1; var b = 2; function change(a, b) { var c = a; a = b; b = c; console.log(a); //2 console.log(b); //1 } change(a, b); console.log(a); //1 console.log(b); //2
引用類型參數傳遞:傳給函數的是數值的一個引用,函數中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見
var a = [1, 2, 3]; var b = [5, 6]; function change(a,b) { a[0] = 4; //对其属性的修改外部可见 var c = a; a = b; //用新引用覆盖 b = c; console.log(a); //"5,6" console.log(b); //"4,2,3" } change(a,b); console.log(a); //"4,2,3" console.log(b); //"5,6"
a,b是change函數中的變量,在調用函數時傳遞了a,b的引用賦給了這兩個變量,但是並不能改變全局中的a,b。因為用新引用覆蓋在外部不可見,因為函數只是拿到了引用 並沒有權力更改引用。
var a = [1, 2, 3]; var b = [5, 6]; function change() { var c = a; a[0] = 4; //对其属性的修改外部可见 a = b; //用新引用覆盖 b = c; } change(a,b); console.log(a); //"5,6" console.log(b); //"4,2,3"
因為js沒有區塊級作用域,所以它在change裡找不到變數a,b就會自覺的到上層去找,所以這裡的a,b是全域變數的參考。
以上是Js參數傳遞與變數複製的詳細內容。更多資訊請關注PHP中文網其他相關文章!