javascript - 通过使用点添加值将数组更改为对象(大写)

标签 javascript underscore.js

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

var arr = [];

arr.something = "test";

是数组吗?

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

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

http://jsfiddle.net/wZcyG/

最佳答案

如果您查看 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/

相关文章:

Javascript 没有立即更新 DOM

javascript - 在函数原型(prototype)中使用 _.extend

javascript - 如何使用 "any"搜索 Backbone 集合?

backbone.js - _.: a confuse with context之后

javascript - node.js 而不是重定向显示警报消息

javascript 查询字符串 > window.location.search.substring > 使用 # 代替 ?开始查询字符串

javascript - 如何返回字符串的最后两个字符以外的所有字符?

javascript - 语义 UI 事件

angularjs - Underscorejs _.where 带通配符

javascript - 使用 Underscore,如何递归地展平对象数组?