使用点号添加属性会将数组转换为对象吗?
var arr = [];
arr.something = "test";
这是一个数组吗?
我不这么认为,但underscore.js却说它是。
console.log( _.isArray(arr) ); //true
var arr = [];
arr.something = "test";
这是一个数组吗?
我不这么认为,但underscore.js却说它是。
console.log( _.isArray(arr) ); //true
如果你查看underscore.js 源代码,你会发现isArray
函数被定义为:
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
Array.isArray
方法之所以说它是一个数组,是因为它的实例化对象就是数组。如果浏览器没有原生的isArray
方法,underscore.js则使用第二个选项:比较对象上的toString
方法返回的字符串是否为[object Array]
。> var arr = [];
arr.something = "test";
> Array.isArray(arr);
true
> toString.call(arr);
"[object Array]"
编辑
该数组不会丢失其length
属性:
> var arr = [1, 2, 3];
arr.something = "test";
console.log(arr.length, arr.something);
3 "test"
3
的长度以及 something
属性的 test
正确值。length
方法?那么它在某个基本层面上被改变了,对吗? - 1252748length
属性。看看我的编辑。 - Vivin Paliath
arr
的类型就被设置了。在下一次赋值之前,虚拟机就没有机会知道类型已经改变了。 - Jason SperskeArray
是一个Object
。问题在哪里? - idbehold