修炼js 3数据结构

22 篇文章 0 订阅

这次我们来缕一缕Js的数据结构。

1、首先登场的是大家都比较熟悉的数组
接下来让我们先看看如何定义数组吧。

// 方式一
let arr1 = [];// 空数组

// 方式二
let arr2 = new Array(5);//创建长度为5的空数组,不写参数即 为没有长度的空数组
// 以上都是常见的写法,接下来是不太常见的写法

// 方式三
let arr3 = Array.of(1,2);//创建了一个长度为2数组并填充为1,2

// 方式四
let arr4 = Array(5).fill(3);//创建一个长度为5的数组并全部填充为3.

那么数组已经认识了,但是光认识还不行,接下来让我们多了解一下数组先生吧。
数组常用方法

var arr1 = [];
arr1.push(1);	// 向数组的末尾添加一个或多个元素,并返回新的数组长度.
arr1.pop();// 删除并返回数组的最后一个元素,若该数组为空,则返回undefined

arr1.unshift()//向数组的开头添加一个或多个元素,并返回新的数组长度。
arr1.shift()//删除数组的第一项,并返回第一个元素的值。若该数组为空,则返回undefined。

arr1.reverse();//将数组倒序。
arr1.sort();//对数组元素进行排序,从小到大
arr1.forEach(function)//用于调用数组的每个元素,并将元素传递给回调函数。
// 以上方法都会改变原数组
arr1.concat(arr2,arr3); //拼接两个数组生成新数组。 
arr1.join()//将数组的每一项用指定字符连接形成一个字符串。默认连接字符为 “,” 逗号。

arr1.filter(function(params){
   return params>5;
});//筛选出符合条件的元素 加入到新数组返回。

2、现在轮到“对象”了,嗯~~“对象”😏😏
先认识一下吧。

// 方式一
var obj1 = {};

// 方式二
var obj2  = new Object();

那么她/他有什么特点呢,属性描述符

var obj = {}
Object.defineProperty(obj,'attr',{
	value:'test',	// 值
	writable: false,// 可写性,为true时可对attr属性进行赋值操作
	enumerable: false,// 可枚举性,
	configurable: true,// 可配置性,为false则不能修改此属性的属性描述符
})//方法会直接在一个对象上定义一个
//新属性,或者修改一个对象的现有属性,并返回此对象。

哈哈哈,可能你突然对你的对象有了新的认识。下面来看看他/她访问描述符吧。
get set 第一种形式

var obj = {
    _attr:18,
}
Object.defineProperty(obj,'attr',{
    get:function(){
        return this.attr;
    },
    set:function(params){
        this._attr = params;
    }
})

get set 第二种形式

var obj={
    _name:'zyx',
    get name(){
        console.log("欢迎访问get")
        return this._name;
    },
    set name(name){
        this._name = name;
        console.log("欢迎访问set")
    }
}
obj.name="zs"
console.log(obj.name);
// 注意属性和方法尽量不要重名,因为方法会提升到变量之前(声明),
// 所以可能会导致set时调用再次调用get name方法 get 时调用set name方法,
// 造成栈溢出 Maximum call stack size exceeded

个人比较喜欢第二种方式,顺带一提vue2双向绑定原理就是这么实现的,通过get
和 set,data()函数返回的对象,vue会遍历该对象里面所有属性并使用 Object.defineProperty把他们转为get set。vue3的双向绑定由 Object.defineProperty实现双向绑定变为了proxy,如果有兴趣的话可以去试一试vue beta版。那么接下来我们一起来看看 他/她常用的方法吧。

obj.toString() //返回一个表示该对象的字符串
obj.isPrototypeOf()// 用于测试一个对象是否存在于另一个对象的原型链上。
obj.freeze()// 方法可以冻结一个对象。一个被冻结的对象再也不能被修改
obj.hasOwnProperty()// 返回一个布尔值,指示对象自身属性中是否具有指定的属性
Object.assign(target,source)//用于将所有可枚举属性的值从一个或多个源对象复制到
//目标对象。它将返回目标对象
Object.keys()//返回一个给定对象的自身可枚举属性组成的数组
Object.values()//能返回键基本就能返回值
Object.entries()//返回键值对组成的数组

接下来我们看看平时不太常见的 es6新增的两个数据结构吧!
3、Set Map
Set 是一个像数组的对象Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
3.1、Set
使用Set可轻松实现数组去重

let arr = new Set([1,1,2,3,3,4]);
console.log(arr.entries(),arr.keys(),Array.from(arr.values()));
// Array from类数组转数组

// 常用的方法
arr.add(params) //实例方法 params参数
arr.clear() // 移除Set中所有元素
arr.delete(params) // 删除与参数相同的 value的元素
arr.has(params) // 检查该参数是否在Set中存在 返回布尔值 

3.2、Map
map是一种键值对的结构,具有极快的查找速度。以下是map的定义及语法。

let map = new Map([["key1",2],[obj1={name:'zyx'},3]]);//你几乎可以使用类型的数据来当作map的键
// Map() 参数必须是一个可迭代的对象 也就是必须部署了 Iterable接口的对象。
map.set(arr[1,2],5)	// 设置Map对象中键的值。返回该Map对象。 //参数一为键 参数二为值
map.get(obj1); // 3 返回键对应的值,如果不存在,则返回undefined。
map.size(); // 返回map键值对数量
map.clear(); // 清空map/移除所有键值对

ok,看到这里基本上就结束了,如果想要了解set map更深入请移步至mdn。蟹蟹各位看官。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值