与
JSON.parse
你将作为一个
JSONNumber
代币,不是真的
NumericLiteral
.
两者之间有区别
J序号
和
数字文字
,
J序号
不允许前导零(无八进制)、十六进制文字或前导点(
3.
)或相反,一个点后跟小数位数(
.3
),而且
JSON.parse解析
在SpiderMonkey(和json2.js库)中,对于数值,在实现中确实存在错误
JSON.parse('01')
不会像人们所期望的那样投掷。
您可以进行验证以确保字符串符合
数字文字
语法,如果是的话,你可以使用
eval
或者
Function
构造函数来真正转换值,例如:
var numericLiteral = (function () {
var numericLiteralSyntax = new RegExp([
'^0x[\\da-fA-F]+$', // HexIntegerLiteral
'^0[0-7]+$', // OctalIntegerLiteral
'^(?:\\.\\d+|(?:0|[1-9]\\d*)(?:\\.\\d*)?)(?:[eE][+-]?\\d+)?$'//DecimalLiteral
].join('|'));
return function (value) {
if (typeof value != 'string') { throw TypeError('value must be a String'); }
if (numericLiteralSyntax.test(value)) {
return Function('return ' + value)(); // a NumericLiteral, evaluate it
}
throw SyntaxError('Invalid NumericLiteral'); // Not a NumericLiteral
}
})();
numericLiteral('0xFF'); // 255, an HexIntegerLiteral
numericLiteral('2e1'); // 20, DecimalLiteral with ExponentPart
numericLiteral('3.'); // 3
numericLiteral('.3'); // 0.3
numericLiteral('3.1416'); // 3.1416
numericLiteral('00010'); // 8, an OctalIntegerLiteral
用于验证的regexp来自
SourceText
JavaScript实用程序
Asen Bozhilov
.