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