拼接功能如何在这里工作?

时间:2014-07-24 10:01:39

标签: javascript splice

请帮助我理解这个例子。

function fun(a){
    this.length = 1;
    this.splice = [].splice;
    this[0] = a;
    return this;
};

现在,当我执行此函数时,结果是一个数组。

f = new fun('hi');// result will be : ["hi"]

为什么?

如果我删除this.length=1this.splice = [].splice,则结果会有所不同。

f = new fun('hi'); // result will be : fun {0: "a", splice: function}

为什么?

我也看到了jQuery中使用的这种技术。请以编程方式向我描述这是如何工作的。

3 个答案:

答案 0 :(得分:2)

您构建的不是数组。我相信你的对象可能有一些功能,让控制台识别给定的对象是否是一个数组。

var arr = [];
var f = new fun('asd');

typeof arr; // "object"
typeof f; // "object"

arr instanceof Array; // "true"
f instanceof Array; // "false"

答案 1 :(得分:2)

没有任何关于它的程序设计。这就是浏览器/ js引擎选择在控制台中显示某个变量的方式。

控制台通常适用于开发人员,因为他们是打开这些东西的人。所以浏览器会稍微嗅一下,向开发者展示他/她正在处理的这个对象是什么。如果它看起来像一个数组,它可能应该像数组一样打印。

如下面的列表所示,浏览器之间存在一些差异。即,IE和节点什么都不做。我的解释是节点中的打印应该产生完整的视图,而不仅仅是嗅探视图。 length似乎满足Opera 12将其显示为数组。

为什么浏览器使用indexlengthsplice是完全不同的故事。它可能是表示具有高概率的数组的最小属性集。看看它,如果不是数组,它还会是什么?

Chrome 36,Firefox 30和Opera 18的行为方式相同:

  • fun as-is是["hi"]
  • 没有fun
  • length fun { 0: 'hi', splice: function}
  • 没有fun
  • splice fun { 0: 'hi', length: 1}

Opera 12显示:

  • fun as-is是Object ["hi"]
  • 没有fun
  • lengthObject
  • 没有fun
  • spliceObject ["hi"]

IE 9和节点v0.8根本没有嗅探(这里IE输出,节点输出非常相似):

  • fun as-is是{0 : "hi", length : 1, splice : function splice() { [native code] }}
  • 没有fun
  • length{0 : "hi", splice : function splice() { [native code] }}
  • 没有fun
  • splice{0 : "hi", length : 1}

答案 2 :(得分:0)

我不确定,你怎么才能得到那个"嗨"结果,因为当我在Fiddle中尝试下面的代码时,我得到了Object { 0: "hi", length: 1, splice: splice() }。这是有道理的,因为它的作用是创建一个具有3个属性(长度,拼接和索引[0])的对象。

function fun(a){
this.length = 1; 
this.splice = [].splice;
this[0] = 'hi';
    return this;
}
f = new fun('hi');
console.log(f); //get the object f
console.log(f[0]); //get the string inside index-0
console.log(f.length); //get the length value which is already assigned before
console.log(f.splice); //it returns a function, which I believe a splice function