javascript传值和传址

定义

关于传值和传址,权威指南有这么一些话:

在js中和在所有编程语言中一样,可以有三种重要的方式来操作一个数据值:

  • 首先,可以复制它。例如:把它赋给一个新的变量;
  • 其次,可以把它作为参数传递给一个函数或方法。
  • 再次,可以把它和另外一个值进行比较看两个值是否相等。

传值:

当一个数据是通过值被操作,那么所关系到的是数据的值。在赋值过程中,对实际的值制作了一份拷贝,这份拷贝存储到一个变量、对象属性或数组中。拷贝的值和原始的值是分别存储的两份完全独立的值。当一份数据通过值传递给一个函数,数据的一份拷贝被传递给了这个函数;如果函数修改了这个值,修改只会影响到函数所拥有的该数据的拷贝,而不会影响到原始数据。最后,当一个数据通过值和另一个数据作比较,两份继而不同的数据片段必须确实代表相同的值(意味着要进行逐个字节比较后发现是否相同)。

传址:

使用这种方式,数据值有一份真实的拷贝,被操作的是对该值的引用(地址)。如果以传址方式操作一个值,变量并不会直接存储该值,它们只是存储该值的地址,被复制、传递和比较的都是这个地址。因此,在传址的赋值操作中,只是这个值的地址被赋值,而不是这个值的一份拷贝,更不是值本身。在赋值后,新的变量所指向的值和原始变量所指向的值相同,两个地址都有效,都可以用来操作这个值。如果值通过一个地址发生了变化,这个改变也会影响原始变量。

表格:






















传值 传址
复制 实际复制的是值,存在两个不同的、独立的拷贝 复制的值是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的引用来说也可见。
传递 传递给函数的是值的一个独立拷贝,对它的改变在函数外部没有影响 传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见。
比较 比较的是两个独立的值(通常逐字节比较),以判断它们是否相等 比较的是两个引用,以判断它们引用的是否是同一个数值。对两个不同的数值的引用不相等,即使这两个数值是由相同的字节构成的

js基本规则:

基本数据类型(数字、布尔)通过传值来操作;引用类型(对象、数组和函数)通过传址操作。字符串通常被当作基本类型,因为它们不是对象。

1
2
Function instanceof Object  //true
Array instanceof Object //true

举例

看下面的demo:

1
2
3
4
new Object == new Object    //false
[] == [] //false
[1,2] == [1,2] //false
null == null //true

[] 和 [] 两个值看似一样,为什么不相等,这个设计到js的传值和传址。

用以下代码演示传值和传址的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//传值
var m = 10;
var n = m;
n = 2;

console.log(m); //10
console.log(n); //2
console.log(m == n); //false

//传址
var o1 = {};
var o2 = o1;
o1.x = 5;
var o3 = {};
var o4 = {};

console.log(o1 == o2); //true o1的引用地址赋值给o2,所以有相同地址,即相等
console.log(o3 == o4); //false 看起来是空对象,其实是两个不相同的引用地址,即不相等
console.log(o1.x); //5
console.log(o2.x); //5

javascript类型总览图

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2019 FE blog All Rights Reserved.

访客数 : | 访问量 :