使用点符号向数组添加属性是否会将其更改为对象?
var arr = [];
arr.something = "test";
是数组吗?
我不这么认为,但 underscore.js 说是
console.log( _.isArray(arr) ); //true
最佳答案
如果您查看 underscore.js source ,您会看到 isArray
函数定义为:
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
浏览器的 native Array.isArray
说它是一个数组,因为它已被实例化为数组。如果浏览器没有原生的 isArray
,则 underscore.js 使用第二个选项:比较对象上的 toString
以查看它是否与字符串 [对象数组]
.
仅仅添加一个属性不足以改变对象的类型(按照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
长度和 something
属性的正确的 test
值。
关于javascript - 通过使用点添加值将数组更改为对象(大写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845488/