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}
原样fun
Object[“hi”]
没有fun
是长度
对象
无fun
是拼接
对象[“hi”]
原样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}
原样fun
Object[“hi”]
没有fun
是长度
对象
无fun
是拼接
对象[“hi”]
原样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