TypeError:a.dot(..).equals不是函数

TypeError: a.dot(...).equals is not a function

本文关键字:equals 函数 dot TypeError      更新时间:2023-09-26

在下面的代码中,有3种方法:add、dot和equals。加法和点法计算两个向量的加法和点积。equals方法检查add和dot方法的返回值是否与传递给equals方法的参数匹配。

如果我尝试在dot方法上调用equals方法,则会得到错误TypeError: a.dot(...).equals is not a function。我做错了什么?我该怎么做?在add方法上调用equals方法时没有错误。

function Vector(vector){
      this.vector=vector;
      }
      //add method
      Vector.prototype.add= function(b){
        var res=[];
        var vec1 =this["vector"];
        var vec2 = b["vector"];
        for (i=0; i<vec1.length; i++){
          res.push(vec1[i]+vec2[i]);
        }
        var result = new Vector(res);
        return result;
      };
      //dot product method
      Vector.prototype.dot= function(b){
        var res=0;
        var vec1 =this["vector"];
        var vec2 = b["vector"];
        for (i=0; i<vec1.length; i++){
          res+=vec1[i]*vec2[i];
        }
        return res;
      };
      //equals method
      Vector.prototype.equals = function(answer){
        if (this.toString()===answer.toString()){
          return true;
        } else {
        console.log(this);
            return false;
        }
      };
    //test
    var a = new Vector([1,2]);
    var b = new Vector([3,4]);
    a.add(b).equals(new Vector([4,6]));
    a.dot(b).equals(11);

dot方法返回Number,而不是Vector。尝试使用==而不是equals

Eric Galluzzo是正确的,但我想我应该给出更多的解释,因为我知道背景(对于感兴趣的读者来说,这来自Codewars练习:http://www.codewars.com/kata/vector-class/train/javascript)。

您编写方法的方式意味着a.dot(b).equals(11)将比较Vector对象的字符串表示和11的字符串表示。这些显然是不相等的,因为您将比较类似'function Vector(vector) {...}'=='11'的东西。

我认为你误解了equals方法的目的。它是Vectoronly的对象之间相等性检查的具体实现。比较内置类型时,如果可能,应使用=====

上面链接的kata中的描述说"测试用例将使用用户提供的equals方法",但作者的意思是,在Vector对象之间进行比较时,这只是。当比较dotnorm方法的结果时,使用相等运算符。

有关比较对象的更多信息,请参阅此SO问题。它还让您了解为什么比较整个对象的字符串表示并不总是一个好主意。