var a = [1],b=[1]; a==b; //fasle var c = b; c[0]=2; b //[2] c = [3]; b //[2]
解釋:b對c說,我贊成你跟我共用一個內存地址,你能夠在個人內存地址內,修改局部成員,可是你要連個人家都給挪走,對不起 你本身走。。。微信
ECMAScript 中全部函數的參數都是按值傳遞的。訪問變量有按值和按引用兩種方式,而參數只能按值傳遞。
函數
基本類型參數傳遞:傳給函數的是數值的一個複製,函數中對其的修改外部不可見。spa
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
引用類型參數傳遞:傳給函數的是數值的一個引用,函數中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見code
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是全局變量的引用。
歡迎搜索微信公衆號:一線碼農
或掃碼關注:ip