当前位置: 首页 > 科技观察

一道JS笔试题刷新了我对map方法功能的认识,你做对了吗?

时间:2023-03-12 01:33:39 科技观察

背??景昨天看一道笔试题的时候,觉得很简单,结果和想象中的不太一样,就直接上笔试题了。constarray=newArray(5).map((item)=>{returnitem={name:'1'}});console.log(array);//输出结果请写“我想象的答案”:[{名称:'1'},{名称:'1'},{名称:'1'},{名称:'1'},{名称:'1'}];“实际答案”:[空×5]为什么会这样?猜想1我首先想到的是newArray(5)生成的数组是[undefined,undefined,undefined,undefined,undefined]。constarray=[undefined,undefined,undefined,undefined,undefined];constnewArr=array.map((item)=>{returnitem={name:'1'}});console.log(newArr);//结果为[{name:'1'},{name:'1'},{name:'1'},{name:'1'},{name:'1'}];《猜1错》猜2newArray(5)生成的数组每一项都没有值,也就是说生成了[,,,,,]这样的数组。constarray=[,,,,,];constnewArr=array.map((item)=>{returnitem={name:'1'}});console.log(newArr);//结果为[empty×5];“猜测2是正确的”为什么map按顺序为数组中的每个元素调用一次提供的回调函数,并根据结果构造一个新数组。callback只对数组的下标赋值(包括undefined)调用,数组缺失元素不调用;即:从未设置的索引;已被删除;orwhichhaveneverbeenassignedavalue.map依次为数组中的每个元素调用一次提供的回调函数,并根据结果构造一个新数组。-----仅对已赋值(含)的数组索引调用----。地图函数的回调函数只会被分配的项目调用。newArray(1)与[undefined]不同。newArray(1)没有给数组中的项目赋值,[undefined]给数组中的项目赋了一个未定义的值。总结newArray(5)产生的数组是一个没有给数组中的项赋值的数组。map只对已经赋值(含)的数组索引进行回调调用。深入思考map方法constarray=newArray(5)可以理解为constarray=[]array.length=5也可以理解为constarray=[,,,,,]但是这里我有一个疑问:我用学习手写map方法去百度一下,你会发现基本上很多人都是手写的:Array.prototype.MyMap=function(fn,context){vararr=Array.prototype.slice.call(this);//因为是ES5所以不需要扩展字符varmappedArr=[];for(vari=0;i>>0;letA=newArray(len);for(letk=0;k>>0,字面意思是“右移0位",但实际上是用0填充前面的空格。这里的作用是保证len是一个数字,是一个整数。一些特殊情况:null>>>0//0undefined>>>0//0void(0)>>>0//0functiona(){};a>>>0//0[]>>>0//0vara={};a>>>0//0123123>>>0//12312345.2>>>0//450>>>0//0-0>>>0//0-1>>>0//4294967295-1212>>>0//4294966084总体来说实现起来没有那么难,需要注意的是用in来搜索原型链。同时如果没有找到则不处理,可以有效处理稀疏数组的情况。最后,向大家献上V8源码。参考源码查看。其实还是很完整的。functionArrayMap(f,receiver){CHECK_OBJECT_COERCIBLE(this,"Array.prototype.map");//拉出修改长度//loopwillnotaffecttheloopingandsideeffectsarevisible.vararray=TO_OBJECT(this);varlength=TO_LENGTH(;LLLE.f_IS))throw%make_type_error(kCalledNonCallable,f);varresult=ArraySpeciesCreate(array,length);for(vari=0;i