Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >[].map.call()对Array.prototype.map.call()?

[].map.call()对Array.prototype.map.call()?
EN

Stack Overflow用户
提问于 2016-02-24 12:41:47
回答 2查看 3.9K关注 0票数 2

为什么一个比另一个更好呢?

[].map.call(...)

Array.prototype.map.call(...)

jsPerf中进行快速测试表明,Array.prototype方式更有表现力,尽管我在某个地方读到了jsPerf结果可能具有欺骗性。不是为了讨论jsPerf,而是想了解一下为什么一个会比另一个更好。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-24 12:42:31

在没有恶作剧的情况下,[].mapArray.prototype.map的值是相同的。表达式[].map涉及(至少在概念上;它可以被优化,可能的话)构造一个新的数组实例,这样可能会产生(非常小的)性能影响。

表达式[].map创建一个新的空数组,然后引用它的"map“属性。除非添加"map“属性,否则数组实例不具有”map“属性,因此在对象本身上找不到它。因此,运行时将检查原型链上的下一个东西,当然是Array.prototype对象。运行时将在那里找到一个"map“属性--特别是Array.prototype.map。这就是为什么他们是一样的。

{}.toStringObject.prototype.toString具有类似的等价性。使用模式的主要区别可能是,{}.toString在表达式的开头出现时可能会引起问题,因为在这种情况下,前面的{将被视为语句块{,而不是对象初始化{。但是,{}.toString的典型用法并不是很可能需要启动表达式。因此

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log({}.toString.call(someMysteryObject));

工作得很好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(Object.prototype.toString.call(someMysteryObject));

就性能而言,在.map()的情况下,在使用该方法时隐含的函数调用的开销几乎肯定会完全克服两种方法在开始时查找对.map()函数的引用之间的性能差异。

票数 13
EN

Stack Overflow用户

发布于 2016-02-24 12:53:17

基准测试

1.背景

我做了一个基本的基准测试,看看我是否能发现这四种不同语句之间的性能差异:

  • dataSet.map(function)
  • dataSet.map.call(dataSet, function)
  • [].map.call(dataSet, function)
  • Array.prototype.map.call(dataSet, function)

2.方法

我在一个孤立的沙箱中执行了这四条语句中的每条语句1,000,000次,并比较了之后的处理时间。

我使用以下计时器函数来确定处理时间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var timer = function(name) {
    var start = new Date();
    return {
        stop: function() {
            var end  = new Date();
            var time = end.getTime() - start.getTime();
            console.log('Timer:', name, 'finished in', time, 'ms');
        }
    }
};

3.试验环境

我在一台2年前使用英特尔i7四核CPU的ASUS笔记本电脑上进行了测试。

我在Linux Ubuntu中进行了测试,在以下两个浏览器上进行了测试:

  • Firefox 43.0
  • 铬45.0

4.设想情况

4.1。dataSet.map(function)场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    reformattedArray = kvArray.map(function(obj){ 
        rObj = {};
        rObj[obj.key] = obj.value;
        return rObj;
    });
}

t.stop();  // <-- STOP BENCHMARK

(另见这个小屁孩)

4.2。dataSet.map.call(dataSet, function)场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    reformattedArray = kvArray.map.call(kvArray, function(obj){
        rObj = {};
        rObj[obj.key] = obj.value;
        return rObj;
    });
}

t.stop();  // <-- STOP BENCHMARK

(另见这个小屁孩)

4.3。[].map.call(dataSet, function)场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    reformattedArray = [].map.call(kvArray, function(obj){
        rObj = {};
        rObj[obj.key] = obj.value;
        return rObj;
    });
}

t.stop();  // <-- STOP BENCHMARK

(另见这个小屁孩)

4.4。Array.prototype.map.call(dataSet, function)场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    reformattedArray = Array.prototype.map.call(kvArray, function(obj){
        rObj = {};
        rObj[obj.key] = obj.value;
        return rObj;
    });
}

t.stop();  // <-- STOP BENCHMARK

(另见这个小屁孩)

5.中期成果

我没有注意到这四种场景之间的性能差异,但是我确实注意到Firefox比Chrome快4倍(对于这两种场景)。

更确切地说,Chrome大约需要1秒来处理每个场景,而Fixefox只需要0.25秒。

为了评估这些浏览器差异是否特定于map方法,我进一步简化了测试。

6.情景v2

6.1。场景v2用于dataSet.map(function)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    kvArray.map(function(obj){ 
        return rObj;
    });
}

t.stop(); // <-- STOP BENCHMARK

(另见这个小屁孩)

6.2。场景v2用于dataSet.map.call(dataSet, function)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    kvArray.map.call(kvArray, function(obj){
        return rObj;
    });
}

t.stop(); // <-- STOP BENCHMARK

(另见这个小屁孩)

6.3。场景v2用于[].map.call(dataSet, function)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    [].map.call(kvArray, function(obj){
        return rObj;
    });
}

t.stop(); // <-- STOP BENCHMARK

(另见这个小屁孩)

6.4。场景v2用于Array.prototype.map.call(dataSet, function)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var t = timer('Benchmark'); // <-- START BENCHMARK

var reformattedArray;
var rObj;
var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
for(var i = 0; i < 1000000; i++) {
    Array.prototype.map.call(kvArray, function(obj){
        return rObj;
    });
}

t.stop(); // <-- STOP BENCHMARK

(另见这个小屁孩)

7.最后结果

