我遇到过两种将Array原型应用于原生对象的方法:
arr = Array.prototype.slice.call(obj);
arr = [].slice.call(obj);
以类似的方式,获取本机类数组对象的真实类型:
type = Object.prototype.toString.call(obj);
type = {}.toString.call(obj);
一个简单的测试:
function fn() {
console.log(
Array.prototype.slice.call(arguments),
[].slice.call(arguments),
Object.prototype.toString.call(arguments),
{}.toString.call(arguments)
);
}
fn(0,1);
小提琴:http://jsfiddle.net/PhdmN/
对我来说,它们似乎是一样的;第一种语法使用得更频繁,但第二种语法肯定更短。使用较短的语法有什么缺点吗?
发布于 2012-01-26 00:50:59
它们在功能上是相同的。
但是,可以覆盖Array
对象,从而导致第一种方法失败。
//Example:
Array = {};
console.log(typeof Array.prototype.slice); // "undefined"
console.log(typeof [].slice); // "function"
文本方法创建一个新的Array
实例(与Array.prototype.
方法相对)。两种方法的基准:http://jsperf.com/bbarr-new-array-vs-literal/3
当您要多次使用该方法时,最佳实践是缓存该方法:
var slice = Array.prototype.slice; //Commonly used
var slice = [].slice;
-如果您担心Array
的存在,或者您只是喜欢较短的语法。发布于 2018-10-15 23:29:12
这是一个有趣的问题!让我们分析一下每个替代方案的优缺点(✔️)和缺点(❌):
[].slice
两次击键,没有shift键或任何东西,
而且你的林特知道[.slice
是一个打字错误。
您可以更快地识别相关部分(slice
)。
56M+ snippets on GitHub (截至2018年末)。
Rob's answer的第一部分演示了这个perfectly.
等等,什么?实际上,这就是这个答案的全部意义所在。
与你在任何地方想和读到的相反,[].slice.call(...)
Array
does实例化一个新的、空的属性只是为了访问它的属性!。
如今( 5+多年都是如此--截至2018年末),即时编译 (1)包含在您运行JavaScript的任何地方(除非您仍在使用IE8或更低版本浏览网页)。
该机制允许JS引擎:(2)
...直接解析
[].slice
,静态解析,作为直接的Array.prototype
引用,只需一次可配置的属性访问:forEach
Array.prototype.slice
在您尝试运行代码之前,拼写错误(例如:Array.prorotype.slice
)看起来很好。
8M+ snippets on GitHub (截至2018年末)。
Array.prototype.slice
是:(2)
...查找
Array
引用的整个作用域,直到遍历完所有作用域,直到全局 one为止,因为您可以随时将变量命名为Array
。
一旦达到全局作用域,并且找到了本机,引擎就访问它的proottype,然后访问它的方法
..。
O(N)作用域解析+2个属性访问(.prototype
和.forEach
)。
(
、[
或`
开头的编码约定这绝对是一件好事,(sarcastically).
[].slice
在几乎所有方面都更好。尽管现在,这只会归结为下面的clicking the share link
免责声明
请注意,实际上,两者都不会比另一个运行得更快。这不是应用程序的瓶颈。
你可能想读一读A crash course in just-in-time (JIT) compilers
https://stackoverflow.com/questions/9006553
复制相似问题