一直以来傻傻分不清JSON和JS有什么区别,它们太亲密、挺相似的,所以有段时间一直以为JS对象就是JSON,but, 大错特错。下面来看看JSON和JS对象的区别吧!!
一、JSON定义
官网上是这样定义的,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于Javascript Programming Language, Standard ECMS-262 3rd Edition-December 1999
的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
从官网上的定义可以理解为:
- 基于文本的数据格式
- 轻量级的数据格式
- 被广泛地用于数据交换
二、JSON与JS对象的联系
本质区别
JSON的全称为JavaScript Object Notation
, 所以它的格式是基于JS的,从JS中演变出来的,但是它只是一个格式,而JS对象是一个实例,是存在于内存中的一个东西。
JSON是可以传输的,因为它是文本格式,但是JS对象没办法传输。
JSON语法上更加严格,而JS对象相对要宽松很多。
语法区别
对比项 | JSON | JS对象 |
---|---|---|
键名 | 必须是双引号 | 可以允许不加、加单引号、加双引号 |
属性值 | 只能是数值(10进制)、字符串(双引号)、布尔值和null,可以是数组或者符合JSON要求的对象,不能是函数、NaN、Infinity、-Infinity和undefined | 随便都可以 |
逗号问题 | 最后一个属性后面不能有逗号 | 可以 |
数值 | 前导0不能用, 小数点后必须有数字 | 没有限制 |
可以看出,JSON相对于JS对象,语法上严格很多。
三、转换
在JS中JS数据和JSON是可以相互转换的,这主要是依赖两个函数。
一个叫JSON.stringify
, 它很人性化,你可以写不符合JSON格式的JS对象,它都能帮你处理成符合JSON格式的字符串。
一个叫JSON.parse
, 这个函数比较严格,如果你的JSON字符串写的不对,它就会停止解析。
将 JS 数据结构转化为JSON字符串 —JSON.stringify
注意事项:
- 键名不是双引号(包括没有引号或者是单引号), 会自动变成双引号;字符串是单引号的,会自动变成双引号。
- 最后一个属性后面有逗号,会被自动去掉.
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中,也就是对非数组对象在最终字符串中不保证属性顺序和原来一致
布尔值、数字、字符串的包装对象在序列化过程中会自动转成对应的原始值。
也就是你的new String('bala')会变成'bala', new Number(234) 会变成234
undefined、任意的函数(其实有个函数会发生神奇的事)以及symbol值
出现在非数组对象的属性值中:在序列化过程中会被忽略 出现在数组中时: 被转换成null
- NaN、Infinity和-Infinity , 不论在数组还是非数组的对象中,都会被转化为NULL
- 所有以symbol为属性建的属性都会被完全忽略掉, 即便replacer参数中强制指定包含了它们
- 不可枚举的属性会被忽略
将JSON字符串解析为JS数据结构 — JSON.parse