请帮助我理解这个例子。
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中使用的这种技术。请以编程方式向我描述这是如何工作的。
答案 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将其显示为数组。
为什么浏览器使用index
,length
和splice
是完全不同的故事。它可能是表示具有高概率的数组的最小属性集。看看它,如果不是数组,它还会是什么?
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
的length
是Object
fun
的splice
是Object ["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