使用点符号向数组添加属性是否会将其更改为对象?
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
说它是一个数组,因为它就是被实例化的。如果浏览器没有 native isArray
,则 underscore.js 使用第二个选项:比较toString
对象以查看它是否与 string 匹配[object Array]
。
仅仅添加一个属性并不足以改变对象的类型(根据 JavaScript 虚拟机,它仍然是一个对象,它恰好是一个数组)。JavaScript 是一种动态语言,这意味着您可以向内置对象添加属性,但这样做不会改变它们的本质;你只是扩展了它们。例如,Prototype.js 过去通过向它们添加额外的属性(如迭代器、过滤器、映射函数等)来扩展原生对象。
你可以很容易地看到 Chrome 中的行为:
> 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
和正确值。test
something