在javascript中检查条件的奇怪行为

时间:2015-10-26 14:44:18

标签: javascript

我正在编写一个代码来在屏幕上使用svg绘制六边形网格,我之所以使用单个六边形而不是模式,是因为我最终想让每个六边形成为一个引用的对象

我有点使用一些数学和点引用绘制六边形。

所以不是让这个变得复杂,而是通过尝试解释我的代码,这是我的代码https://jsfiddle.net/Snedden27/9nnrt7hp/8/

我的问题是功能drawHexAround(分) //第41行, 该函数假设用六角形围绕六边形绘制六边形' @ cent'

这是检查条件:

if (!contains(drawnCentroids,centroidNew)) {
    makeHex(centroidNew);
    drawnCentroids.push(centroidNew);
}

这是函数

function contains(a, obj) {
    var l = a.length;

    for (var i=0;i<l;i++) {
        // console.log(a[i],obj);
        // console.log(a[i] === obj);

        if (a[i] === obj) {
            // console.log('true');
            return true;
        }
    }

    return false;
}

它绘制了六边形,但它也会覆盖现有的六边形,尽管我使用contains(a,obj)来检查条件

我不明白为什么这种情况结果总是如此,显然在某些情况下会导致错误。

1 个答案:

答案 0 :(得分:1)

你错了,检查2个对象的相等性将检查对象中每个属性的相等性 - 它不会!

您的问题中未指明,但从代码中我们可以看到您检查的对象如下所示:

centroidNew = {
         cx: xRight,
         cy: yMidTop
     };

你有一系列你正在寻找的循环。

除非if (a[i] === obj) {a[0] 引用完全相同的对象,否则测试obj永远不会评估为真。

要解决这个问题,您可以明确地查看属性,因为只有2个属性可能适用于您

if (a[i].cx === obj.cx && a[i].cy === obj.cy) {

以下是您的小提琴的更新:https://jsfiddle.net/9nnrt7hp/4/现在有时会从该测试中记录true