通过使用点添加值将数组更改为Object(大写)

125*_*748 7 javascript underscore.js

使用点表示法向数组添加属性是否将其更改为对象?

var arr = [];

arr.something = "test";
Run Code Online (Sandbox Code Playgroud)

它是一个数组吗?

我不这么认为,但是下划线.js说是的

console.log( _.isArray(arr) );  //true
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/wZcyG/

Viv*_*ath 7

如果查看underscore.js 源代码,您会看到该isArray函数定义为:

 _.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) == '[object Array]';
  };
Run Code Online (Sandbox Code Playgroud)

浏览者的本地人Array.isArray说它是一个数组,因为它是被实例化的.如果浏览器没有本机isArray,则underscore.js使用第二个选项:比较toString对象以查看它是否与字符串匹配[object Array].

简单地添加属性不足以改变对象的类型(根据JavaScript虚拟机,它仍然是恰好是数组的对象).JavaScript是一种动态语言,这意味着您可以向内置对象添加属性,但这样做并不会改变它们的内容; 你只是扩展了他们.例如,Prototype.js用于通过向它们添加额外属性来扩展本机对象(如迭代器,过滤器,映射函数等).

您可以非常轻松地在Chrome中查看行为:

> var arr = [];
  arr.something = "test";

> Array.isArray(arr);
  true

> toString.call(arr);
  "[object Array]"
Run Code Online (Sandbox Code Playgroud)

编辑

该数组不会丢失其length属性:

> var arr = [1, 2, 3];
  arr.something = "test";
  console.log(arr.length, arr.something);

  3 "test"
Run Code Online (Sandbox Code Playgroud)

请注意,浏览器报告了属性的正确长度3和正确值.testsomething