为何JavaScript函数可像数组存取元素却无map方法?
问题解答
本质原因:函数是对象,但不是数组
在JavaScript里,函数本身就是一种特殊对象,所以你能像操作普通对象那样,用方括号给它添加属性——比如greeting[5] = "four"其实就是给greeting这个函数对象加了个名叫"5"的属性,这也是console.log(greeting[5])能输出four的原因,你只是在读取对象的属性而已。
而数组的map方法是定义在Array.prototype上的,只有数组(或者原型链指向Array.prototype的对象)才能调用这个方法。但函数的原型链指向的是Function.prototype,这个原型上根本没有map方法,所以直接调用greeting.map()自然会报错提示“不是函数”。
额外说明:数组的特殊之处
数组是带有序索引和length属性的特殊对象,它的数字索引本质也是字符串属性,但JS会自动把数字索引和length关联起来。但你给函数添加的"0"、"5"这类属性,不会让函数变成数组——它还是个函数对象,既没有数组的length特性,也不会继承数组的方法。
如果硬想让这个函数能用数组方法,可以手动把它转成数组,比如:
// 先给函数设置length,值为最大索引+1 greeting.length = 8; // 转成数组后再调用map Array.from(greeting).map(i => console.log(i))
这样就会依次输出:zero、one、undefined、two、three、four、five、six。
内容的提问来源于stack exchange,提问作者Euler eulerhenriuqe
相关产品推荐
相关产品推荐

