Як ви вже зазначали, JSON.parse()
очікує рядок, а не масив. Однак, коли дається масив або будь-яке інше нестрокове значення, метод автоматично примушує його до рядка і продовжує замість того, щоб негайно кидати. З специфікації :
- Нехай JText - ToString (текст).
- ...
Рядове представлення масиву складається з його значень, розділених комами. Так
String(['1234'])
повертається '1234'
,
String(['1234as'])
повертається '1234as'
, і
String(['123', '123'])
повертається '123,123'
.
Зверніть увагу, що рядкові значення знову не цитуються. Це означає , що ['1234']
і [1234]
як новонавернений в ту ж рядок, '1234'
.
Отже, що ви насправді робите:
JSON.parse('1234')
JSON.parse('1234as')
JSON.parse('123,123')
1234as
і 123,123
не є дійсними JSON, тому JSON.parse()
кидає в обох випадках. (Перший не є законним синтаксисом JavaScript для початку, а другий містить оператор-кома, який не належить.)
1234
з іншого боку, це літерал Number і, отже, дійсний JSON, що представляє себе. Ось чому JSON.parse('1234')
(і за розширенням JSON.parse(['1234'])
) повертає числове значення 1234.