7

使用点符号向数组添加属性是否会将其更改为对象?

var arr = [];

arr.something = "test";

它是一个数组吗?

我不这么认为,但 underscore.js 说是

console.log( _.isArray(arr) );  //true

http://jsfiddle.net/wZcyG/

4

1 回答 1

7

如果您查看 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和正确值。testsomething

于 2013-07-24T22:02:46.010 回答