RegExp测试变量返回布尔值,数组存入变量名而非布尔值问题
问题描述
我想要一个存储布尔值的数组,但实际得到的是变量名称。以下是简化示例:
声明匹配变量(返回布尔结果)
var usatest = new RegExp("USA").test(continent); // 返回true var canadatest = new RegExp("Canada").test(continent); // 返回false var mexicotest = new RegExp("Mexico").test(continent); // 返回false
通过字符串分割创建数组
var testArray = 'usatest,canadatest,mexicotest'.split(",");
此时testArray为['usatest','canadatest','mexicotest'],但期望得到[ true, false, false ]
手动赋值的正确方式
var testArray1 = [{}]; testArray1[0] = usatest; testArray1[1] = canadatest; testArray1[2] = mexicotest;
结果为正确的数组[ true , false, false]。
尝试批量赋值的错误方式
var testArray2 = [{}]; testArray2[0] = usatest; testArray2[1] = testArray[1]; testArray2[2] = testArray[2];
期望得到[ true, false, false],但实际得到[true , 'canadatest', 'mexicotest']
疑问
为何使用testArray[1]赋值返回变量名而非布尔值?testArray也无法返回布尔值的原因是什么?我忽略了什么?
问题解答
核心原因很直白:你混淆了「变量名的字符串」和「变量本身存储的值」。
- 字符串分割得到的
testArray里,每个元素都是字符串形式的变量名(比如"canadatest"),不是指向对应变量的引用。直接用testArray[1],取到的就是这个字符串,自然不会变成布尔值。 - 手动赋值时
testArray1[1] = canadatest,你是直接把变量canadatest存储的布尔值赋值给数组元素,这才是正确的「取变量值」操作。
如果想批量处理长列表的变量值,推荐两种靠谱的方式:
- 全局变量场景:如果这些变量是全局作用域的,可以通过
window[变量名字符串]取值,比如window[testArray[1]]就能拿到canadatest的布尔值。 - 局部变量场景:一开始就把测试结果存入对象,通过键名来批量取值,示例代码:
// 把所有测试结果存入对象 var testResults = { usatest: new RegExp("USA").test(continent), canadatest: new RegExp("Canada").test(continent), mexicotest: new RegExp("Mexico").test(continent) }; // 用map方法通过键名数组批量获取值 var testArray = ['usatest','canadatest','mexicotest'].map(key => testResults[key]); // 此时testArray就是[true, false, false]
这种方式不管变量列表多长,都能轻松批量处理,不用一个个手动赋值。
内容的提问来源于stack exchange,提问作者Doc
相关产品推荐
相关产品推荐

