我有一个空对象myscroll
,定义为var myscroll = {}
。现在我想为它添加一个数组属性。我这样做了:
var myscroll = {}
myscroll.point[0] = getScrollpos("home");
myscroll.point[1] = getScrollpos("artists");
myscroll.point[2] = getScrollpos("songs");
myscroll.point[3] = getScrollpos("beats");
myscroll.point[4] = getScrollpos("contact");
我收到错误myscroll.point
未定义。然后我首先将其定义为myscroll.point = [];
,然后代码工作。
那么,为什么我们不能直接设置数组值并将该属性添加到javascript中的对象?为什么我们必须首先独立定义它?
答案 0 :(得分:4)
当您处理对象属性时,默认情况下您可以访问任何对象属性,如果之前未设置该属性,则该属性的值为undefined。因此,通过使用索引(myscroll.point[0]
)访问未定义的属性,您尝试访问未定义的属性0
,这是javascript中的原始值,没有属性,所以你得到TypeError。
结果,您可以将原始值设置为未定义的对象属性,但不能使用未定义的prop作为对象进行拨号。
还想指出你并解释一下与下面代码中的第一种情况有点类似的情况:
var obj = []
obj[0] = 10
notDefinedObj[0] = 10 // cause ReferenceError
数组是对象。在JS中,您无法在不初始化对象之前修改/添加/删除对象属性。
这是因为对象存储在内存中,您可以通过引用访问它们。当您尝试向其添加新属性时,例如将新元素添加到列表中,您尝试将属性附加到没有引用的变量,这就是您获得ReferenceError的原因。
祝你好运!
答案 1 :(得分:3)
使用myscroll.point
,您尝试访问point
对象上的myscroll
媒体资源。但是在这个对象上没有这样的属性。这就是为什么您收到undefined is not an object
错误消息(或类似内容 - 取决于您的浏览器)的原因。
如果您来自PHP,这可能很奇怪,但实际上它比以下php代码段中涉及的魔法要明确得多,例如:
$myscroll = [];
$myscroll['point'][0] = getScrollpos("home");
// ...
PHP 自动为不存在的密钥创建子数组。
之后更新 myscroll.mypoint = 5;
和myscroll.point[0] = getScrollpos("home");
之间存在显着差异。
在第一种情况下,您明确将point
myscroll
属性设置为5
。但在第二种情况下,您尝试访问不存在的属性[]
上的point
运算符(这是一个数组运算符)。从理论上讲,Javascript可以像PHP一样神奇,并且可以动态创建数组自动,但它并没有。这就是你收到错误的原因。
与尝试myproperty
myscroll.mypoint
上的虚拟财产myscroll.mypoint.myproperty
相同,就像myproperty
一样。这也不会有效,因为您尝试访问mypoint
undefined
myscroll
www.url.com/folder
上的www.url.com/folder/1
。
答案 2 :(得分:0)
您正在尝试访问point
myscroll
<{1>}属性未定义(因为myscroll = {}
)。
如果您使用myscroll.point
查看控制台,则会返回undefined
。在这里,您尝试在undefined
中放置一些内容,以便 TypeError: myscroll.point is undefined
。
如果你这样定义myscroll
:
var myscroll = {
point : []
}
然后您的代码将起作用,您不需要定义myscroll.point = []
。
答案 3 :(得分:0)
因为myscroll.point[0] = getScrollpos("home");
可以理解为Get the first element of the point array inside of myscroll and set it to..
。您无法访问不存在的数组的第一个元素。
答案 4 :(得分:0)
只需检查typeof
数组变量的myscroll
,然后查看typeof
的{{1}}。您已尝试在数组外部分配数组的属性。它是空的或myscroll.point
。
答案 5 :(得分:0)
如果您有一个空对象并且想要设置一个包含数组的新属性,则应该这样做。
var obj = {};
obj['propertyName'] = [];
这将放置一个具有相应propertyName
的属性,该属性包含一个稍后可以填充的数组。
如果您的getScrolloops()
返回数组,则可以执行此操作
obj['propertyName'] = getScrolloops();
在你的情况下,你可以这样做:
obj['propertyName'] = [getScrollpos("home"),
getScrollpos("atrist"),
getScrollpos("songs"),
getScrollpos("beats"),
getScrollpos("contact")
];
编辑:说明:为什么您的代码无效? 正如here所述:
您可以通过为其指定值来定义属性。
您要做的是尝试通过为该属性的索引赋值来定义属性。这不起作用,因为您没有为自己的属性赋值,而是为不存在的属性索引。
另外我需要提一下,你可以使用两个属性访问器来实现这一点。 This可能是一个有用的链接。