JavaScript中push和普通数组赋值的区别

4
I'm using flot API 来绘制图表。看一下这种图表类型HERE
在那个例子中,他们使用了像这样的值,
var sin = [], cos = [];
  for (var i = 0; i < 14; i += 0.5) {
        sin.push([i, Math.sin(i)]);
        cos.push([i, Math.cos(i)]);
  }

现在图表绘制的是“曲线”,当我替换了原始数据后,它变成了“折线”。
sin.push([i, Math.sin(i)]);
cos.push([i, Math.cos(i)]);

与之一起,

sin[i]=[i, Math.sin(i)];
cos[i]=[i, Math.cos(i)];

然后使用直线绘制图表。我现在有两个问题。

1)这两种类型的数组赋值有什么区别?
2)这是因为数组分配不同还是API行为不同?

非常感谢任何帮助!谢谢。

编辑:将i设置为递增1,并使用push方法或默认赋值设置不同的值,您将获得相同的结果。

4个回答

4
The i不是整数。在数组下标中,只能使用int。 1)这两种数组分配方式有什么区别? A)除了push将下一个int放置到索引位置外,没有任何区别。 2)这是由于数组分配方式的差异还是API行为的差异? A)是的,使用您的方法,数组无效,因为键的1.5值被解析为字符串,而API无法按预期读取数组。 尝试使用API的方式或使用不同的值进行for语句。

现在我将数组分配的增量增加了1,现在它可以正常工作了。一个愚蠢的错误让我花了几个小时来解决。 - vkGunasekaran

3

我认为i增量存在问题。显然,每次迭代时i增加了0.5,而不是1。看:

for (var i = 0; i < 14; i += 0.5) 

因此,sin[i]=... 无法正常工作。但是,sin.push(...) 将会生效。


谢谢,但我犯了一个错误。我设置了i每次增加1,并给了不同的值。现在我尝试使用这两种赋值类型,但仍然得到相同的结果。 - vkGunasekaran

2

数组索引不能是小数,且总是字符串类型的。因此,数字1.5会被转换为字符串'1.5',序列将变成'0'、'0.5'、'1'、'1.5'等。但是使用push函数时,所有的索引都将是整数字符串,因此将是0、1、2等。

毫无疑问,一个基于整数的循环正在用来从数组中读取值,所以它跳过了.5的元素(即每隔一个元素),并导致了不平滑的边缘。


我认为你指出了确切的问题,我使用alert检查sin数组的值,在每个元素后面都收到了一个“undefined”警报,这会使曲线变形吗? - vkGunasekaran
Lachezar Todorov 也指出了同样的事情,所以我们会按照 API 的方式进行。感谢大家。 - vkGunasekaran

1

通常情况下这样做是可行的,但在这种情况下,您将i增加了0.5,这导致i成为一个float值。

查看两个变量的输出:

// push
// cos
[[0, 1], 
 [0.5, 0.8775825618903728], 
 [1, 0.5403023058681398], 
 [1.5, 0.0707372016677029], 
 [2, -0.4161468365471424], 
 [2.5, -0.8011436155469337], ...]

// sin
[[0, 0], 
 [0.5, 0.479425538604203], 
 [1, 0.8414709848078965], 
 [1.5, 0.9974949866040544], 
 [2, 0.9092974268256817], 
 [2.5, 0.5984721441039564], ...]

// array-index
// cos
[[0, 1], 
 [1, 0.5403023058681398], 
 [2, -0.4161468365471424], 
 [3, -0.9899924966004454], 
 [4, -0.6536436208636119], ...]

// sin
[[0, 0], 
 [1, 0.8414709848078965], 
 [2, 0.9092974268256817], 
 [3, 0.1411200080598672], 
 [4, -0.7568024953079282], ...]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接