js数组、json、js对象的区别与联系

最近在敲代码时,遇上了一个关于JS数组的问题,由此引发了关于对象和json的联想,曾经觉得很畅顺的知识点突然模糊了。于是,为了理清这些东西,有了如下这篇文章。觉得没问题的猿们可以当复习,而那些带着疑问的童鞋可以细细看。当然,有任何问题欢迎指出。理清这些问题,第一步当然是找到他们的概念:js所有事物都是对象:字符串、数值、数组、函数…此外,JavaScript允许自定义对象

(1)JS数组,常态为var a = [1,2,3]的格式,用文字来形容就是一个有序数列。因为是有序的,所以里面的东西是按序排放。

(2)自定义js对象,这里我构造一个和json相似的对象来找到区别,这里写了两种构造方法

var person = {key:“value”} var person = new object(); person.key=“value” ;

(3)json:一种存储和交换信息的格式,常态为var json = {“key”:“value”}的格式,这里和js对象不同的是key多了“”

区别与联系: 一、json对象与json字符串的联系: json对象

    var json = { 
    “key1”:“value1”, 
    “key2”:“value2”, 
    };

json为 {“key1”:“value1”,“key2”:“value2”} json字符串

    var a1 = “{“; 
    var a2 = “‘key1’:’value1’,”; 
    var a3 = “‘key2’:’value2’}”; 
    var a = a1 + a2 + a3;
    a为 ‘{“key1”:“value1”,“key2”:“value2”,}’ //比上面在外面多了引号,因为是字符串

所谓的json字符串,其实是一种json格式的字符串, 而json对象则是一种json格式的键值对对象(有对象的属性和方法), 所以json字符串不同于json对象,但是他们可以相互转化: eval(json字符串) ==》 转化成json对象 JSON.stringify(json对象) ==》转化为json字符串

二、js对象与json对象 js对象,

var person = {key:“value”} 

json对象,

var json = {“key”:“value”} 

在json规范里面描述里,json键值对为string:value形式,所以这里的key是字符串,要加双引号 记得上面概念里,js所有事物都是对象,那么我们完全可以把json对象当做js对象的子集,string只是js对象的key的数据类型中的一个选项 额外说一点,js里面是没有键值对数组这一说的,现有的这种键值对数组(也即是关联数组)其实就是js对象,需要的要自己去构造,如:

    var a = []; 
    a.push({ 
    value:value 
    });

当然,现在的ES6已经有了专门表示键值对数组的结构,即map

json格式常用于数据传输方面,其他情况遇到类似json对象的形式,可以把它当成是特殊的js对象来处理,例子如下

    var a = { 
    “star”:{“img”:require(./image/XXX.png),”name”:”picture1”}, 
    “earth”:{“img”:require(./image/YYY.png),”name”:”picture2”} 
    };

所以 a[star].name 以及 a[star][name] 指的都是picture1

三、json对象乱入数组

    var a = [ 
    {“img”:”require(./image/XXX.png)”,”name”:”picture1”}, 
    {“img”:”require(./image/YYY.png)”,”name”:”picture2”} 
    ];

这里的问题只要记住一点,是数组就进行数组处理,是json对象就进行json对象处理, 这段可以分解为

    var q = {“img”:…..}; 
    var w = {“img”:….}; 
    a[q,w]

另外,需要注意上述提到一点,关联数组属于js对象而不是数组, 所以虽然a[1][name]或者 a[1].name 都是可以使用类似于数组的索引,但它实质是js对象object

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏keyWords

JavaScript之作用域和闭包

9510
来自专栏大数据钻研

Java到底是不是一种纯面向对象语言?

Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 ...

304110
来自专栏从零开始学自动化测试

python笔记2-冒泡排序

前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序。 一、基本原理 1.概念: 冒...

39760
来自专栏程序员同行者

python 函数进阶

函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式

13730
来自专栏北京马哥教育

Python正则表达式的七个使用范例

作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。 本文是一系列关于Pyth...

34650
来自专栏MyBlog

Effective.Java 读书笔记(4)非实例化

有时你想要编写一个类,这个类只是静态方法和静态域的组成,这样的一个类获得一个糟糕的名声因为一些人滥用他们为了避免对对象的术语进行思考,但是他们的确是有用的

9820
来自专栏LuckQI

Redis初识~Set命令

12520
来自专栏达摩兵的技术空间

a>b的那些事

经常会遇到对比两个值大小关系的逻辑,常规的处理中我们都是处理两个数字或者数字类型的字符串。那么这里进行延伸拓展的练习,来避免一些开发中的采坑。

7810
来自专栏彭湖湾的编程世界

【JavaScript】 JS面向对象的模式与实践

参考书籍 《JavaScript高级语言程序设计》—— Nicholas C.Zakas 《你不知道的JavaScript》  —— KYLE SIMPSON ...

38260
来自专栏liulun

Nim教程【十】

openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一...

30080

扫码关注云+社区

领取腾讯云代金券