Проверка равенства экземпляров возвращает false? - PullRequest
0 голосов
/ 26 октября 2019

Я создал простой класс Vector в JavaScript с конструктором и некоторыми методами. Метод add возвращает новый экземпляр Vector. При сравнении возвращаемого значения метода add с новым экземпляром, объявленным с такими же значениями, возвращается false. Я также попытался изменить оператор равенства на двойное равенство, поэтому я считаю, что проблема не в ссылках.

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));

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Вы не должны сравнивать два разных объекта с == или с ===, если хотите проверить равенство объектов (см. Также Операторы сравнения MDN Web Docs ).

В случае объектов эти оба оператора возвращают true, только если на один и тот же объект ссылаются.

Посмотрите на этот вопрос о том, как проверить на равенство объектов, потому что, кажется, эточего ты хочешь достичьСм. здесь для различия между равенством объекта и идентичностью объекта.

1 голос
/ 26 октября 2019

При сравнении массивов с использованием === вы сравниваете их адреса. Проверьте это:

> a = [1,2]
[ 1, 2 ]
> b = [1,2]
[ 1, 2 ]
> a === b
false

Если вы хотите проверить, содержат ли массивы одинаковые элементы, вы можете перебрать все элементы и сравнить их. См. этот вопрос .

Кстати, вы также должны написать throw **new** Error() (без звездочек).

...