与
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]+$',
'^0[0-7]+$',
'^(?:\\.\\d+|(?:0|[1-9]\\d*)(?:\\.\\d*)?)(?:[eE][+-]?\\d+)?$'
].join('|'));
return function (value) {
if (typeof value != 'string') { throw TypeError('value must be a String'); }
if (numericLiteralSyntax.test(value)) {
return Function('return ' + value)();
}
throw SyntaxError('Invalid NumericLiteral');
}
})();
numericLiteral('0xFF');
numericLiteral('2e1');
numericLiteral('3.');
numericLiteral('.3');
numericLiteral('3.1416');
numericLiteral('00010');
用于验证的regexp来自
SourceText
JavaScript实用程序
Asen Bozhilov
.