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

Javascript 拼接功能在这里是如何工作的?,javascript,splice,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=1或this.splice=[].splice,结果将不同 f = new fun('hi'

请帮助我理解这个例子

function fun(a){
    this.length = 1;
    this.splice = [].splice;
    this[0] = a;
    return this;
};
现在,当我执行这个函数时,结果是一个数组

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

如果删除
this.length=1
this.splice=[].splice
,结果将不同

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


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

我不确定,您如何才能得到唯一的“hi”结果,因为当我在a中尝试下面的代码时,我得到了
对象{0:“hi”,长度:1,splice:splice()}
。这是有意义的,因为它所做的是创建一个具有3个属性(长度、拼接和索引[0])的对象


我不确定,如何才能得到唯一的“hi”结果,因为当我在a中尝试下面的代码时,我得到了
对象{0:“hi”,长度:1,splice:splice()}
。这是有意义的,因为它所做的是创建一个具有3个属性(长度、拼接和索引[0])的对象


构造的不是数组。我相信您的对象可能有一些特性,可以让控制台识别给定对象是否为数组

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

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

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

构造的不是数组。我相信您的对象可能有一些特性,可以让控制台识别给定对象是否为数组

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

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

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

这没有什么程序性的。这只是浏览器/js引擎选择在控制台中向您显示某些变量的方式

控制台通常是供开发人员使用的,因为他们是打开这些东西的人。因此,浏览器会进行一些嗅探,向开发人员显示他/她正在处理的对象是什么。如果它看起来像一个数组,它可能应该像一个数组一样打印

f = new fun('hi');// result will be : ["hi"]
如下面的列表所示,浏览器之间存在一些差异。也就是说,IE和node什么都不做。我的解释是,在节点中打印应该产生完整的视图,而不仅仅是嗅探视图。
length
似乎满足了Opera 12将其显示为数组的要求

f = new fun('hi');// result will be : ["hi"]
浏览器为什么使用
索引
长度
拼接
则完全不同。它可能是表示高概率数组的最小属性集。看看它,如果不是数组,它还会是什么

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

  • fun
    原样
    [“嗨”]
  • fun
    length
    fun{0:'hi',splice:function}
  • fun
    没有
    拼接
    fun{0:'hi',长度:1}
歌剧12集:

  • fun
    原样
    Object[“hi”]
  • fun
    没有
    长度
    对象
  • fun
    拼接
    对象[“hi”]
IE 9和节点v0.8根本没有嗅探(此处IE输出,节点输出非常相似):

  • fun
    原样
    {0:“hi”,长度:1,拼接:函数拼接(){[native code]}}
  • fun
    length
    {0:“hi”,splice:function splice(){[native code]}
  • fun
    拼接
    {0:“嗨”,长度:1}

    • 它没有任何程序性。这只是浏览器/js引擎选择在控制台中向您显示某些变量的方式

      控制台通常是供开发人员使用的,因为他们是打开这些东西的人。因此,浏览器会进行一些嗅探,向开发人员显示他/她正在处理的对象是什么。如果它看起来像一个数组,它可能应该像一个数组一样打印

      f = new fun('hi');// result will be : ["hi"]
      
      如下面的列表所示,浏览器之间存在一些差异。也就是说,IE和node什么都不做。我的解释是,在节点中打印应该产生完整的视图,而不仅仅是嗅探视图。
      length
      似乎满足了Opera 12将其显示为数组的要求

      f = new fun('hi');// result will be : ["hi"]
      
      浏览器为什么使用
      索引
      长度
      拼接
      则完全不同。它可能是表示高概率数组的最小属性集。看看它,如果不是数组,它还会是什么

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

      • fun
        原样
        [“嗨”]
      • fun
        length
        fun{0:'hi',splice:function}
      • fun
        没有
        拼接
        fun{0:'hi',长度:1}
      歌剧12集:

      • fun
        原样
        Object[“hi”]
      • fun
        没有
        长度
        对象
      • fun
        拼接
        对象[“hi”]
      IE 9和节点v0.8根本没有嗅探(此处IE输出,节点输出非常相似):

      • fun
        原样
        {0:“hi”,长度:1,拼接:函数拼接(){[native code]}}
      • fun
        length
        {0:“hi”,splice:function splice(){[native code]}
      • fun
        拼接
        {0:“嗨”,长度:1}

      splice
      在这里甚至没有被使用,除了
      this.splice
      指的是
      Array.prototype.splice
      (但是以一种创建空数组的方式)。这里甚至没有使用
      splice
      ,除了
      this.splice
      指的是
      Array.prototype.splice
      (但以创建空数组的方式)我认为您的测试有问题。在我的例子中,控制台输出
      [“hi”,splice:function]
      这是一个数组。如果我删除
      splice
      length
      部分,它将输出
      fun{0:“hi”,…}
      这是一个对象。我想这就是重点。请查看我的小提琴a