我知道在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。
提前致谢
答案 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。