JS 对象引用问题
var a = {n:1};
var b = a;
a = {n:2};
a.x = a ;
console.log(a.x);
console.log(b.x);
var a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.x);
console.log(b.x);
这两个问题主要理解两点就很简单了。
对象是引用类型,改变赋值只是改变指针的引用。运算符=相当于改变指针的指向。
运算符的优先级。. > =。 即:在a.x = a = {n:2};中,先给对象a添加x属性,再进行a={n:2}与a.x={n:2}两个赋值操作。
问题1:
// 变量a 指针指向对象 {n:1}
var a = {n:1};
// 变量b 指针指向对象 {n:1}
var b = a;
// 变量b指针不变,仍指向{n:1}; 变量a指针改为指向对象 {n:2}
a = {n:2};
// 注意运算符的优先级。先给对象a增加x属性,再给x属性赋值。此时x属性的值指向a对象自身。即:a = {n:2,x:a}
a.x = a ;
console.log(a.x); // {n:2,x:a}
// 由于b指针没变,还是指向{n:1} ,故b.x: undefined
console.log(b.x);
问题2:
var a = {n:1};
// b与a的指针均指向 {n:1}
var b = a;
// 注意运算符优先级`.` > `=`
// 先给a添加x属性。故添加x属性后,a指向的对象{n:1}变为{n:1, x:undefined/待赋值}, 由于b是和a指向的同一个对象,所以此时b={n:1, x:undefined/待赋值}
// 赋值操作(从右往左进行)。 a = {n:2}, a的指针由指向{n:1,x:{n:2} 变为指向对象 {n:2}
// 然后再进行赋值操作。a.x = {n:2} ,故x属性的值为{n:2},由于b是和a指向的同一个对象,此时a=b={n:1,x:{n:2}
a.x = a = {n:2};
// 此时a={n:2}, 故a.x为undefined
console.log(a.x);
// b指针始终没变,b={n:1,x:{n:2}}, 故b.x为{n:2}
console.log(b.x);
JS 对象引用问题的更多相关文章
- 深度克隆---js对象引用
首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说就是js对象了. 引用类型的赋值其实是对象保 ...
- 关于js对象引用的小例子
看完下面的代码,相信对js对象引用又有了新的认识,直接上代码: // split()把字符串分割成字符串数组 // reverse() 会改变数组本身,**并返回原数组的引用**.!!!! var a ...
- js对象引用和赋值
体验更优排版请移步原文:http://blog.kwin.wang/programming/js-object-reference-assign.html 先看一个简单例子, var obj = { ...
- js对象引用赋值后
a={f:1} b={} b.a=a console.log(b.a) a.b=2 console.log(b.a) a={f:1} b={} b.a=a console.log(b.a) a={b: ...
- JS对象引用
对象和函数都是引用的关系(改变后者会改变前者) 但是下面这个列子情况不一样了.刚开始的时候 B 引用了 A的地址,后来B又重新赋值,新占了一个地址,A B俩的关系已经脱离. 那么有的时候,我们只有 ...
- js 对象引用传值
1)当变量是一个对象(例如:{}或[]),使用 a = b = {} 这种形式传值的话,会变成会用传值,修改 a 时 b 会相应变化,修改 b 时 a 也一样会相应变化 var a = b = {}; ...
- js对象引用的注意
var p = {}; var arr = []; function a(param) { // var i = param.a; for (var i = 0; i < 3; i++) { p ...
- 第二十二课:js事件原理以及addEvent.js的详解
再看这篇博客之前,希望你已经对js高级程序编程一书中的事件模块进行了详读,不然我只能呵呵了. document.createEventObject,在IE下创建事件对象event. elem.fire ...
- Vue2.0父子组件之间的双向数据绑定问题解决方案
对于vue 1.0项目代码,如果把vue换成vue 2.0,那么之后项目代码就完全奔溃不能运行,vue 2.0在父子组件数据绑定的变化(不再支持双向绑定)颠覆了1.0的约定,很遗憾. 解决方案只有两种 ...
随机推荐
- LeetCode(2): 两数相加
本内容为LeetCode第二道题目:两数相加 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 10:47:12 201 ...
- java 得到目录路径的方法
得到web项目的根目录路径 System.getProperty("user.dir")// String path = this.getServletContext().getR ...
- 小学生都看得懂的C语言入门(3): 数组与函数
#include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...
- Java接口自动化测试之集成MyBatis和MySQL (五)
pom.xml新增dependency <dependency> <groupId>org.mybatis</groupId> <artifactId> ...
- 计蒜客31452 Supreme Number(找规律)
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
- dubbo的工作原理
dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客户端的 ...
- BootStrap标题制作模板
<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="UTF-8&q ...
- Java基础知识➣环境搭建与类型整理(一)
概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以 ...
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡
题解: 网上有一种复杂的方法..好像复杂度并没有优势就没看 定义f[i]表示i的期望经过次数,f[i]=sigma{f[j]*p/q/du[j]}+(i==1); 然后高斯消元就可以了 最后求出来的f ...
- Netty断线重连
Netty断线重连 最近使用Netty开发一个中转服务,需要一直保持与Server端的连接,网络中断后需要可以自动重连,查询官网资料,实现方案很简单,核心思想是在channelUnregistered ...