关于js的连续赋值
2015-04-06 13:37
288 查看
首先,来看一个经典的案例:
<script>
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
alert(a.x);
alert(b.x);
</script>
答案是什么呢?
首先,js中规定求值顺序是从左到右的,这个问题很容易忽略。什么意思呢,a.x = a = {n: 2},这句代码应该怎样理解呢?等价于a.x = (a = {n: 2}),在js中,类似的连续赋值是从左到右进行的,也就是说先对a.x进行赋值,再对a进行赋值。可能很难讲清楚,这里结合js中引用类型和引用类型的赋值,请看下面的注释分析:
当然你也可以alert(b.x.n)试试,结果是2
<script>
var a = {n: 1}
var b = a;
a.x = a = {n: 2}
alert(a.x);
alert(b.x);
</script>
答案是什么呢?
首先,js中规定求值顺序是从左到右的,这个问题很容易忽略。什么意思呢,a.x = a = {n: 2},这句代码应该怎样理解呢?等价于a.x = (a = {n: 2}),在js中,类似的连续赋值是从左到右进行的,也就是说先对a.x进行赋值,再对a进行赋值。可能很难讲清楚,这里结合js中引用类型和引用类型的赋值,请看下面的注释分析:
<script> var a = {n: 1}//引用类型的赋值,没有问题 var b = a;//这句代码后,a和b都共同指向{n:1}这个内存中对象,所以a和b的改变(这里的改变不包含对a和b重新赋值),都会影响到{n:1},也就是说,a和b会互相影响,当然不包括对a和b重新赋值 a.x = a = {n: 2}//ok,这句话很重要,这个地方表面上看起来有些矛盾,其真实意思是,由于js中连续赋值是从左到右的,所以先将{n:2}赋给a.x,此时a和b所共同指向的对象已经变成了{n:1,x:{n:2}},ok然后呢,将{n:2}赋给a,所以,这句之后的结果就是:b依然指向以前的对象,而这个对象已经变成{n:1,x:{n:2}},而a由于赋值已经和以前的对象脱离了关系此时的a是{n:2}。 alert(a.x);//所以a.x是undefined alert(b.x);//b.x是{n:2},所以alert的结果是:[object object] </script>
当然你也可以alert(b.x.n)试试,结果是2
相关文章推荐
- 关于一个js连续赋值问题之我见(词略穷,见谅)
- Question:关于C#连续赋值的面试题
- JS中关于带操作赋值的一个小问题
- ASP.Net 关于前台JS给input赋值后,runat="server" 后台利用ID.Value还是获取不到的问题
- js引用类型指针及js连续赋值
- 关于js连等赋值的问题
- 关于JS客户端对服务器控件赋值,Post后不能保留值的解决办法
- JS连续赋值与求值顺序
- js 连续赋值的简单实现
- JS 连续等号赋值问题
- 学习笔记--JS中变量的赋值(连续赋值)
- 一个讨论引发关于js中函数声明,函数表达式,形参与变量声明赋值引发的一些事
- js连续赋值、指针
- 关于编辑器js赋值问题
- 关于js赋值给input解析
- js 连续赋值运算
- Answer:关于C#连续赋值的面试题
- 转载:写了10年Javascript未必全了解的连续赋值运算 --> 说明了JS中变量是引用
- JS:连续赋值运算
- js中关于逻辑符号的连续使用问题