现在,Chrome运行这些场景需要大约0.275秒,Firefox大约需要0.035秒。这意味着火狐比Chrome快7倍多。

同样,在使用相同的浏览器时,四种场景中的每一种都没有明显的性能差异。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35612650

复制
相关文章
通过 6 个简单的实例复习下JS 的 Map() 函数
英文 | https://betterprogramming.pub/6-use-cases-for-map-in-javascript-a09f51ea2d2c
前端达人
2021/12/27
1K0
JavaScript选择器
JS选择器常用的有getElementById()、getElementsByClassName()、getElementsByName()、getElementsByTagName()、querySelector()、querySelectorAll()。
WindRunnerMax
2020/08/27
7570
Effective JavaScript Item 51 在类数组对象上重用数组方法「建议收藏」
Array.prototype对象上的标准方法被设计为也能够在其他对象上重用 – 即使不是继承自Array的对象。
全栈程序员站长
2022/07/10
8980
JS高级测试: ['1', '2', '3'].map(parseInt) 的运算结果是多少?
map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
舒克
2019/09/16
1.6K0
JS高级测试: ['1', '2', '3'].map(parseInt) 的运算结果是多少?
xxx.forEach is not a function(DOM集合--类数组对象转化为数组)
1,错误:Uncaught TypeError: hdList.forEach is not a function
Rattenking
2021/01/29
2.5K0
Callback 与 Promise 间的桥梁 —— promisify
iKcamp
2018/01/04
1.3K0
微信小程序蓝牙API使用详解,完整版
github地址:https://github.com/dujingya/blueDevice/blob/master/blueDevice.md
IMWeb前端团队
2019/12/03
4.6K1
微信小程序蓝牙API使用详解,完整版
详解Mybatis一对多、多对一、多对多
是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单说来就是关系型数据库用了选择、投影、连接、并、交、差、除、增删查改等数学方法来实现对数据的存储和查询。可以用SQL语句方便的在一个表及其多个表之间做非常复杂的数据查询。安全性高。
utopia
2023/03/21
1.5K0
对的时间遇到对的课
同学们好! 《计算机视觉原理及实战》已经开播两节拉! 内容新颖有趣,范例源自生活 好奇宝宝们请戳下面的节选see see~ ▼
AI科技大本营
2018/04/27
6240
java键值对_Java 读写键值对
public static void main(String[] args) throws IOException {
全栈程序员站长
2022/07/23
2K0
逆序对!
今天继续来学习《剑指Offer》系列的一道经典题目:数组中的逆序对,依旧给出了非常详细的题解和精美的配图与动画。
五分钟学算法
2022/02/18
5660
逆序对!
回文对
给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。
你的益达
2020/08/10
4260
ES5新增
forEach // forEach 返回undefined var arr = ['Prosper', 'Lee', 'is', ['very', 'very'], 'nice', '!', , null]; // ES6写法 arr.forEach((currentValue, index, array) => { console.log('arr[' + index + ']=' + array[index] +
ProsperLee
2018/12/12
6680
MyBatis 详解(一对一,一对多,多对多)
1、什么是MyBatis?   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,
IT可乐
2018/01/04
5.2K0
MyBatis 详解(一对一,一对多,多对多)
mybatis 详解(七)------一对一、一对多、多对多
  前面几篇博客我们用mybatis能对单表进行增删改查操作了,也能用动态SQL书写比较复杂的sql语句。但是在实际开发中,我们做项目不可能只是单表操作,往往会涉及到多张表之间的关联操作。那么我们如何
IT可乐
2018/01/04
5.8K0
mybatis 详解(七)------一对一、一对多、多对多
一个针对996公司的NPM库
通过重写数组的原型链上方法,includes方法当数组长度可以被7整除时,永远返回false
Peter谭金杰
2022/09/23
8170
Qt中QMap键值对基本用法(键值对)
T1为键值对中的键key,T2为键值对中的值。通过键值对中的键可以搜索到值。一般来说,键值对中的键是唯一的,不可重复,而值没有要求,可以重复。并且QMap具有自动排序功能,对输入的键进行排序。
全栈程序员站长
2022/09/02
3.6K0
pair对组
功能描述: 成对出现的数据,利用对组可以返回两个数据 两种创建方式: #include<iostream> using namespace std; #include<string> void
大忽悠爱学习
2021/03/02
2800
pair对组
对udisk操作
这几天为了完成导师的任务在封校的苦闷日子中找一点乐趣,想着怎么对自己的u盘进行一些操作,让我能够读取固定位置的数据。
Heeler-Deer
2023/02/22
7280
对"%in%"的理解
---title: '对"%in%"的理解'output: html_documentdate: "2023-03-08"---1. x %in% y(1)指的是x的每个元素在y中存在吗?(2)返回的是长度与x相等的逻辑值向量(3)一般x是总体(大),y是筛选指标(小),运用%in%可以从x中筛选出符合y条件的元素x = c(1,3,5,1)y = c(3,2,5,6)x %in% y ## [1] FALSE TRUE TRUE FALSE(4)x %in% y返回的逻辑值个数与%in%前面的向量元素
小叮当aka
2023/03/17
5480

相似问题

Array.prototype.map.call对Array.map

28

CasperJS querySelectorAll + map.call

11

Array.prototype.map.call()的返回类型为unknown[]

13

js:为什么使用Array.prototype.map.call而不是map()?

34

为什么选择Array.prototype.map.call而不是Array.map.call

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文