gpt4 book ai didi

javascript - null == 0 在函数中返回 true

转载 作者:行者123 更新时间:2023-12-02 22:12:32 26 4
gpt4 key购买 nike

我有以下函数,但它失败的原因完全没有意义:

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 是一个 int,在进入函数时永远不会 nullid 是一个 int,可以为 null。预期结果是,在 0id 输入上,它返回一个 compressedMap 以及一个与之匹配的对象。该函数被调用两次,使用相同的 mapid0,然后为 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 }

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

,都会打印此内容
if(id == null){

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

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

仅当我将其更改为

if(false){

我能得到预期的输出吗

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

我添加了代码的简化示例

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 < 1000; x++) {
map.push([]);
for (let y = 0; y < 1000; y++) {
map[x].push(new Tile(x, y));
}
}
map[0][0].claimant_id = 0;

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

GetPlayersMap(map, 0);
GetPlayersMap(map, null);
GetPlayersMap(map, 0);

最佳答案

map.count is an int that is never null when entering the function.

我不同意该声明,因为您不复制数组或嵌套在其中的对象,因此 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);

关于javascript - null == 0 在函数中返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59514858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com