Array
Q:如何检测对象是否是数组?
A:
javascriptconst arr=[1,2,3,4]; // 方法一:Array.isArray(); Array.isArray(arr); // 方法二:instanceof arr instanceof Array // 方法三:Object.prototype.toString.call Object.prototype.toString.call(arr).slice(8,-1)==='Array'; // 方法四:Array.prototype.isPrototypeOf Array.prototype.isPrototypeOf(arr); // 方法五:原型对比 arr.__prototype__ === Array.__prototype__;相关知识点:
javascriptconst notCall = Object.prototype.toString(arr); // 这里的this为Object // =>['object','object'] const useCall = Object.prototype.toString.call(arr); // 这里的this为arr中的this // =>['object','array']
Q:数组设置超过数组长度的值时,会产生啥?
A:JavaScript 会创建名为 "empty slots" 的东西。它们的值实际上是
undefined。javascriptconst numbers = [1, 2, 3] numbers[10] = 11 //[1, 2, 3, 7 x empty, 11] console.log(numbers)
Q:什么是array.push()
- A:将数据项插入数组尾部。
- 返回值:插入后的数组长度。
Q:会影响源数组的方法?
A:
方法 描述 splice对源数组进行切割 pushpopshiftunshift
Q:会形成并返回新数组的方法?
A:
方法 描述 map遍历生成新数组 filter过滤并生成新数组 slice切割并返回切割后的新数组
Q:数组铺平方法有哪些?
- A:
{array}.flat(layer)
Map
【ES6】新的集合类型
Map可以使用任何数据类型作为键
Map实例会维护键值对的插入顺序。
映射实例可以提供一个迭代器
javascriptconst m=new Map([ ["key1","val1"], ["key2","val2"], ["key3","val3"], ]) console.log(m.entries===m[Symbol.iterator])//true;Map对象转数组
javascriptconsole.log([...m])//[[key1,val1],[key2,val2],[key3,val3]]遍历Map对象与遍历Object对象一致
javascriptfor(let key of m.keys()){ console.log(key); } //key1 //key2 //key3 for(let val of m.values()){ console.log(val); } //value1 //value2 //value3键和值在迭代器遍历时是可以修改的,但映射内部的引用无法修改。
Set
Q:Set构造函数创建出来的返回值是什么类型?
A:对象。
javascriptconst set = new Set([1, 1, 2, 3, 4]); console.log(set);//{1,2,3,4}
Q:set对象如何转数组类型?
A:
javascriptconst s=new Set(['val1','val2','val3']); console.log([...s]);
Q:map和set的区别?
A:
map set 集合内容 一组键值对 一组唯一值 创建对象 new Map( 二维数组)new Set( 数组)元素构成 键是唯一的,值可以重复 值是唯一的,不允许重复 添加元素 .set( key,value).add( ele)获取元素 .get( key)[...set]?.[index] 遍历方法 forEach for...of 相同点:
相同api Map描述 set描述 .size() 获取映射中的键/值对的数量 获取元素数量 .has( key/ele)查询是否存在 key查询元素 .delete( key/ele)删除 key的键/值对删除元素 .clear() 清除这个映射实例中的所有键/值对 销毁集合实例中所有的值 set可以包含任何数据类型的值。
set支持顺序迭代
集合实例可以提供一个迭代器
javascriptconst s=new Set(['val1','val2','val3']); console.log(s.values===s[Symbol.iterator])//true; console.log(s.keys===s[Symbol.iterator])//true;遍历set对象
javascript//以上述案例 for(let [key,value] of s.entries()){ console.log(key,value); } // val1,val1 // val2,val2 // val3,val3 s.forEach((key,value)=>console.log(key,value))//输出同上在遍历中修改set对象的值
javascriptconst s1 = new Set(["val1"]); for(let val of s1.values()){ val='newVal'; console.log(val);//newVal console.log(s1.has('val1'))//true; } //set元素为数组时,无法修改其值 const valObj={id:1} const s2 = new Set([valObj]); for(let val of s2.values()){ val.id='newVal'; console.log(val);//{id:'newVal'} console.log(s1.has(valObj))//true; } console.log(valObj);//{id:'newVal'} //set元素为Object时,可以修改其中的值。