javascript - JavaScript 中的对象检查问题
问题描述
在这段代码中,我正在检查obj中的每个键是否都是arr的平方值。还检查obj的值是否等于arr的相应值数量。所以我正在迭代arr并通过使用in 运算符检查key ** 2是否存在于obj中,如果不执行 console.log("false") 如果是则减去 obj 的属性并执行 console.log("true")
let obj = {
1: 1,
4: 1,
9: 1,
25: 2,
};
let arr = [1, 2, 3, 2, 5];
for (let key of arr) {
if (!(key ** 2 in obj)) {
console.log("false");
} else {
obj[key ** 2] -= 1;
console.log(obj);
console.log("true");
}
}
在这里,我用(obj[key ** 2])更改了 in 运算符,所以我的问题不是如何正确解决任务,我的问题是为什么in 运算符和"(obj[key ** 2])"他们按照他们的方式行事?在in 运算符情况下 -1 的减法继续,但在第二种情况下,当obj的键为 4 且属性为 0 时停止减法,这意味着!(obj[2 ** 2])为真,因此记录“错误的”。
那么,为什么在这两种情况下他们都按照自己的方式行事呢?有什么规则或类似的东西吗?我认为第一种情况似乎更合乎逻辑,在此先感谢
let obj = {
1: 1,
4: 1,
9: 1,
25: 2,
};
let arr = [1, 2, 3, 2, 5];
for (let key of arr) {
if (!(obj[key ** 2])) {
console.log("false");
} else {
obj[key ** 2] -= 1;
console.log(obj);
console.log("true");
}
}
解决方案
in
如果指定属性在指定对象或其原型链中,则运算符返回 true 。
而obj[key]
返回该键的值。所以当obj[4]
成为条件执行0
的第一个块时。if
作为if(!0) == true
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in
在您的第一个代码中,您正在检查带有!(keys ** 2 in obj)
. 每当键匹配时,它就会返回true
。由于if(!true) == false
第一个if
语句块被跳过。
推荐阅读
- ios - 如何找到按下的子层?
- ios - 谷歌地图在iOS Swift中按纬度和经度放置信息
- neo4j - graphaware 是否支持 neo4j 中的荷兰语 nlp?
- xml - 在骆驼路线中获取具有特定字符串的文件名
- python - Python 覆盖在本地针对 docker 中的相同服务运行测试
- sap - 接收 IDOC 作为没有架构的 xmldocument
- python - kivy 中引用的 2 个类返回空屏幕
- c# - 如何将数据库中的大数据检索到 ASP.Net 中的 Gridview 中?无分页
- c++ - 为什么 C++ 11 将 operator bool 添加到 ios 类
- git - 识别在分支上完成的提交