为什么JSON.parse(['1234'])返回1234?

Aks*_*tap 75 javascript arrays json

我在理解行为方面遇到了问题JSON.parse.JSON.parse应该只适用于字符串.但它似乎适用于只包含一个字符串(甚至是单引号)的数组,如果字符串只包含数字.

JSON.parse(['1234']) // => 1234
JSON.parse(['1234as']) // => throws error
JSON.parse(['123', '123']) // => throws error
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 179

正如您所指出的,JSON.parse()期望一个字符串而不是一个数组.但是,当给定数组或任何其他非字符串值时,该方法将自动将其强制转换为字符串并继续而不是立即抛出.从规格:

  1. 让JText成为ToString(文本).
  2. ...

数组的字符串表示由其值组成,以逗号分隔.所以

  • String(['1234'])回来'1234',
  • String(['1234as'])回归'1234as',和
  • String(['123', '123'])回报'123,123'.

请注意,不会再次引用字符串值.这意味着,['1234'][1234]两个转换为相同的字符串,'1234'.

所以你真正做的是:

JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')
Run Code Online (Sandbox Code Playgroud)

1234as并且123,123不是有效的JSON,因此JSON.parse()抛出两种情况.(前者不是合法的JavaScript语法,后者包含不属于的逗号运算符.)

1234另一方面,是一个数字文字,因此有效的JSON,代表自己.这就是为什么JSON.parse('1234')(并通过扩展名JSON.parse(['1234']))返回数值1234.

  • @ BlueRaja-DannyPflughoeft我按照你的链接.它不同意你的结论.如果"有效JSON"表示"有效的JSON文本",则单个数字文字曾经无效,但现在有效.此外,"有效JSON"具有除"有效JSON文本"之外的其他有效解释,并且通过一些其他解释,单个数字文字始终有效. (18认同)
  • _"..是一个数字文字,因此是有效的JSON .."_ - 单个数字文字不是有效的JSON,但是`JSON.parse`不是非常严格_(具体来说,它解析JSON对象和单个值)_.有关详细信息,请参阅[此处](http://stackoverflow.com/a/18419503/238419). (12认同)
  • 使用`JSON.parse(['[123','123]'])可以将其提升到一个新的水平`:P (11认同)
  • @ BlueRaja-DannyPflughoeft:不幸的是,有多个版本的JSON.Doug Crockford在http://JSON.org/上发布了原始版本.但是JSON还有两个国际标准,即[ECMA-404](http://ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)(取代[第15.12节]中的规范. .1 ECMA-262 5.1版](http://www.ecma-international.org/ecma-262/5.1/index.html#sec-15.12.1))和[RFC 7159](http:// rfc -editor.org/rfc/rfc7159.txt)(取代[RFC 4627](http://rfc-editor.org/rfc/rfc4627.txt)).还有...... (6认同)
  • @ BlueRaja-DannyPflughoeft RFC 7159和ECMA-404修改了JSON规范,允许顶级值为数字或字符串,而不仅仅是对象或数组.`JSON.parse()`与此更改一致. (5认同)

nao*_*tor 21

如果JSON.parse没有获取字符串,它将首先将输入转换为字符串.

["1234"].toString() // "1234"
["1234as"].toString() // "1324as"
["123","123"].toString() // "123,123"
Run Code Online (Sandbox Code Playgroud)

从所有这些输出中,它只知道如何解析"1234".