角度扩展和复制理解

时间:2016-08-30 12:16:19

标签: angularjs

我知道在javascript中“===等值和相等类型”是控制值和类型。我有两个角度的例子,我很困惑。

 var o1 = { name: 'David', age: 26, skill: {} };
 var o2 = angular.copy(o1);

 console.log(o2);
 // Output: { name: 'David', age: 26, skill: {} }

 console.log(o1 === o2);
 // Output: false

 console.log(o1.skill === o2.skill);
 // Output: false
 // o2.skill is a copy of o1.skill. They don't point to the same skill object.

我有另一个例子:

 <html>
 <body>

 <p id="demo"></p> // output of z is "true"

 <script>
 var x = 5;
 var y = 5;
 var z = (x === y);
 document.getElementById("demo").innerHTML = z; 
 </script>

在第一个例子中为什么===返回false? “===”仅查找数据类型和值。

x和y也指向不同的区域。但是===返回true。

提前致谢

3 个答案:

答案 0 :(得分:1)

Angular.copy();创建分配给o2的新对象。 因此,当您比较两个对象时,每个对象原型都不相同。

所以他们完全是两个不同的对象。

第二个是JS默认在分配时知道数据类型。 我们为这两个变量分配了数值,因此使用相同的数据类型创建了这些变量。

答案 1 :(得分:1)

如果您需要比较您要查找的两个对象angular.equals,因为===只会告诉您它们是否引用了同一个对象。

  

确定两个对象或两个值是否相等。支持值类型,正则表达式,数组和对象。

这将比较对象的等价性。

console.log(angular.equals(o1, o2.skill));
如果您使用该库,

lodash也会_.eq执行相同的操作。

答案 2 :(得分:1)

有关,

示例1:angular.copy执行了深度克隆,并从示例对象创建了一个全新的对象。因此,当您使用&#39; ===&#39;匹配两个对象,它返回false,因为两个对象具有不同的引用和不同的内存分配。这意味着您对象的变化&#39; o1&#39;不会影响您的对象&#39; o2&#39;。不同的引用导致不匹配,因此它返回错误。

示例2:您匹配的是两个数值类型的数字,而不是像对象一样的引用类型。所以javascript匹配两个变量的值和类型。两个&#39; x&#39;并且&#39; y&#39;具有相同的值和相同的类型,因此返回true。