我正在尝试创建一个检查,以查看字段是否已从占位符 value 更改。如果没有,我重新分配原始 changed
value,因为函数(在我的实际代码库中)必须查看多个字段。
我只是有点困惑为什么:
changed = (locationField.value && locationField.value !== locationField.placeholder) ? true : changed;
如果提交的字段没有value,则评估为空字符串*。
*在帖子末尾输出
我假设它是 locationField.value
的空 value,但它不应该分配 'true' 或改变的 value 吗?改变(据我所知)永远不会也不应该是一个字符串。
可能是一个简单的问题,但我看不到答案。
https://codepen.io/nwoodward/pen/WNMpVGv?editors=1011
const locationField = document.querySelector('.location');
const submit = document.querySelector('.submit');
let changed = false;
submit.addEventListener('click', e => {
changed = (locationField.value && locationField.value !== locationField.placeholder) ? true : changed;
console.log(locationField.value, locationField.placeholder, (locationField.value && locationField.value !== locationField.placeholder));
console.log(changed);
// reset
changed = false;
});
<input type="text" placeholder="test" class="location">
<button class="submit">Submit</button>
**编辑:
我得到的结果:
输入“已更改”=> "changed", "test", true
输入“测试”=> "test", "test", false
输入 "" "", "test", ""
,当我期望 "", "test", false
回答1
逻辑与 (&&) 从左到右计算操作数,并立即返回它遇到的第一个假操作数的 value;如果所有 values 都为真,则返回最后一个操作数的 value。
(来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND)
因此,在您的情况下,如果 locationField.value
是“”,其评估结果为假 value,那么逻辑与将返回 locationField.value
的 value(这就是它返回空字符串的原因)
回答2
如果您首先将 locationField.value
转换为布尔值,使用 !!
或使用 Boolean()
,那么您应该会得到预期的结果。
(!!locationField.value && locationField.value !== locationField.placeholder)