Javascript笔记:非基本类型值的传递

在JS中,非基本类型的传递是通过传递“引用的拷贝”进行的。引用指向值。不能简单类比指针的思维模型。

例子1

var a = 2;
var b = a; // b 是 a 中的值的复制
b++;
a; // 显然输出是 2
b; // 3

var c = [1,2,3];
var d = c; // d是c的引用的复制,指向数组 [1,2,3]
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]

例子2: 与指针的区别

var a = [1,2,3];
var b = a;

b = [4,5,6];
a; // [1,2,3]

这里,b指向了新的值,a不受影响。但如果push则不一样(见例3)。

例子3: 非基本类型值作为函数参数

function foo(x) {
    x.push( 4 );
    x; // [1,2,3,4],注意这里push后,x和a仍指向同一个值
    x = [4,5,6]; //这里x指向新的值
    x.push( 7 );
    x; // [4,5,6,7]
}

var a = [1,2,3];

foo( a );

a; // 是[1,2,3,4],而不是[4,5,6,7]

例子4: 返回非基本类型值

function returnObj() {
  var obj = { a:3 };
  return obj; 
}

var b = returnObj(); 
var c = returnObj(); // 这里c指向了另一个对象值,和b指向的值不同

b.a = 2;
c.a; //由于不是同一个值,c自然不会受到影响

例子5: 利用引用修改基本类型值

function add1(x) {
  x++;
}

var a=3;
add1(a);
a; //显然a仍是3
  

可以对a进行包装

var obj = { a: 2};

function add1(obj) {
  obj.a++;
}

obj.a; //3

另外,这里用Number进行包装是不可行的,因为无法修改Number对象里的标量值。

function foo(x) {
    x = x + 1; //加法时类型转换,赋值后x是基本类型值3
    x; // 3
}

var a = 2;
var b = new Number( a ); // 或者 `Object(a)`

foo( b );
console.log( b ); // Number {2},未改变

参考资料:https://github.com/getify/You-Dont-Know-JS/blob/1ed-zh-CN/types%20%26%20grammar/ch2.md

猜你喜欢

转载自www.cnblogs.com/zzzeto/p/11666801.html
今日推荐