Javascript:无需IF判断获取数组元素的实际类型
问题分析
你遇到的核心问题是**prompt()方法的返回值永远是字符串类型**——不管你输入的是数字、布尔值还是其他内容,它都会把输入内容转成字符串返回,所以你的数组里所有元素自然都是string类型啦。
要获取元素的实际类型,我们需要先把字符串形式的输入转换成对应的数据类型,再去检测它的真实类型,而且完全可以不用if语句实现。
无需
if语句的解决方案 步骤1:转换输入为实际类型
我们可以用JSON.parse()来尝试把输入的字符串解析成对应类型,解析失败的话就保留原字符串(比如普通文本)。这里用try-catch处理解析错误,它不属于if语句范畴:
function convertInput(str) { try { return JSON.parse(str); } catch(_) { return str; } }
这个函数能处理大多数常见场景:
- 输入
"123"→ 转成number类型的123 - 输入
"true"→ 转成boolean类型的true - 输入
"[1,2,3]"→ 转成array类型的[1,2,3] - 输入
"hello"→ 解析失败,返回原字符串"hello"
步骤2:精确检测类型(无if语句)
利用Object.prototype.toString.call()方法可以获取值的精确类型,这个方法返回类似[object Number]的字符串,我们通过字符串切片提取类型名称即可,全程不需要if:
function getActualType(value) { return Object.prototype.toString.call(value).slice(8, -1).toLowerCase(); }
它能准确区分各种类型:
getActualType(123)→"number"getActualType(true)→"boolean"getActualType([1,2])→"array"getActualType(null)→"null"
完整修改后的代码
script.js
var tab = []; // 转换输入为实际类型的函数 function convertInput(str) { try { return JSON.parse(str); } catch(_) { return str; } } // 获取精确类型的函数 function getActualType(value) { return Object.prototype.toString.call(value).slice(8, -1).toLowerCase(); } // 收集用户输入,用短路运算代替if处理取消操作 do { const input = prompt("Write some type of value!"); input !== null && tab.push(convertInput(input)); } while(confirm("Next value?")); // 输出每个元素的实际类型 for (var i = 0; i < tab.length; i++) { document.write(`${getActualType(tab[i])}<br>`); }
index.html
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="author" content="Donio3d"> </head> <body> <script src="script.js"></script> </body> </html>
补充说明
如果需要支持输入"undefined"的情况(JSON不支持解析undefined),可以给convertInput函数加个小处理,用三元运算符代替if:
function convertInput(str) { return str === "undefined" ? undefined : (() => { try { return JSON.parse(str); } catch(_) { return str; } })(); }
另外,Object.prototype.toString.call()是JS中最可靠的类型检测方法之一,比typeof更精确——比如它能区分array和object,而typeof对数组返回的是object。
内容的提问来源于stack exchange,提问作者Donio3d
相关产品推荐
相关产品推荐

