首先看传值与传址的比较:
传值 | 传址 | |
复制 | 实际复制的是值,存在两个不同的、独立的拷贝 | 复制的只是对数值的引用。如果通过这个新的引用修改了数值,则这个改变对最初的引用来说也可见 |
传递 | 传递给函数的是值的一个独立拷贝,对它的改变在函数外部没有影响 | 传递给函数的是对数值的一个引用。如果在函数里通过传递给它的引用修改了数值,则这个修改对外部可见 |
比较 | 比较的是两个独立的值(通常是逐字节的比较),以判断它们是否相同 | 比较的是两个引用,以判断它们是否引用到同一数值。对两个不同的数值的引用不相等,即使这两个数值的值具体相同的字节 |
在JavaScript中,不同的类型会有不同的传递方式:
传值 | 传址 |
数字、布尔值、(字符串?) | 所有的对象 |
实际上,也不能这么简单的归类。和java一样,我们也可以统称它们都是按值传递的,只不过对于对象类型,所谓的值,不是对象具体含有的值,而是指这个对象地址。
另外,和Java一样,JavaScript中的字符串是不可修改的,因此实际上字符串按哪种方式传递就显得无关紧要了。