美文网首页
2024-08-06 javascript对象和map区别

2024-08-06 javascript对象和map区别

作者: 我是小胡胡123 | 来源:发表于2024-08-05 19:13 被阅读0次

0、主要区别

1、键的类型:

对象的键只能是字符串或符号。
Map的键可以是任意类型。

2、键的顺序:

对象的键顺序在现代JavaScript引擎中通常按插入顺序维护,但这是非标准行为,不应依赖。
Map的键值对按插入顺序迭代,符合标准。
迭代:

对象需要使用 for...in 或 Object.keys、Object.values、Object.entries 来迭代。
Map可以直接使用迭代器方法(如 forEach)或 for...of 迭代。

3、性能:

对象在添加和查找简单键值对时性能较好。
Map在频繁增删键值对时性能更优,因为Map是专门为此设计的。

4、内存管理:

Map会更有效地管理内存,尤其是当键是复杂对象时。

5、使用场景

对象:适合用来表示固定结构的实体数据(如用户信息、配置项等)。
Map:适合动态添加、删除键值对的场景,或者当需要使用非字符串类型的键时。
根据具体需求选择合适的数据结构,可以使代码更高效、易读。

1、定义对象key名字双引号的写法和省去双引号

let obj = {
name: "Alice",
age: 30
}; 这个obj对象的name为什么不需要用双引号扩起来,比如是let obj = {
"name": "Alice",
"age": 30
};

在JavaScript中,对象字面量中的属性名称可以省略引号,但有一些细节需要注意。

属性名称不使用引号的情况:
如果属性名称是一个有效的JavaScript标识符,则可以省略引号。有效的JavaScript标识符由字母、数字、下划线(_)和美元符号($)组成,并且不能以数字开头。

在这个例子中,name 和 age 都是有效的JavaScript标识符,因此可以不使用引号:

let obj = {
    name: "Alice",
    age: 30
};

// 等价于
let obj = {
    "name": "Alice",
    "age": 30
};

属性名称需要使用引号的情况
如果属性名称中包含空格、特殊字符(如破折号),或者是一个数字,必须使用引号:

let obj = {
    "first name": "Alice",
    "last-name": "Smith",
    123: "one two three"
};

// 使用方括号访问属性值
console.log(obj["first name"]); // Alice
console.log(obj["last-name"]); // Smith
console.log(obj[123]); // one two three

省略引号:如果属性名称是有效的JavaScript标识符,可以省略引号。
需要引号:如果属性名称包含空格、特殊字符或是数字,必须使用引号。
使用引号和不使用引号在功能上是等价的,只要属性名称符合相应的规则。

2、存放到对象:

将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,在按钮点击的时候,通过对象属性查找的方式来进行逻辑判断,这种写法特别适合一元条件判断的情况。

const actions = {
  '1': ['processing','IndexPage'],
  '2': ['fail','FailPage'],
  '3': ['fail','FailPage'],
  '4': ['success','SuccessPage'],
  '5': ['cancel','CancelPage'],
  'default': ['other','Index'],
}
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1开团进行中 2开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  let action = actions[status] || actions['default'],
      logName = action[0],
      pageName = action[1]
  sendLog(logName)
  jumpTo(pageName)
}

3、存放到map

new Map() 可以接受一个可迭代对象(如数组)来初始化一个新的 Map 实例。你提供的代码正是通过一个包含多个键值对的数组来创建一个 Map:

const actions = new Map([
  [1, ['processing','IndexPage']], //键值对数组
  [2, ['fail','FailPage']],
  [3, ['fail','FailPage']],
  [4, ['success','SuccessPage']],
  [5, ['cancel','CancelPage']],
  ['default', ['other','Index']]
])
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
const onButtonClick = (status)=>{
  let action = actions.get(status) || actions.get('default')
  sendLog(action[0])
  jumpTo(action[1])
}

console.log(actions.get(1)); // ['processing','IndexPage']
console.log(actions.get('default')); // ['other','Index']

使用 set 方法逐步添加键值对:

let map = new Map();

map.set(1, ['processing', 'IndexPage']);
map.set(2, ['fail', 'FailPage']);
map.set(3, ['fail', 'FailPage']);
map.set(4, ['success', 'SuccessPage']);
map.set(5, ['cancel', 'CancelPage']);
map.set('default', ['other', 'Index']);

console.log(map.get(1)); // ['processing','IndexPage']
console.log(map.get('default')); // ['other','Index']

这样写用到了es6里的Map对象,是不是更爽了?Map对象和Object对象有什么区别呢?

一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键。
一个对象的键只能是字符串或者Symbols,但一个Map的键可以是任意值。
你可以通过size属性很容易地得到一个Map的键值对个数,而对象的键值对个数只能手动确认。

如何写出优雅耐看的JavaScript代码

相关文章

  • web前端面试4

    1 ES6中的map和原生的对象有什么区别 JavaScript 的对象(Object),本质上是键值对的集合(H...

  • web前端入门到实战:JavaScript中的Map 与 Obj

    在JavaScript中,Map 是存储键/值对的对象。Map 类似于一般 JavaScript 对象 ,但对象与...

  • ES6 简易示例

    Map对象 Map对象 和 Objects 的区别Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个...

  • ES6新增Map和Set数据类型

    Map和Set Map 和 Set 是 ES6 标准新增的数据类型 Map JavaScript的对象(Objec...

  • TUDU

    遍历数组和对象的区别 for in for of map 数组

  • 2021-11-15

    一、JavaScript Map 和 Object 的区别(https://www.cnblogs.com/ysx...

  • ES6中的Map和Set对象

    Map 对象 Map对象保存键值对。任意值(对象或者原始值)都可以作为一个键或一个值 Map和Object的区别 ...

  • javaScript 基础 02

    Map和Set JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结...

  • Map Set

    Map和对象的区别 Map上的key可以是任意类型, 对象上的key只能是字符串 Map上的key是有序的.按照新...

  • 2020你必须准备的50道Typescript面试题[转]

    01. TypeScript 和 JavaScript 区别? TypeScriptJavaScript面向对象的...

网友评论

      本文标题:2024-08-06 javascript对象和map区别

      本文链接:https://www.haomeiwen.com/subject/jrzxkjtx.html