由于比较方法添加到Array原型,测试失败。如何更新代码或测试?

时间:2014-05-07 04:53:01

标签: javascript arrays jasmine

我正潜入Mars Rover Kata。我遇到了一个有趣的问题。由于原型中的数组比较方法,我的茉莉花测试失败了。我正在使用数组比较方法来检测指定坐标或网格点处的障碍物。

作为一个例子,我的第一个测试产生了这个错误:预期[0,1,'N',未定义]等于[0,1,'N']。

当我在console.log中获取我的数组:[0,1,“N”,比较:功能]。这解释了为什么它不等于[0,1,'N']。

我的数组的长度是3,而 proto 有比较方法。我该怎么办这个问题?

Here是分支/代码。 Here是测试。

更新

事实证明我的一个条件是返回undefined,这导致我的undefined错误被推入我的数组,但没有尝试@GameAlchemist解决方案我不会了解defineProperty或找出问题。

此外,根据我的阅读,在向内置原型添加属性以使用Object.defineProperty()和类似方法使它们不可枚举时,这是一种很好的做法。这将为您提供一些保护,防止破坏遗留代码中的for-in循环。

2 个答案:

答案 0 :(得分:2)

您可以使用Object.defineProperty通过将其设置为不可枚举来隐藏原型属性/方法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

因此,如果您是定义比较的人,请执行以下操作:

Object.defineProperty(Array.prototype, 'compare', { value : compareFunction } );

由于默认情况下可配置,可枚举和可写是错误的,因此您将拥有只读,不可配置且不可枚举的属性:它不会妨碍您的比较。

如果您不是定义比较的那个,您必须希望它仍然是可配置的(使用Object.getOwnPropertyDescriptor查看或只测试以下代码):

Object.defineProperty(Array.prototype, 'compare', { value : Array.prototype.compare } );

以同样的方式,你可以对所有Array原型进行循环,以检查它自己的每个属性是否都是可枚举的,如果是,则将其设置为非枚举。

http://jsbin.com/zunahebo/2/edit?js,console

Object.defineProperty(Array.prototype, 'compare', { value : compareArray } );
function compareArray(other) {
  if (!other || other.length != this.length) return false;
  for (var i=0; i<this.length; i++) if (this[i] !== other[i]) return false;
  return true;
}

var a1 = [1, 2, 3, 4];
var a2 = [1, 2, 3, 4];
var a3 = [1, 2, 5, 6];
var a4 = [1, 2];

console.log(' a1 == a2 : ' + a1.compare(a2));
console.log(' a1 == a3 : ' + a1.compare(a3));
console.log(' a1 == a4 : ' + a1.compare(a4));

答案 1 :(得分:0)

也许:

for(var i = 0, l=this.length; i < l; i++) {
    if (this.hasOwnProperty(i)){ 
        ... 
    }
}