今遇js基礎類型等問題,已經有點模糊,遂做總結。javascript
前言:java
JavaScript原始類型:Undefined、Null、Boolean、Number、String、Symbol JavaScript引用類型:Object;函數
原始類型又被稱爲基本類型,原始類型保存的變量和值直接保存在棧內存(Stack)中,且空間相互獨立,經過值來訪問;雖然原始類型的值是儲存在相對獨立空間,可是它們之間的比較是按值比較的;ui
引用類型即Object 類型,再往下細分,還能夠分爲:Object 類型、Array 類型、Date 類型、Function 類型 等。與原始類型不一樣的是,引用類型的內容是保存在堆內存中,而棧內存(Heap)中會有一個堆內存地址,經過這個地址變量被指向堆內存。spa
一個咱們常常遇到的問題:「JS中的值是按值傳遞,仍是按引用傳遞呢?」code
因爲js中存在複雜類型和基本類型,對於基本類型而言,是按值傳遞的.對象
var a = 1; function test(x) { x = 10; console.log(x); } test(a); // 10 console.log(a); // 1
雖然在函數test
中a
被修改,並無有影響到 外部a
的值,基本類型是按值傳遞的.ip
咱們將外部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
纔對.
此時的複雜類型同時表現出了按值傳遞
和按引用傳遞
的特性.
複雜類型之因此會產生這種特性,緣由就是在傳遞過程當中,對象a
先產生了一個副本a
,這個副本a
並非深克隆獲得的副本a
,副本a
地址一樣指向對象a
指向的堆內存.
所以在函數體中修改x=10
只是修改了副本a
,a
對象沒有變化. 可是若是修改了x.a=10
是修改了二者指向的同一堆內存,此時對象a
也會受到影響.
有人講這種特性叫作傳遞引用,也有一種說法叫作按共享傳遞.