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是全局變量的引用。對象