将字符串转换为原语
Converting Strings to primitives
我希望尽可能将字符串强制转换为原语,以一种可以安全地传递任何值的方式。我正在寻找一种更"原生"的方式来做这件事,而不是试图涵盖所有可能的情况。
value("0") //0
value("1") //1
value("-1") //-1
value("3.14") //3.14
value("0x2") //2
value("1e+99") //1e+99
value("true") //true
value("false") //false
value("null") //null
value("NaN") //NaN
value("undefined") //undefined
value("Infinity") //Infinity
value("-Infinity") //-Infinity
value("") //""
value(" ") //" "
value("foo") //"foo"
value("1 pizza") //"1 pizza"
value([]) //[]
value({}) //{}
value(0) //0
value(1) //1
value(-1) //-1
value(3.14) //3.14
value(0x2) //2
value(1e+99) //1e+99
你懂的
function value(x){
if(typeof x==="string"){
if(x=="") return x;
if(!isNaN(x)) return Number(x);
if(x=="true") return true;
if(x=="false") return false;
if(x=="null") return null;
if(x=="undefined") return undefined;
}
return x;
}
的主要问题是,因为isNaN()返回"是一个数字"的东西,如
"" empty strings
" " blank strings
[] arrays
etc
编辑
基于接受的答案:
function value(x) {
if (typeof x === "string") {
switch (x) {
case "true": return true;
case "false": return false;
case "null": return null;
case "undefined": return void 0;
}
if (!isNaN(x) && !isNaN(parseFloat(x))) return +x;
}
return x;
}
您的代码的问题是,isNaN
单独不能用于正确检测数字字符串。
例如,自+" " === 0
,则isNaN(" ") === false
。
相反,我建议使用这个测试用例列表中的第二个isNumeric
函数,取自验证JavaScript中的十进制数字。
function isNumeric(n) {
return !isNaN(n) && !isNaN(parseFloat(n));
}
function value(x){
if(typeof x !== "string") return x;
switch(x) {
case "true": return true;
case "false": return false;
case "null": return null;
case "undefined": return void 0;
}
if(isNumeric(x)) return +x;
return x;
}
我将继续说我认为我们都在评论中说的:没有一种原生方法可以完全做到你所概述的。
你说过要涵盖所有的基本要素,但实际上要涵盖的基本要素并没有那么多,它们都列在规范中,而且你似乎已经完成了大部分工作。只要确保您拥有的任何实用程序函数都具有足够的测试套件,并且如果您发现没有涵盖的情况(或者在规范中添加了新的原语,这是真的不可能的),请相应地更新函数及其测试。
相关文章:
- JavaScript 原语:相同的内存位置、新的内存位置或依赖于引擎
- 为什么我们在javascript中使用“var”而不是String或Number或Boolean(原语)
- JavaScript:Object vs True(或其他原语)相等比较(性能/优化)
- Cesiumjs中实体和原语的区别是什么
- Javascript中字符串对象到字符串原语的转换
- Javascript对象与原语
- Javascript - 原语如何真正工作
- 将字符串转换为原语
- 无效的JSON原语- Asp.Net MVC 4
- React.js中的非原语默认道具
- 对象与原语
- 使用node.js和gm绘制许多图形原语的方法是什么?
- 是否有必要取消抓取收集的原语值
- c# /数据表错误使用JsonWriter:无效的JSON原语:draw
- 如何在PIXI.js中绘制相同原语的多个实例
- 如何“设置对象属性”处理派生对象(这与设置原语有什么不同)
- Function.prototype.call()传递原语值
- 混淆原型链、原语和对象
- 我需要在ThreeJS盒子原语上隐藏边缘
- 在Javascript中对象或原语的类型转换更快