为什么 Javascript 等于 5 == 8 为真?
Why is Javascript equating 5 == 8 as true?
所以我有 2 个复选框:
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
for (var i = 0; i < statusList.length; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
当我点击一个复选框时,它会将其添加到 JavaScript 列表中,如果它已经在列表中,我想用另一个值覆盖它(本例中为 123)。
但是当我点击第二个时(顺序无关紧要,出于某种原因,第二个元素总是 123。
如我所料,如果我单击顶部的复选框,它将是一个包含“5”的列表,然后单击第二个复选框,我期望为 5,8,但它会提示为 5,123
,真的不明白为什么要这样做,因为 5==8
是错误的...有什么想法吗?
更新算法以解决潜在问题:
万一有人发现这个有用,我将算法更改为更好的替代方案:
var statusList = [];
function updateStatusString(x) {
if (statusList.length > 0) {
if (statusList.includes(x)) {
var idx = statusList.indexOf(x);
if (idx != -1) {
statusList.splice(idx, 1);
}
}
else {
statusList.push(x);
}
} else {
statusList.push(x);
}
alert(statusList);
}
因为您正在迭代 statusList
。在第一次迭代中,你检查 5 == 8,然后移动到 else 部分并在 statusList
中插入 8
。您的 statusList = [5, 8]。对于下一次迭代,这变为真 statuslist[i]
将是 8 和 8===8 并且您的语句 - statusList[i] = 123;
将用 123
替换最后插入的 8
值。因此,您的 statusList 数组将具有 ["5", 123]
.
var statusList = [];
function updateStatusString(x) {
const input = parseInt(x);
if (statusList != null) {
if (statusList.includes(input)) {
const idx = statusList.indexOf(input);
statusList[idx] = 123;
} else {
statusList.push(input);
}
alert(statusList);
}
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
第一次迭代:
由于状态列表是空的,您要在其中添加 5,
第二次迭代:
statulsList = [5]
你要加 8,所以现在 statusList 的值为 [5,8],这意味着长度也为 2,
因此我们进行了第三次迭代,在本例中为 8 === 8 。
如果你想让它不同,请在将其他项目添加到列表之前保存状态列表的长度。
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
var lengthStat = statusList.length;
for (var i = 0; i < lengthStat; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
if(! (statusList.indexOf(x) != -1))
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
您的问题似乎是由循环引起的。
- 您正在检查
x
是否存在,在第一个循环中它是错误的
- 你把它推到了数组
- 第二个循环,它存在并被替换为 123
您可以通过删除其中一项 if 检查并使用 array.prototype.includes 而不是循环和检查相等性来显着简化您的代码。
编辑: 添加了第三个输入以演示正在添加 123。
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.includes(x)) {
statusList[statusList.indexOf(x)] = 123;
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("5")> "Active"</label>
所以我有 2 个复选框:
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
for (var i = 0; i < statusList.length; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
当我点击一个复选框时,它会将其添加到 JavaScript 列表中,如果它已经在列表中,我想用另一个值覆盖它(本例中为 123)。
但是当我点击第二个时(顺序无关紧要,出于某种原因,第二个元素总是 123。
如我所料,如果我单击顶部的复选框,它将是一个包含“5”的列表,然后单击第二个复选框,我期望为 5,8,但它会提示为 5,123
,真的不明白为什么要这样做,因为 5==8
是错误的...有什么想法吗?
更新算法以解决潜在问题:
万一有人发现这个有用,我将算法更改为更好的替代方案:
var statusList = [];
function updateStatusString(x) {
if (statusList.length > 0) {
if (statusList.includes(x)) {
var idx = statusList.indexOf(x);
if (idx != -1) {
statusList.splice(idx, 1);
}
}
else {
statusList.push(x);
}
} else {
statusList.push(x);
}
alert(statusList);
}
因为您正在迭代 statusList
。在第一次迭代中,你检查 5 == 8,然后移动到 else 部分并在 statusList
中插入 8
。您的 statusList = [5, 8]。对于下一次迭代,这变为真 statuslist[i]
将是 8 和 8===8 并且您的语句 - statusList[i] = 123;
将用 123
替换最后插入的 8
值。因此,您的 statusList 数组将具有 ["5", 123]
.
var statusList = [];
function updateStatusString(x) {
const input = parseInt(x);
if (statusList != null) {
if (statusList.includes(input)) {
const idx = statusList.indexOf(input);
statusList[idx] = 123;
} else {
statusList.push(input);
}
alert(statusList);
}
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
第一次迭代:
由于状态列表是空的,您要在其中添加 5,
第二次迭代:
statulsList = [5]
你要加 8,所以现在 statusList 的值为 [5,8],这意味着长度也为 2,
因此我们进行了第三次迭代,在本例中为 8 === 8 。
如果你想让它不同,请在将其他项目添加到列表之前保存状态列表的长度。
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
var lengthStat = statusList.length;
for (var i = 0; i < lengthStat; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
if(! (statusList.indexOf(x) != -1))
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
您的问题似乎是由循环引起的。
- 您正在检查
x
是否存在,在第一个循环中它是错误的 - 你把它推到了数组
- 第二个循环,它存在并被替换为 123
您可以通过删除其中一项 if 检查并使用 array.prototype.includes 而不是循环和检查相等性来显着简化您的代码。
编辑: 添加了第三个输入以演示正在添加 123。
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.includes(x)) {
statusList[statusList.indexOf(x)] = 123;
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("5")> "Active"</label>