js连等赋值

引用:http://www.iteye.com/topic/785445

    https://segmentfault.com/q/1010000002637728

这是一个问题

1  var a = {n:1}; //a指向了一块地址{n:1};
2  var b = a;  //持有a,以回查  //b对a的引用,也指向那块地址{n:1};
3  a.x = a = {n:2};
4  alert(a.x); // --> undefined
5  alert(b.x); // --> {n:2}

js赋值是右结合的,从右边开始向左边赋值

1 A1 = A2 = A3 //等价于
3 A1 = (A2 = A3)
4 //所以全部都是A3的值

上面的问题,在于:

a.x=a={n:2};

错误猜想:a 先赋值为{n:2},a.x 发现 a 被重写后(之前a是{a:1}),a.x = {n:2} 引擎限制a.x赋值,忽略了。 (因为b.x 有输出)

之前状态:

赋值后:

也就是说 a.x 还是指向之前那块地址,后面a又指向了一块新地址{n:2},不再指向之前的地址。若没有b,则找不到a.x的值(但它存在,只是没有指针指向它)。

a.x指向之前的地址是因为:  .运算符优先于=赋值运算

1、先声明a对象的x属性(a指向{n:1})

2、对a赋值,指向{n:2}

3、再对a.x赋值(原来的a,也就是b)

另外,少用连等符号,会出现全局变量

1 (function(){
2 var a=b=1;
3 }())
4 console.log(b); // 1    变成全局变量
5 console.log(a); //报错,因为不存在
时间: 2024-10-14 04:05:19

js连等赋值的相关文章

Angular.js 中 copy 赋值与 = 赋值 区别

转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.user 改变?angular.copy 和 = 号赋值有什么区别呢?新手还没有搞懂,请教各位了. <!DOCTYPE html> <html> <script src= "http://apps.bdimg.com/libs/angular.js/1.3.9/angular

Js的引用赋值与传值赋值

要说js的赋值方式时首先要说明js的数值类型:基本类型和引用类型. 1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值. 当基本类型的数据赋值时,赋得是实际的值,a和b是没有关联关系的,b由a复制得到,相互独立.(字面量的才是基本类型) var a=10; var b=a; console.log(a+','+b);    // 10,10a++;console.

JS 数据类型、赋值、深拷贝和浅拷贝

js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 Null.NULL或其他变量完全不同. undefined. 变量未定义时的属性. Number. 表示数字,例如: 42 或者 3.14159. String. 表示字符串,例如:"Howdy" Symbol ( 在 ECMAScript 6 中新添加的类型)..一种数据类型,它的实例是

js对象等号赋值的bug

var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x); 有道题是这样的,觉得很奇葩,分析一下 1.对象 引用类型 对象属于引用类型,c,java,js里面都是的,对象就是引用类型,包括数组. 上面的a是引用类型,a保存的是对象 {n: 1}的地址,对这个对象的引用.b = a .把a里面的地址赋值给了b,b也指向{n: 1}这个对象的物理地址.所以,a 一旦做赋值更改,修改的是a对引用的修改

关于js对input赋值的问题

//这种写法有时会失效,特别是他的父元素是dosplay:none时 $("#imgtalk").val("值"); //可正常赋值 $("#imgtalk").attr("value","值"); //js原始写法 document.getElementById("imgtalk").value="值"; 原文地址:https://www.cnblogs.com/z

js创建对象并赋值其属性,以及判断是否有属性值

对象定义 var obj = new Object(); 或 var obj = {}; 添加属性 obj.name = 'tom'; obj.ses='man'; 添加方法 obj.say = function(){ alert('22222'); } 调用 obj.say(); 修改属性 obj.name='jack'; 删除属性 obj.name = undefined; obj.say = undefined; 其name.say属性仍存在obj对象中,怎样才能在obj中移除name属性

js循环变量赋值

例1:循环赋值  a1=1,a2=2,a3=3,a4=4...a100=100 for (var i = 0; i < count; i++) { eval('a'+j+ '="'+ (i+1) + '"'); }; 例2:循环赋值  aa=1,ab=2,ac=3,ad=4...az=26; for (var i = 0; i < count; i++) { eval( 'a'+String.fromCharCode(97+i)+ '="'+ (i+1) + '&

js连等赋值的陷阱

先来看一段代码: (function(){ var x = y = 1; })(); console.log(y); console.log(x); 最开始我觉得这道题简直是送分题啊,很明显结果为,y=1;x=1 然后当我在控制台输出以后,感觉一记响亮的耳光,输出结果: 结论:上面的结果是因为变量提升和连等赋值造成的. 分析:上面的 var x=y=1 容易理解为var x=y,var y=1; 因为这里使用了连等赋值,连等操作符赋值是从右向左的,相当于 y=1; var x =y; 然后又因为

JS学习之赋值与赋引用

1.基本类型 基本的数据类型有:undefined,boolean,number,string,null. 基本类型存放在栈区,访问是按值访问的,就是说你可以操作保存在变量中的实际的值. 当基本类型的数据赋值时,赋得是实际的值,a和b是没有关联关系的,b由a复制得到,相互独立.(字面量的才是基本类型) 2.引用类型(对象)引用对象存放的方式是:在栈中存放对象变量标示和该对象在堆中的存放地址,在堆中存放数据.即名称和地址 对象使用的是引用赋值.当我们把一个对象赋值给一个新的变量时,赋的其实是该对象