深究JavaScript——參數傳遞與變量複製

   ECMAScript 變量可能包含兩種不一樣數據類型的值:基本類型值和引用類型值。 基本類型值指的是簡單的數據段,而引用類型值指那些可能由多個值構成的對象。git

  5 種基本數據類型: Undefined、 Null、 Boolean、 Number 和 String。這 5 種基本數據類型是按值訪問的,由於能夠操做保存在變量中的實際的值。ES6有多出一種Symbol類型。github

訪問變量

  引用類型的值是保存在內存中的對象,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。由於用新引用覆蓋在外部不可見,由於函數只是拿到了引用 並無權力更改引用。code

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系列☜☜☜blog

相關文章
相關標籤/搜索