Object
创建对象
-
使用Object创建对象
let obj = new Object() obj.name = 'atuotuo'; -
使用字面量创建对象
let obj = { name : 'atuotuo'; }
Array
创建数组
-
使用Array创建数组
let arr1 = new Array();// 创建一个长度为0 的数组 let arr2 = new Array(20);// 创建一个包含20个元素的数组 let arr3 = new Array(1,2,3); // 创建一个包含1,2,3的数组 -
使用字面量创建数组
let arr = [1,2,3]; -
使用Array.from()创建数组
第一个参数传递一个类数组对象,即任何可迭代对象或者有一个length属性和可索引元素的结构。
//将字符串拆分为数组 let arr = Array.from("123") // ['1','2','3'] // 将类数组转为数组 let arr1 = Array.from(arguments); -
使用Array.of()创建数组
array.of可以把一种参数转为数组
Array.of(1,2,3,4); [1,2,3,4]
检测数组
-
instanceof
if(arr instanceof Array) -
Array.isArray
if(Array.isArray(arr)) -
Object.prototype.toString.call()
if(Object.prototype.toString.call(arr) == '[object Array]')
数组方法
本文不再阐述,详细操作请参考:developer.mozilla.org/zh-CN/docs/…
Map
Map是ES6的新增特性,是一种新的集合类型,Map的大多特性都可以通过Object类型实现,但二者之间还是存在一些细微的差距。
object的键只能使用数值,字符串,或者符号作为键。但是map可以使用任何js数据类型作为键。
基础API
let map = new Map([['name','atuotuo']]);// 创建map对象
map.size; // 返回map中键值对的数量
map.set('age',20); //添加属性
map.get('name'); // 获取属性的值
map.has() // 判断map中是否存在key
map.delete('age'); // 删除delete
map.clear() // 清空map
迭代方法
map.keys(); // 返回键名的迭代器
map.values(); // 返回值的迭代器
map.ertries();// 返回所有成为的迭代器
map.forEach();// 遍历成员
WeakMap
weakmap是一种“弱映射”的新的集合类型。
若映射中的键只能是Object或者继承字Object的类型,键必须是引用类型。
weakmap的使用方式与map基本一致,但是键必须是引用类型,不可迭代。
弱键
存储再weakMap中的键,不属于正式的引用,不会阻止垃圾回收。只要键存在,键值对就会存在于映射中,并被当作对值的引用,因此就不会被当成垃圾回收
不可迭代键
因为WeakMap中的键值对任何时候都可能被摧毁,所以没有必要提供迭代器键值对的能力。
使用弱映射
-
DOM节点元数据
因为weakmap实例不会妨碍垃圾回收,所以适合保存关联元数据。可以有效避免内存泄漏
Set
set是es6新增的集合类型。它类似于数组,但是成员的值都是唯一的,没有重复的值。
基础api
let set = new Set();
set.size //返回Set实例的成员总数。
set.add(value) //添加某个值,返回 Set 结构本身。
set.delete(value) //删除某个值,返回一个布尔值,表示删除是否成功。
set.has(value) //返回一个布尔值,表示该值是否为Set的成员。
set.clear() //清除所有成员,没有返回值。
迭代方法
map.keys(); // 返回键名的迭代器
map.values(); // 返回值的迭代器
map.ertries();// 返回所有成为的迭代器
map.forEach();// 遍历成员
WeakSet
WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,WeakSet 的成员只能是对象,而不能是其他类型的值。
WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
常见面试题
常见的循环方式
let arr = [1,2,3];
let obj = {'name':'atuotuo'}
for(let i = 0;i < arr.length;i ++){} // 直接遍历
for(let item in obj){} // 遍历获取对象的key
for(let item of arr) // 遍历获取值,只能遍历对象中存在迭代器的对象
arr.forEach((item,index)=>{}) // 使用内置方法遍历,不能在中途break;
arr.map((item,index)=>{})
arr.filter((item,index)=>{})
arr.some(()=>{})
arr.every(()=>{})
Object于Map的区别
| 特性 | Map | Set |
|---|---|---|
| 意外的键 | map默认情况下不包含任何键,只包含显示插入的键 | object有一个原型,原型链上的键名有可能和自己在对象上设置的参数冲突 |
| 键的类型 | map的键可以是任意类型 | object必须是string或symbol |
| 键的顺序 | map的key是有序的,插入的顺序 | object的键是无序的 |
| size | map的键值对个数可以通过size获取 | object的键值对个数只能手动计算 |
| 迭代 | map的通过iterable迭代器直接迭代 | 迭代object需要以某种方式获取他的键才能进行迭代 |
| 性能 | 频繁增删键值对的场景下表现更好 | 频繁增删键值对的场景下没有进行优化 |
js类数组对象的定义
拥有length属性和若干索引属性的对象就可以被称为类数组。
类数组对象和数组类似,但是不能调用数组的方法,常见的类数组对象有arguments和DOM方法的返回结果。
将类数组转为数组的方法:
Array.prototype.slice.call(argumrnts)
Array.prototype.splice.call(argumrnts,0)
Array.prototype.concat.call([],arguments);
Array.from(arguments)
数组有哪些元素方法
| 类别 | 方法 |
|---|---|
| 进出数组 | push,pop,shift,unshift,splice |
| 排序和反转 | sort,reverse |
| 切片 | slice |
| 转字符串 | tostring,join |
| 数组连接 | concat |
| 查找元素 | indexOf,lastIndexOf,find |
| 迭代方法 | forEach,map,every,filter,some |
| 匹配和替换 | match,replace |
obj.hasOwnProperty()
判断某个属性是否属于某个对象本身,不在原型链中寻找
for in 和 for of有什么区别
for…of 是ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组、对象等)并且返回各项的值,和for…in`的区别如下:
for…of遍历获取的是对象的键值,for…in 获取的是对象的键名;for…in会遍历对象的整个原型链,性能非常差不推荐使用,而 for…of 只遍历当前对象不会遍历原型链;- 对于数组的遍历,
for…in会返回数组中所有可枚举的属性(包括原型链上可枚举的属性),for…of只返回数组的下标对应的属性值;
总结:for...in循环主要是为了遍历对象而生,不适用于遍历数组;for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象。