js中Object和Map的区别

js中Object和Map的区别

Object是最常用的一种引用类型数据,可用于存储键值对的集合。

Map是键值对的集合,才会用Hash结构存储。(map是es6以后新增的)

共同点: 键值对的动态集合,支持增加和删除键值对

在这里插入图片描述在这里插入图片描述

不同点
1.构造方式

		// Object
        const obj = {
            a: 1,
            b: 2
        }
        const o = new Object()

        const o2 = Object.create();
        
        // map
        const map = new Map()

        const m = new Map([
            ['a', '1'],
            ['b', '2']
        ])

2.键的类型

		/*
            Object 键的类型:
                键类型必须是String或者Symbol,如果非String类型,会进行数据类型转换
        
        */
        const obj = {
            a: 1,
        }
        const arr1 = [1, 2]
        obj[arr1] = 'arr'
        console.log(obj); //这里把arr1中的数据变为了字符串

在这里插入图片描述

		/*
            Map 键的类型:
                可以是任意类型,包括对象,数组,函数等,不会进行类型转换。
                在添加键值对时,会通过严格相等(===)来判断键属性师范已存在
        
        */
        const m = new Map()

        m.set('a', 1)
        m.set('2', '2')
        m.set(2, 2)
        m.set(arr1, 'arr')
        console.log(m);

在这里插入图片描述

3.键的顺序

		/*
            Object 键的顺序:
                key是无序的,不会按照添加的顺序返回
                1.对于大于等于0的证书,会按照大小进行排序,对于小数和负数会当作字符串处理
                2.对于String类型,按照定义的顺序进行输出
                3.对于Symbol类型,会之间过滤掉,不会进行输出,
                  如果想要输出Symbol类型属性,
                  通过Object.getOwnPropertySymbol()方法    

        */
        const obj = {
            2: 2,
            '1': 1,
            'b': 'b',
            1.1: 1.1,
            0: 0,
            'a': 'a',
            [Symbol('s1')] : 's2',
            [Symbol('s2')] : 's1',
        }
        console.log(Object.keys(obj));

在这里插入图片描述

		/*
            Map 键的顺序:
                key是有序的,按照插入的顺序进行返回
                对于Symbol类型,不会过滤掉,会进行输出
        
        */
        const m = new Map()

        m.set(2, 2)
        m.set('1', 1)
        m.set('b', 'b')
        m.set(0, 0)
        m.set('a', 'a')
        m.set(Symbol('s1'), 's1');

        console.log(m.keys());

在这里插入图片描述

4.键值对size

		/*
            Object 键值对size:
                只能手动计算,通过Object.keys()方法或者通过for...in循环统计
        
        */
        const obj = {
            2: 2,
            '1': 1,
            'b': 'b',
        }
        console.log(Object.keys(obj).length);   //3

        /*
            Map 键值对size:
                直接通过size属性访问
        
        */
        const m = new Map()

        m.set(2, 2)
        m.set('1', 1)
        m.set('b', 'b')
        m.set(0, 0)
        m.set('a', 'a')
        m.set(Symbol('s1'), 's1');

        console.log(m.size);    //6

5.键值对的访问

		/*
            Object 键值对访问:
                1.添加或者修改属性,通过点或者中括号的形式
        */
        const obj = {
        }

        obj.name = '张三'
        obj.age = 18

        // 2.判断属性是否存在
        obj.name === undefined

        // 删除属性,通过delete关键字
        delete obj.name

        /*
            Map 键值对访问:
        
        */
        const m = new Map()

        // 添加和修改key-value
        m.set('name', '张三')
        m.set('age', 18)

        // 2.判断属性是否存在
        m.has('name')

        // 取值
        m.get('name')

        // 删除键值对
        m.delete('name')

        // 获取所有属性名
        m.keys()

        // 清空map
        m.clear()

6.迭代器

/*
            迭代器-for...of
            Object本身不具有lterator特性,默认情况下不能使用for..of进行遍历

            Map结构的keys(), value(), entries()方法返回值都具有lterator特性
        
        */

7.JSON序列化

        /*
            Object JSON序列化
                Object类型可以通过JSON.stringify()进行序列化操作

            Map结构的keys(), value(), entries()方法返回值都具有lterator特性

        */
        const o = {
            name: '张三',
            age: 18
        }
        console.log(o);
        console.log(JSON.stringify(o));

在这里插入图片描述

/*
            Map JSON序列化
                Map结构不能直接进行JSON序列化,可以通过其他手段进行序列化
        */
        const map = new Map([
            ['name', '张三'],
            ['age', 19]
        ])
        console.log(map);
        console.log(JSON.stringify(Array.from(map)));

在这里插入图片描述

8.应用场景

JavaScriptObjectMap都是用来存储键值对的数据结构,但它们有一些区别。 1. 定义方式不同: ObjectJavaScript的一个内置对象,用字面量形式定义,可以包含任何类型的属性,例如: ```javascript const obj = { name: 'John', age: 20, address: 'New York' } ``` Map是ES6引入的新数据结构,通过构造函数来定义,只能存储键值对,其键可以是任何类型,例如: ```javascript const map = new Map() map.set('name', 'John') map.set('age', 20) map.set('address', 'New York') ``` 2. 键的类型不同: Object只能使用字符串或Symbol类型作为键,例如: ```javascript const obj = { 'name': 'John', [Symbol('age')]: 20 } ``` Map可以使用任何类型作为键,例如: ```javascript const map = new Map() map.set('name', 'John') map.set(1, 'one') map.set(true, 'true') ``` 3. 键值对的数量不同: Object键值对的数量没有限制,可以存储任意多个键值对。 Map键值对的数量是有限制的,但是它可以更好地处理大量的键值对。 4. 遍历方式不同: Object可以使用for...in、Object.keys()、Object.values()、Object.entries()等方式遍历。 Map可以使用for...of、forEach()等方式遍历。 总之,ObjectJavaScript的内置对象,用于存储任意类型的属性和值,而Map是ES6引入的新数据结构,用于存储键值对,其键可以是任何类型。在使用时应根据具体的场景和需求选择合适的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值