Як ви вже зазначали, 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.