首頁 >web前端 >js教程 >Js參數傳遞與變數複製

Js參數傳遞與變數複製

一个新手
一个新手原創
2017-10-26 10:05:061833瀏覽

   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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn