Javascript 关于属性在对象中的存储位置的几个问题

Javascript 关于属性在对象中的存储位置的几个问题,javascript,Javascript,为什么backbone.js的..isArray(arr)函数仍然返回true,即使我做了如下操作 var a = []; a.something = "test"; 因为我有点希望它变成一个[object object](不确定这是否是引用对象的正确方法,当您执行var o={}时,会得到该对象,但我要说的是可以使用key:value对的对象类型。任何关于如何引用该对象的见解都是非常受欢迎的 我得到的答案是,它并没有改变a的数据类型,只是向其中添加了属性something。我可以在控

为什么backbone.js的
..isArray(arr)
函数仍然返回true,即使我做了如下操作

var a = [];
    a.something = "test";
因为我有点希望它变成一个
[object object]
(不确定这是否是引用对象的正确方法,当您执行
var o={}
时,会得到该对象,但我要说的是可以使用key:value对的对象类型。任何关于如何引用该对象的见解都是非常受欢迎的

我得到的答案是,它并没有改变
a
的数据类型,只是向其中添加了属性
something
。我可以在控制台中看到,我得到了a.something=“test”,但它存储在哪里?它是否在数组的原型中?(我很确定不是)。但简单的“添加属性”是什么意思

不会以类似方式返回属性,因为字符串不是对象,但函数应该是对象

var a = function(){};

    a.asdf = "test";
    a.zxcv = "test1";

    console.log(a);
只返回

function (){

} 
(它看起来有点像字符串…)我不知道为什么我不能执行
var a=new Function()
(尽管我以前从未见过);它返回的结果与上面一样。jslint还说它是eval。为什么


我只是想弄清楚“向对象添加属性”是什么意思,以及这些属性的“去向”在JavaScript中,有几种基本类型,包括
未定义的
数字
、和
字符串
。也有
对象
。所有对象都有属性

每个小写o对象都是从构造函数创建的。在对象文字表示法的情况下,构造函数是一个隐式的
对象
。数组也是对象,但不是用
对象
构造函数创建的,而是用
数组
构造函数创建的。函数也是对象,具有<代码>函数构造函数

阵列 当您看到一个数组时,您可能会认为它有编号的元素;0、1、2等等。实际上,数组只是另一个对象,不同的是它使用的不是字母属性名,而是数字属性名,并且您不使用
访问元素

实际上,浏览器对数组进行了一些优化,以使它们比使用其他类型的对象更快,但这种优化仍将保留此处描述的语义

拳击 字符串的奇怪行为是因为字符串不是对象,但是有一些奇怪的装箱行为使得
someString.property=value
不是错误。只有对象本身可以有属性和方法;但是我们都知道
someNumber.toString()
不是错误。这是怎么回事

事实证明,在某些情况下,当您尝试将原语当作对象来使用时,它会将该原语包装成对象,它将创建一个具有
编号
构造函数的对象,与原语编号不同。然后它以正常方式查找
到字符串
,并将
设置为对象来执行它

当您在字符串上设置属性时,出于该操作的目的,它被隐式转换为
string
-constructor对象。它在
string
对象上设置了属性,只是装箱是临时的;装箱不会保留在保存原始字符串的变量中

函数对象 的确,我们很少使用
新函数
,但如果你真的使用了它,它会像它听起来那样做:它创建了一个新函数。你可以传递一个字符串给它,这就是函数的主体。如果你创建了一个带有字符串主体的新函数,然后调用它,那就离
评估
代码不远了。这就是为什么JSLint将其标记为
eval

当您将一个对象记录到控制台时,开发人员工具通常会向您显示属性,因为属性通常是对象最重要的部分。函数通常没有指定自定义属性,因此开发人员工具只使用普通字符串表示,它通常只显示函数参数和主体。字符串表示在不显示属性的情况下,函数的初始化并不罕见-
toString
普通
对象的
将只返回
[Object Object]

原型链 当然,这些信息澄清了许多事情,但仍然无法解释这一点:

console.log(new Array() instanceof Object);  // => true
什么?数组的构造函数是
数组
,而不是
对象
!这是因为称为原型链的东西。它是控制继承的东西

每个对象都有一个名为
[[Prototype]]
的内部属性。虽然许多浏览器都有一个非标准的
\uuuuuu proto\uuuuu
属性来访问它,但没有标准的访问方法。当您使用
新建
创建对象时,
[[Prototype]]
设置为用于创建对象的函数的
prototype
属性

假设我们有一个对象
foo
,它的构造函数是
foo
。当我们访问属性
foo.bar
时,它首先在
foo
自己的属性中查找
bar
。如果在那里找不到或未定义,它将在
foo
[[Prototype]]中查找
bar
自己的属性。如果在那里找不到,它将在
foo
[[Prototype]]]
[[Prototype]]
中查找
,直到找到一个
null
[[Prototype]]
。这是允许继承的功能

为了确定对象是否是实例,
isinstance
通过原型链查看是否有任何
[[prototype]]
s与函数的
原型匹配。它
console.log(new Array() instanceof Object);  // => true
var x =['a','Stack','flow',0];
--added value x.a = 'something';
it really looks like this now
var x = {
    0:'a',
    1:'Stack',
    2:'flow',
    3:'0',
    a:'something'
    }
x.hasOwnProperty('a'); //true

Object.keys(x); //listing all keys in object(array x)
// ["0", "1", "2", "3", "a"] !!!keys function returns an array consisting of all keys in an object.