博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
连续赋值与循环引用
阅读量:5038 次
发布时间:2019-06-12

本文共 1134 字,大约阅读时间需要 3 分钟。

连续赋值与循环引用

连续赋值

以下两端代码的结果:

var foo = {n:1};var bar = foo;foo = {n:2};foo.x = foo;// foo.n = foo = {n:2};console.log(foo.x);console.log(bar.x);var foo = {n:1};var bar = foo;foo.x = foo = {n:2};console.log(foo.x);console.log(bar.x);

第一段:

{
n:2,
x:{
n:2,
x:{}//无限层
}
}
undefined

这边,其实我不太理解,为嘛自己指向自己还可以无限展开,感觉像是盒子里面装了个盒子,盒子里还是盒子,后来自己甩了自己一耳光,这哪里是盒子,这根本就是个跳转本页的超链接而已......

第二段:

undefined
{n:2}

结果还是蛮奇怪的,众所周知赋值语句从右往左执行,第一种无非是把第二种按照此种理解拆分开来,结果却不同。

第一种结果就不解释了,这只是很基本的_引用赋值_。

这里赘述一句:解释器对声明变量函数的语句(var x = 1)返回undefined,赋值语句(x = 2)则返回值(2)

理解第二种,需要了解js中的变量机制,其实所有的变量都是指向一个内存地址,无论引用或者基本变量。

var a = 's';//申明了s,那s就占据一块内存,然后a指向这块内存var b ;var a = a + b;log(a)//'sundefined'//其实没有改变开始的s,而是新建了sundefined的字符串,然后改变a的指向,垃圾回收器发现没人要s了,就收走了。

这在引用类型中更加明显。

var a = {n:1};a.x = 3;var b = a;//{n:1,x:3}var a = {n:2};//{n:2}

a.x = 3不是给a.x赋值,而是给{n:1}.x赋值,而后a又指向了{n:2}x是谁就完全不知道了。

主要看第二种,第二种的编译顺序是这样的:

var foo;var boo;foo = {n:1};boo = foo;foo.x = ();//()内是一个值,而且foo指向的是{n:1}//编译顺序跟执行顺序是有些小差异的,从上往下执行,但是发现后面是个表达式就需要先执行,然后再赋值。foo = {n:2};//foo现在指向{n:2}console.log(foo.x)//{n:2}完全不认识xconsole.log(boo.x)//这哥们一直指向挂着x的{n:1}

转载于:https://www.cnblogs.com/mydia/p/6901205.html

你可能感兴趣的文章
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&&打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
【转载】 IP实时传输协议RTP/RTCP详解
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
Linux系统的数据写入机制--延迟写入
查看>>
css3动画——基本准则
查看>>
SQLite详解,案例,手册
查看>>
创建自己的内容提供器
查看>>
SSRS 数据源访问Cube 无法创建订阅的解决方法
查看>>
Spring之SpringMVC
查看>>
[转载]限制排列与棋盘多项式{理论}
查看>>
cookie、session 整理
查看>>
js 设计模式——观察者模式
查看>>
[nowcoder]再编号
查看>>
redis学习小结
查看>>