跟着大神学JavaScript之边学边记(二)

本文深入解析JavaScript对象特性,探讨ES6引入的Map与Set数据结构,覆盖键值对、遍历机制及iterable概念,适合初学者与进阶开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<前一篇文章 跟着大神学JavaScript之边学边记(一)

参考:

对象 由若干键值对构成

特点:

  • 对象中都是一组组键值对,且无先后顺序
  • key值都是字符串类型,value值可以是任意类型。若key值中有特殊字符,需要用单引号括起来。
  • 访问不存在的属性时,返回undefined
  • 可以通过=添加属性值,或者使用delete删除
var person = {
  name: "小明",
  age: 16,
  'xx_z': 'nothing'
}
console.log(person.name);  // 小明
console.log(person.newPro);  // undefined
person.newPro = '新属性';   // 赋值
console.log(person.newPro);  // undefined

引用属性的两种方式:

  1. obj.key 直接使用点操作符,通过对象.属性获得
  2. 使用obj[‘key’]获取属性,当key值中特殊字符时,必须用此方式

for … in …

在第一篇学习中,in操作符可以判断属性是否在对象中,而JavaScript可以通过for ... in ...表达式遍历对象的key值。

var obj= {
	A : "甲",
	B:  "①",
	C: "兵丁"
}
for (var key in obj) {
	var r = key + "\t" + obj[key] + "\t" + obj.key;
	console.log(r);
}

/* 输出
19:25:09.626 	A	甲	undefined 
19:25:09.627 	B	①	undefined 
19:25:09.627 	C	兵丁	undefined
*/

注意: 通过for … in …遍历获得的key值都是字符串,所以obj.key相当于obj.‘A’,于是返回undefined

数组也可以认为是对象(值为字符串类型索引),于是也可以使用for .. in ..遍历,也可以用数组下标访问。

var arr = [1, "②",  "叁"];  
for (var key in arr) {
	console.log(arr[key]);
}
for(int i = 0; i < arr.length; i++) {
	console.log(arr[i]);
}
// 即arr[0]与arr['0']都是指向数组第一个元素 1

Map 与 Set

ES6中,引入新的的规范,Map与Set。
Map
键值对(key-value)组合,查找速度快,并且比Array更容易查找对应关系。

初始化方式

  • var map = new Map();
  • var map2 = new Map([[‘李’, ‘优’],[‘王’, ‘良’],[‘和’, ‘差’]]);
  • 使用空数据,或者一个n x 2的二维数组

方法

方法名用法 &含义
set(key,value)m.set(‘san’,‘优’) ,设置map的值
has(key)m.has(‘李’),判断是否有该Key值
get(key)m.get(‘李’), 返回key对应的value值,若为空,返回undefined

Set
一组value值组合(个人感觉是value组合,更符合前后方法),但不允许重复,

初始化方式

  • var s = new Set();
  • var s2 = new Set([‘yes’, ‘甲’, ‘优’, ‘丁’]);
  • 空参数 ,或者使用Array作为输入

方法

方法用法 & 含义
add()s.add(8),向set中添加元素
delete()s.delete(6),删除set中元素,注意与对象中delete方法区分

iterable

目前遍历Array可以使用for ... in或 遍历下标循环。而Map与Set无法使用下标循环。而后引入iterable类型(Array、Map、Set),iterable可以通过for ... of遍历

for .. infor ... of对比

for .. infor .. of
Array可以认为是一个对象,所以可以通过 =赋值,a.newPro = ‘newProperty’,而for… in 能将newPro遍历出来不会将newPro遍历出来,且=赋值后的array长度不变
遍历出值为key遍历出来值为value

iterable内置的forEach方法

// Array
a.forEach(function(element, index, array) {
	// element array中value值
	// index  array中索引值
	// array  数组本身对象
});
// Map
m.forEach(function(value, key, map) {
	// value map中value值
	// key  map中key值
	// map  map本身
});
// Set
s.forEach(function(element, sameElemet, set) {
	// elemetn set中元素值
	// sameElemt  set中无索引值,与set中元素值一样
	// set  set本身
}

注意: 三个参数不必完全输入,可选择一两项,但顺序与位置不可变

基础知识入门小结示例

function out(str) {
  console.log(str);
}

var array = ['甲','乙'];
var map = new Map([['李', 'li'],['王', 'wang']]);
var set = new Set([11,8,25,'8']);

// 遍历索引输出array
for (var i = 0; i < array.length; i++) {
  out(array[i]);
}

// for in 遍历array   以及  点操作符与中括号操作符,
out(`key\tarray[key]\tarray.key`)
for (var key in array) {
  // 遍历的key全是字符串类型
  out(`${key}\t${array[key]}\t${array.key}`)
}

out(`----array -- for  of-----`);
for (var value of array) {
  out(`${value}`)
}

out(`-----map -- for  of------`)
for (var value of map) {
  out(`${value}\t ${map.get(value)}`);
}

out(`-----set -- for  of------`)
for (var value of set) {
  // array、set、map中 3 与 '3'不同
  out(`${value}`);
}
// output
15:01:38.12715:01:38.12715:01:38.127 	key	array[key]	array.key 
15:01:38.128 	0	甲		undefined 
15:01:38.128	1	乙		undefined
15:01:38.128 ----array -- for  of----- 
15:01:38.12815:01:38.12815:01:38.129 -----map -- for  of------ 
15:01:38.129,li	 undefined 
15:01:38.129,wang	 undefined 
15:01:38.130 -----set -- for  of------ 
15:01:38.130 	11 
15:01:38.130 	8 
15:01:38.130 	25 
15:01:38.130 	8  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值