JavaScript如何获取数组中布尔变量的名称而非其值
核心原因
布尔值是JavaScript的原始值类型,当你把变量存入数组时,数组仅保存true/false本身,不会携带任何原变量名的关联信息。原始值按值传递,赋值完成后数组元素和原变量没有绑定关系,不存在能直接从布尔值反推原变量名的内置方法——毕竟任意数量的变量都可以存储同一个true值,引擎无法判断你要关联哪个名称。
可行实现
你要求所有布尔值存储在数组中,不需要改用对象做外层存储,只需要调整数组内的元素结构,让每个元素同时保存选项名称和对应的布尔状态即可,完全符合你的存储要求。
另外你的原代码存在两个小bug:
- 循环条件写了
i <= dinnerOptions.length,数组下标从0开始,最后一个有效下标是dinnerOptions.length - 1,这个条件会导致多遍历一次取到undefined - 循环变量
i没有用let/var声明,会泄漏成全局变量
修正后的完整代码:
function dinnerPreferences(){ var isChinese = false; var isItalian = true; var isIndian = false; var isHomemade = true; var isTakeout = false; // 数组存储,每个元素同时记录名称和布尔值 var dinnerOptions = [ { name: 'isChinese', checked: isChinese }, { name: 'isItalian', checked: isItalian }, { name: 'isIndian', checked: isIndian }, { name: 'isHomemade', checked: isHomemade }, { name: 'isTakeout', checked: isTakeout } ]; console.log("Dinner options values: " + dinnerOptions.map(item => item.checked)); function getPreferences(){ var wantedDinnerOptions = []; for(let i = 0; i < dinnerOptions.length; i++){ if(dinnerOptions[i].checked){ wantedDinnerOptions.push(dinnerOptions[i].name); } } console.log("选中的偏好值对应名称: ", wantedDinnerOptions); // 输出: ["isItalian", "isHomemade"] console.log("选中的偏好数量: " + wantedDinnerOptions.length) } getPreferences(); } dinnerPreferences();
如果你不想额外声明零散的布尔变量,也可以直接把配置写在数组里,逻辑更简洁:
const dinnerOptions = [ { name: 'isChinese', checked: false }, { name: 'isItalian', checked: true }, { name: 'isIndian', checked: false }, { name: 'isHomemade', checked: true }, { name: 'isTakeout', checked: false } ];
不要尝试通过遍历作用域、匹配变量值的方式找名称,这类实现性能极差且不可靠,只要有两个变量值相同就会出现匹配错误,上述显式存储名称的方案是唯一稳定可维护的实现方式。
内容的提问来源于stack exchange,提问作者Janae Welsh
相关产品推荐
相关产品推荐

