Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么要对照原型而不是实例进行检查?_Javascript - Fatal编程技术网

Javascript 为什么要对照原型而不是实例进行检查?

Javascript 为什么要对照原型而不是实例进行检查?,javascript,Javascript,我只是在阅读,虽然它肯定比公认的答案快,但它需要阵列原型上的reduce功能 检查reduce功能是否存在非常简单;但是,尽管我所做的(并且看到的)大多数检查都是针对原型进行的,但这让我想知道:针对实例本身进行检查意味着什么?为什么原型检查似乎更受欢迎 // i.e. if (!!Array.prototype.reduce) { } // vs if (!![].reduce) 实例肯定需要一个实例,所以这是一件事,但它是吗?第二个版本涉及不必要地实例化一个空数组。为什么要这样做,当你可以

我只是在阅读,虽然它肯定比公认的答案快,但它需要
阵列
原型上的
reduce
功能

检查
reduce
功能是否存在非常简单;但是,尽管我所做的(并且看到的)大多数检查都是针对原型进行的,但这让我想知道:针对实例本身进行检查意味着什么?为什么原型检查似乎更受欢迎

// i.e.

if (!!Array.prototype.reduce) { }
// vs
if (!![].reduce)

实例肯定需要一个实例,所以这是一件事,但它是吗?

第二个版本涉及不必要地实例化一个空数组。为什么要这样做,当你可以只询问原型本身而不实例化任何东西时?

只是运行了一个基准测试:

Array.prototype.reduce
由于实例化了一个空数组,速度快了3倍,但实际上,这完全没有区别,因为这些检查几乎都是一次性检查,而不是在一直运行的代码中

多年来,我个人一直将此方法简化为
[].method
。对于
Array.prototype.slice.call(…)
vs
[].slice.call(…)
,我也做了同样的事情,这些调用的频率远远超过了一次


但是请注意,这只在
数组
上有效,因此您实际上没有节省很多钱。

数组
在技术上可以被覆盖,但构造函数[]cannot@Ian-若数组被覆盖,那个么就有更大的问题要处理…;-)无论哪种方式,您都可以将“!!”因为方法“if”省略为true或undefined,这是false。。。如果您正在检查一个数组方法,您可能已经有了一个数组,因此您不需要空的数组来点击“If(myArr.reduce)”,嗅探您的确切变量更准确地引导。主要的参数是,
[]
的键入时间要短得多…@dandavis~您的第二点是公平的,但不适用于以下情况,例如,我很可能是在写一个插件的扩展,因为我很可能是在“更一般”的意义上操作的。至于
,只要我明确地想要一个布尔值,我就写它,只是为了清楚(对别人,对我自己)。关于
if
,我确实提到了这一点,但我只是想知道这是否就是全部。但这并不是说开销可以忽略不计;我认识到这一点,并执行
prototype
检查,即使是出于这个原因。@RichardNeilagan我认为除了指示空数组来调用函数([].reduce)之外,JS运行时还必须查找对象实例prototype链来找到它。其中as Array.prototype.reduce告诉运行时在哪里可以找到它。@HMR实际上,在实例的
[[prototype]]]
上的查找更短,因此应该更快,因为空数组只有一个属性(长度)要检查。因此,查找将几乎直接转到原型。使用纯属性方法,必须在范围链上解析标识符数组,然后才能开始在数组的属性中查找原型(有两个)。但是使用实例可能不会更快,因为在全局范围内解析标识符似乎非常快(这几乎就像浏览器在局部变量对象之前检查全局)。