为什么我们不能直接在javascript中设置数组值?

时间:2016-05-18 07:34:18

标签: javascript arrays object

我有一个空对象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中的对象?为什么我们必须首先独立定义它?

6 个答案:

答案 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 自动为不存在的密钥创建子数组。

comment

之后更新

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可能是一个有用的链接。