实例相等性检查返回 false?
Instance equality check returning false?
我在 JavaScript 中使用构造函数和一些方法创建了一个简单的 Vector class。添加方法 return 是一个新的 Vector 实例。将 add 方法的 return 值与用相同值声明的新实例进行比较时,false
被 returned。我还尝试将相等运算符更改为双等号,因此我相信问题与引用无关。
class Vector {
constructor(components) {
this.length = components.length;
this.contents = components;
}
add(vector) {
if (this.length === vector.length) {
let a = [];
this.contents.forEach((cur, index) =>
a.push(cur + vector.contents[index])
);
return new Vector(a);
}
throw Error;
}
subtract(vector) {
if (this.length === vector.length) {
let a = [];
this.contents.forEach((cur, index) =>
a.push(cur - vector.contents[index])
);
return new Vector(a);
}
throw Error;
}
dot(vector) {
return this.contents.reduce(
(acc, cur, index) => (acc += cur * vector.contents[index]),
0
);
}
norm() {
return this.contents.reduce((acc, cur) => (acc += Math.pow(cur, 2)), 0);
}
equals(vector) {
return this.contents === vector;
}
toString() {
return this.contents.toString();
}
}
let a = new Vector([10, 20, 30]);
let b = new Vector([5, 15, 25]);
console.log(new Vector([15, 35, 55]));
console.log(a.add(b));
//Why does the log below return false?
console.log(new Vector([15, 35, 55]) === a.add(b));
当使用 ===
比较数组时,您是在比较它们的地址。看看:
> a = [1,2]
[ 1, 2 ]
> b = [1,2]
[ 1, 2 ]
> a === b
false
如果你想检查数组是否包含相同的元素,你可以遍历所有元素并比较它们。参见 this question。
顺便说一句,你也应该写throw **new** Error()
(没有星号)。
如果您想测试对象是否相等,则不应将两个不同的对象与 ==
或 ===
进行比较(另请参阅 MDN Web Docs Comparison Operators)。
在对象的情况下,这两个运算符仅 return true
,如果引用相同的对象。
查看 this question 如何测试对象相等性,因为这似乎是您想要实现的。
有关对象相等性和对象标识之间的区别,请参阅 here。
我在 JavaScript 中使用构造函数和一些方法创建了一个简单的 Vector class。添加方法 return 是一个新的 Vector 实例。将 add 方法的 return 值与用相同值声明的新实例进行比较时,false
被 returned。我还尝试将相等运算符更改为双等号,因此我相信问题与引用无关。
class Vector {
constructor(components) {
this.length = components.length;
this.contents = components;
}
add(vector) {
if (this.length === vector.length) {
let a = [];
this.contents.forEach((cur, index) =>
a.push(cur + vector.contents[index])
);
return new Vector(a);
}
throw Error;
}
subtract(vector) {
if (this.length === vector.length) {
let a = [];
this.contents.forEach((cur, index) =>
a.push(cur - vector.contents[index])
);
return new Vector(a);
}
throw Error;
}
dot(vector) {
return this.contents.reduce(
(acc, cur, index) => (acc += cur * vector.contents[index]),
0
);
}
norm() {
return this.contents.reduce((acc, cur) => (acc += Math.pow(cur, 2)), 0);
}
equals(vector) {
return this.contents === vector;
}
toString() {
return this.contents.toString();
}
}
let a = new Vector([10, 20, 30]);
let b = new Vector([5, 15, 25]);
console.log(new Vector([15, 35, 55]));
console.log(a.add(b));
//Why does the log below return false?
console.log(new Vector([15, 35, 55]) === a.add(b));
当使用 ===
比较数组时,您是在比较它们的地址。看看:
> a = [1,2]
[ 1, 2 ]
> b = [1,2]
[ 1, 2 ]
> a === b
false
如果你想检查数组是否包含相同的元素,你可以遍历所有元素并比较它们。参见 this question。
顺便说一句,你也应该写throw **new** Error()
(没有星号)。
如果您想测试对象是否相等,则不应将两个不同的对象与 ==
或 ===
进行比较(另请参阅 MDN Web Docs Comparison Operators)。
在对象的情况下,这两个运算符仅 return true
,如果引用相同的对象。
查看 this question 如何测试对象相等性,因为这似乎是您想要实现的。 有关对象相等性和对象标识之间的区别,请参阅 here。