84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
var orderObj = {};$scope.orderObj = orderObj;orderObj = {a:2};console.log(orderObj);console.log($scope.orderObj);
输出Object {a: 2}Object {}请问是为什么?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
var orderObj = {}; $scope.orderObj = orderObj; orderObj.a = 2; // 问题在这里, 你把orderObj重新赋值了, 但是$scope中还是指向旧的orderObj console.log(orderObj); console.log($scope.orderObj);
这个实际上和angular无关。
var a = {} b = a a = { a: 2 } console.log(a) // { a: 2 } console.log(b) // {}
导致这个现象的原因是赋值表达式,根据ECMA规范中的定义赋值运算符的产生式(production)以及运算过程如下:
The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
Let lref be the result of evaluating LeftHandSideExpression.
Let rref be the result of evaluating AssignmentExpression.
Let rval be GetValue(rref).
Throw a SyntaxError exception if the following conditions are all true:
Type(lref) is Reference is true
IsStrictReference(lref) is true
Type(GetBase(lref)) is Environment Record
GetReferencedName(lref) is either "eval" or "arguments"
Call PutValue(lref, rval).
Return rval.
它会首先对两边表达式求引用,再对右边表达式求值,并将值更新给左边的引用,也就是说对右边的引用求值后,是直接将指向{}的地址赋给了左边,而不是a指向b,b再指向一个对象。
{}
我写过一篇比较粗糙的文章:http://segmentfault.com/a/1190000002965140 希望对你有帮助
你这根本就是没搞清楚 。。。scope 是一个暴露给view用的数据模型, 这里面的数据定义的$scope开头的变量,只有用$scope开头才能调用,如果不加就只是当前文件的变量,所以你这两个,两个根本就在两个不同的 作用域里面,orderObj =xxx 这样的赋值根本就不会赋值到scope的orderObj 上去
$scope.orderObj还是指向第一个orderObj,当然没有值啊
这个实际上和angular无关。
导致这个现象的原因是赋值表达式,根据ECMA规范中的定义赋值运算符的产生式(production)以及运算过程如下:
Let lref be the result of evaluating LeftHandSideExpression.
Let rref be the result of evaluating AssignmentExpression.
Let rval be GetValue(rref).
Throw a SyntaxError exception if the following conditions are all true:
Type(lref) is Reference is true
IsStrictReference(lref) is true
Type(GetBase(lref)) is Environment Record
GetReferencedName(lref) is either "eval" or "arguments"
Call PutValue(lref, rval).
Return rval.
它会首先对两边表达式求引用,再对右边表达式求值,并将值更新给左边的引用,也就是说对右边的引用求值后,是直接将指向
{}
的地址赋给了左边,而不是a指向b,b再指向一个对象。我写过一篇比较粗糙的文章:http://segmentfault.com/a/1190000002965140 希望对你有帮助
你这根本就是没搞清楚 。。。scope 是一个暴露给view用的数据模型, 这里面的数据定义的$scope开头的变量,只有用$scope开头才能调用,如果不加就只是当前文件的变量,所以你这两个,两个根本就在两个不同的 作用域里面,orderObj =xxx 这样的赋值根本就不会赋值到scope的orderObj 上去
$scope.orderObj还是指向第一个orderObj,当然没有值啊