gpt4 book ai didi

javascript - 当 thisArg 与后续参数属于同一个数组时,function.prototype.apply 如何工作

转载 作者:行者123 更新时间:2023-11-29 16:06:33 27 4
gpt4 key购买 nike

作为日期/温度散点图的数据,我希望能够使用类似日期的字符串对数据进行键控,以下是我设计的结构:

  var dateTemperatures = {
'[2016,8,29]': {low: 63, high: 94},
'[2016,9,2]': {low: 59, high: 81},
'[2016,9,1]': {low: 58, high: 85}
}

想法是我可以在键上调用 JSON.parse,并获得创建日期所需的参数。然后我找到this Stackoverflow answer关于如何创建一个对象,使用 applynew .... () 的组合,特别是使用以下替换 Something日期:

var s = new (Function.prototype.bind.apply(Something, [null, a, b, c]));

它就像一个魅力,例如在我为订购“日期”键而设计的以下功能中:

  function orderTemperatureDates(dateTemperatures) {
var orderedDates = [];

for (var temperatureDate in dateTemperatures) {
var YMD = JSON.parse(temperatureDate);
YMD.unshift(null); //standard first argument to .apply()
orderedDates.push(new (Function.prototype.bind.apply(Date, YMD)));
}

return orderedDates.sort(function(a,b){return a.getTime() - b.getTime()});
}

控制台/日志/输出:

[Thu Sep 29 2016 00:00:00 GMT-0500 (Central Daylight Time), Sat Oct 01 2016 00:00:00 GMT-0500 (Central Daylight Time), Sun Oct 02 2016 00:00:00 GMT-0500 (Central Daylight Time)]

回到引用的 Stackoverflow 答案中的示例行,这是如何工作的?因为我的理解,根据 documentation here , null 可以是 apply 的第一个参数,后面是其余参数,但在示例和我的代码中,null 和所有其余参数都是同一个数组。

最佳答案

My understanding is that null can be the first argument to apply followed by the remaining argument

是的,您可以null作为apply的第一个参数传递您想要方法中的 this 值为 null(或者通常不关心它)。但这里不是这种情况。

new (Function.prototype.bind.apply(Date, [null, 2016, 8, 29])) 中,我们不传递 null 作为第一个apply 的参数,因为我们不希望这样。我们正在应用 bind 方法,我们需要将它与其余参数一起应用于 Date。该调用等同于

new (Date.bind(null, 2016, 8, 29))

我们将 null 作为第一个参数传递给 bind ,因为我们不关心当使用 new 关键字调用绑定(bind)函数时无论如何都会被忽略的值。

看看这个例子:

function constructor(a, b, c) {
"use strict";
console.log(this, a, b, c);
}
var bound = constructor.bind(null, 1, 2, 3);
bound();
new bound();


如果您知道 YMD 始终具有三个元素,那么编写 new Date(YMD[0], YMD[1], YMD[2]) 会更容易。如果您使用的是 ES6,您还可以使用扩展语法 new Date(...YMD) 进行调用。

关于javascript - 当 thisArg 与后续参数属于同一个数组时,function.prototype.apply 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223271/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com