JavaScript高级程序设计-第3版-中 有这么一段话:

在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的①。

① 这种说法不严密,当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。

这里的重点是①的注释,初次看的时候没有理解,后来理解了,举个例子:

先看①的前半句,比较好理解:

当复制保存着对象的某个变量时,操作的是对象的引用。

var a = { n: 2 };    //这里把 { n: 2 } 赋值给 a,实际上是把 a 的指针指向 { n: 2 }
var b = a; //这里把 a 赋值给 b,实际上是把 b 的指针指向 a 的指针,最终是把 b 的指针指向上一个对象{ n: 2 };
var c = { n: 2 }; //这里把 { n: 2 } 赋值给 c,实际上是把 c 的指针指向 { n: 2 } ,但是这个对象和前面的对象不等,只有指针指向同一个对象时,两个对象才相等;
console.log(b); //{ n: 2 }
console.log(a === b); //true,b 保存是指针,a 也是,两个指针指向同一个对象,所以相等,所以 a,b 保存的都是同一个对象的引用
console.log(a === c); //false ,a,c 看起来相等,实际上是两个指针指向不同的对象;彼此没有发生引用关系;

这里还没有涉及到 ①的后半句:

但在为对象添加属性时,操作的是实际的对象。

这句话用来解释下面问题就很有用了:

var a = { n: 2 };
var b = a;
a.x = 1; // 操作的是对象 a 的引用还是实际对象 { n: 2 }?
console.log(a); // { n: 2, x: 1 }
console.log(b); // { n: 2, x: 1 }

如果按书上原话,操作的是对象 a 的引用,那这里就是把 a 由指向 { n: 2 } 转为 指向 { n: 2, x: 1 },如果这个逻辑是正确的,那么 b 应该还是 { n: 2 } ,然而事实不是,证明这个逻辑不对;

如果按照①的逻辑,操作的是实际的对象,那这里就是把 { n: 2 } 这个对象变成了 { n: 2, x: 1 },而 a,b 本身就指向的这个对象,所以 a,b 的输出自然就是 { n: 2, x: 1 },逻辑正确。

所以,当复制保存着对象的某个变量时,操作的是对象的引用。但在为对象添加属性时,操作的是实际的对象。

参考资料:

JavaScript高级程序设计-第3版-中

js 操作对象的引用和操作实际对象的区分的更多相关文章

  1. JS对象的引用,对象的拷贝

    目录 一.场景 二.浅拷贝 三.深拷贝 一.场景 除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝 将一个对象赋值给另外一个对象. var a = [1,2,3]; ...

  2. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  3. Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数

    本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder --- ...

  4. C#中字符串的处理,对象的引用及继承(Tenth day)

    又进入到了新的一周,现在到总结的时间了,继续为大家总结一下今天在云和学院所学的知识. 理论: StringBuilder 和 String 的区别    String 在进行运算时(如赋值.拼接等)会 ...

  5. 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用

    先看第一种情况:返回一个局部对象的引用.它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的.也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的.所谓生命空间,是指它们所在的 ...

  6. java String不可变对象,但StringBuffer是可变对象

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  7. js学习--DOM操作详解大全一(浏览器对象)

    一.客户端中的window对象 window对象表示当前浏览器的窗口,它是一个顶级对象,我们创建的所有对象.函数.变量都是window对象的成员. window对象自带了一些非常有用的方法.属性. w ...

  8. JS中的DOM对象及JS对document对像的操作

    DOM对象 windows:属性:opener(打开者) 方法:open().close(),setTimeout().setInterval()... location:属性:href 方法:rel ...

  9. js对象,数组,字符串的操作

    循环绑定=>变量污染 for (var i = 0;i<lis.length;i++){ lis[i].index = i;#给页面元素对象添加一个任意属性(保留索引的属性index) # ...

随机推荐

  1. Informix ConnetionString Pool Size

    Database=aa;Host=127.0.0.1;Server=ol_svr_custom;Service=9000;Protocol=onsoctcp;UID=informix;Password ...

  2. 基于Vivado的嵌入式开发 ——PS+PL实践

    基于Vivado的嵌入式开发 ——PS走起 硬件平台:ZedBoard 开发工具:Vivado 2014.2 1.规划 废话不多说,依然是流水灯,这次是采用PS+PL实现. 功能依旧简单,目标是为了学 ...

  3. 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...

  4. C++14系列(2):C/C++的时间函数

    C++笔记開始 为了好好研究下C++14.顺便复习下曾经的C++知识.搞了个git(不断完好中): https://github.com/rododo/cpp14examples.git 里面会慢慢封 ...

  5. Lucene:基于Java的全文检索引擎简介 (zhuan)

    http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...

  6. FreeRtos——移植

    现在准备的简单程序LED灯的工程目录中增加freertos文件夹: 在 source目录下的portable目录下只留下下面的文件夹: 为什么呢? 把对应文件移植在工程中之后,添加头文件路径如下图: ...

  7. 文件操作之格式化IO

    其实在我使用最多的文件操作中,还是喜欢格式化IO控制的方式,简单方便易理解. #include <stdio.h> #include<stdlib.h> int main() ...

  8. js跨域问题(2)

    前两天碰到一个跨域问题的处理,使用jsonp可以解决.(http://www.cnblogs.com/xtechnet/p/4123210.html) 最近再整理了一下: 非CORS 1.jsonp. ...

  9. SQL语句字符串处理大全

    常用的字符串函数有: 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用 ...

  10. web服务器优化的一些思路

    作为一个新手(并不是菜鸟,而是像我们这样的学生),维护一个网站往往是一个很头疼的问题,尤其是动态网站,更尤其是用java写的网站. 当网站的吞吐量很小的时候你会发现服务器根本不需要维护,因为几乎没有延 ...