null == 0在函数中返回true

时间:2019-12-28 21:05:29

标签: javascript node.js

我具有以下函数,该函数完全无法解释为什么失败:

function GetPlayersMap ( map, id ){
    let compressedMap = [];
    for(let x = 0; x < map.length; x++){
        for(let y = 0; y < map[x].length; y++){
            if(map[x][y].claimant_id != null) {console.log(map[x][y].claimant_id); console.log(id)}
            if(id == null || map[x][y].claimant_id != id){
                map[x][y].count = null;
            }
            if(map[x][y].claimant_id != null){
                console.log(map[x][y]);
                compressedMap.push(map[x][y]);
            }
        }
    }
    return compressedMap;
}

map是对象的二维数组,map.count是在输入函数时永远不会null的整数。 id是一个整数,可以是null。预期的结果是,在id的{​​{1}}输入上,它返回一个0,其中一个对象与此匹配。该函数被调用两次,先使用相同的compressedMap,然后依次使用mapid的{​​{1}}。控制台中打印的是

0

无论我是否将第5行更改为

,都将打印此文件
null

(没有意义,这意味着它将0匹配为null)或

0
0
Tile { x: 0, y: 0, claimant_id: 0, count: null, fake_claimed: false }
0
null
Tile { x: 0, y: 0, claimant_id: 0, count: null, fake_claimed: false }

仅当我将其更改为

if(id == null){

我得到预期的输出

if(map[x][y].claimant_id != id){

我添加了代码的简化示例

if(false){

1 个答案:

答案 0 :(得分:1)

  

map.count是一个整数,在输入函数时永远不会为空。

我不同意该声明,因为您不复制数组或嵌套在其中的对象,因此map[x][y].count = null;将编辑数组/对象永久对象。这可能会导致null==0的麻烦,尽管该调用从未执行过代码。

在代码下面附有深拷贝。这能回答您的问题吗?

由于您已分配了数据,因此我认为请阅读有关deep-copy的文章。

class Tile {
    constructor(x, y) {
      this.x = x;
      this.y = y;
      this.claimant_id = null;
      this.count = 1;
      this.fake_claimed = false;
    }
}
  
  var map = []
  for (let x = 0; x < 10; x++) {
    map.push([]);
    for (let y = 0; y < 10; y++) {
      map[x].push(new Tile(x, y));
    }
  }
  map[0][0].claimant_id = 0;
  
  function GetPlayersMap(map, id) {

    // added copy of array
    const copy = JSON.parse(JSON.stringify(map));

    let compressedMap = [];

    for (let x = 0; x < copy.length; x++) {
      for (let y = 0; y < copy[x].length; y++) {

        if (id == null || copy[x][y].claimant_id != id) {
          copy[x][y].count = null;

        }
        if (copy[x][y].claimant_id != null) {
          console.log(copy[x][y]);
          compressedMap.push(copy[x][y]);

        }
      }
    }
    return compressedMap;
  }
  
  GetPlayersMap(map, 0);
  GetPlayersMap(map, null);
  GetPlayersMap(map, 0);