JavaScript是按引用傳遞or值傳遞?

今遇js基礎類型等問題,已經有點模糊,遂做總結。javascript

 

前言:java

JavaScript原始類型:Undefined、Null、Boolean、Number、String、Symbol JavaScript引用類型:Object;函數

原始類型又被稱爲基本類型,原始類型保存的變量和值直接保存在棧內存(Stack)中,且空間相互獨立,經過值來訪問;雖然原始類型的值是儲存在相對獨立空間,可是它們之間的比較是按值比較的;ui

引用類型即Object 類型,再往下細分,還能夠分爲:Object 類型、Array 類型、Date 類型、Function 類型 等。與原始類型不一樣的是,引用類型的內容是保存在堆內存中,而棧內存(Heap)中會有一個堆內存地址,經過這個地址變量被指向堆內存。spa

1.JavaScript中的基本類型傳遞

一個咱們常常遇到的問題:「JS中的值是按值傳遞,仍是按引用傳遞呢?」code

因爲js中存在複雜類型和基本類型,對於基本類型而言,是按值傳遞的.對象

var a = 1; function test(x) { x = 10; console.log(x); } test(a); // 10 console.log(a); // 1

雖然在函數testa被修改,並無有影響到 外部a的值,基本類型是按值傳遞的.ip


2.複雜類型按引用傳遞?

咱們將外部a做爲一個對象傳入test函數.內存

var a = { a: 1, b: 2 }; function test(x) { x.a = 10; console.log(x); } test(a); // { a: 10, b: 2 } console.log(a); // { a: 10, b: 2 }

能夠看到,在函數體內被修改的a對象也同時影響到了外部的a對象,可見覆雜類型是按引用傳遞的.it

但是若是再作一個實驗:

var a = { a: 1, b: 2 }; function test(x) { x = 10; console.log(x); } test(a); // 10 console.log(a); // { a: 1, b: 2 }

外部的a並無被修改,若是是按引用傳遞的話,因爲共享同一個堆內存,a在外部也會表現爲10纔對.
此時的複雜類型同時表現出了按值傳遞按引用傳遞的特性.


3.按共享傳遞

複雜類型之因此會產生這種特性,緣由就是在傳遞過程當中,對象a先產生了一個副本a,這個副本a並非深克隆獲得的副本a,副本a地址一樣指向對象a指向的堆內存.

所以在函數體中修改x=10只是修改了副本a,a對象沒有變化. 可是若是修改了x.a=10是修改了二者指向的同一堆內存,此時對象a也會受到影響.

有人講這種特性叫作傳遞引用,也有一種說法叫作按共享傳遞.

相關文章
相關標籤/搜索