Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t访问Javascript变量:未定义_Javascript_Arrays_Undefined - Fatal编程技术网

Can';t访问Javascript变量:未定义

Can';t访问Javascript变量:未定义,javascript,arrays,undefined,Javascript,Arrays,Undefined,我试图创建两个正弦波,并将它们相加,以创建第三个正弦波。我可以很好地添加它们并将结果输出到控制台,但每当我尝试将此值放入数组时,就会出现错误: “无法读取未定义的属性“1” 谁能解释一下我哪里出错了?请点击此处: d1=[]; d2=[]; d3=[]; //对正弦函数进行采样 对于(i=0;i

我试图创建两个正弦波,并将它们相加,以创建第三个正弦波。我可以很好地添加它们并将结果输出到控制台,但每当我尝试将此值放入数组时,就会出现错误:

“无法读取未定义的属性“1”

谁能解释一下我哪里出错了?请点击此处:

d1=[];
d2=[];
d3=[];
//对正弦函数进行采样
对于(i=0;i<2*Math.PI;i+=0.02){
d1.推压([i,15+数学sin(5*i)]);
d2.推挤([i,10+数学sin(4*i)]);
console.log(d1[i][1]+d2[i][1]);
d=d1[i][1]+d2[i][1];
控制台日志(d);
d3.推力([i,d]);
}

要访问
dX
中的最后一个元素,请使用
dX[dX.length-1]


你的
i
在这里浮动(0.02)。该值不是整数,而是转换为字符串。然后将数组对象解释为常规对象(类似于贴图)。对象中没有键
“0.02”
,因此
dX[“0.02”]
的计算结果为
未定义。无法访问未定义的
,因此会出错。

当循环增量为
0.02时,您尝试使用双精度访问数组中的元素。当您按下时,数组的键被设置为整数,因此此方法将不起作用

我已经重构了您的代码,改为使用对象:

d1={};
d2={};
d3={};
//对正弦函数进行采样
对于(i=0;i<2*Math.PI;i+=0.02){
d1[i]=[i,15+数学sin(5*i)];
d2[i]=[i,10+数学sin(4*i)];
console.log(d1[i][1]+d2[i][1]);
d=d1[i][1]+d2[i][1];
控制台日志(d);
d3[i]=[i,d];
}

此代码有很多问题

首先,在这样的循环中添加浮点将增加浮点格式中的二进制错误,直到它们在输出中变得明显。尝试运行以下代码:

var a = [];
for (var i = 0; i < 2 * Math.PI; i += 0.02)
    a.push(i);

$('#output').html(a.join('<br/>'));
在索引1(不是5)处添加一个值,该值本身就是一个2项数组,
[5,10]
。那么你在哪里做这件事:

d1.push([i, 1]);
var d = d1[i][1];
例如,您在索引0处添加了一个值,然后试图在索引0.02处将其恢复。由于您的目标是通过索引直接访问它们,因此使用push并假定索引与循环计数器中的内容匹配(例如,如果数组已经添加了值,该怎么办)并不安全。而是直接按索引分配,这在Javascript中是允许的

最后,您应该避免像这样将所有内容转储到全局范围中—使用var关键字将它们定义为局部范围

var d1 = [];
var d2 = [];
var d3 = [];

var inverseStep = 50; // 1 / .02
var l = 2 * Math.PI * inverseStep;

for (var i = 0; i < l; i++) {
    var ix = i / inverseStep;

    d1[i] = [ix, 15+Math.sin(5*ix)];
    d2[i] = [ix, 10+Math.sin(4*ix)];
    var d = d1[i][1] + d2[i][1];
    d3[i] = [ix, d];
}

$('#output').html(d3.join('<br/>'));
var d1=[];
var d2=[];
风险值d3=[];
var inverseStep=50;//1 / .02
var l=2*Math.PI*inverseStep;
对于(变量i=0;i');

听起来像是
d1[i]
d2[i]
不存在。如果
d1[i]
未定义,则在push()时不能执行
undefined[1]
,元素将具有整数索引,如
2
。但是,i变量不是int,它类似于
0.04
始终将相关代码放入答案本身,而不仅仅是链接。(即使是使用JSFIDLE)原因:反正我当时在那里修复了一个打字错误,所以我只是把它复制了过来。“值不是整数,而是转换成字符串。”数组索引总是字符串。(在经典的JavaScript数组中,不是新的数组。)(别误会,我想我是你的第一次投票,因为这是第一个正确指出问题的答案。我只是说…)数组索引从来都不是字符串。索引器语法a[value]访问数组索引或对象属性。如果使用像[0]这样的数字,则该数字将按原样使用(而不是转换为字符串),并访问索引0处的数组值(如果有)。如果使用类似['Name']的字符串,则会访问名为'Name'的对象属性(如果有)。这与访问.Name相同。
a.push([5, 10]);
d1.push([i, 1]);
var d = d1[i][1];
var d1 = [];
var d2 = [];
var d3 = [];

var inverseStep = 50; // 1 / .02
var l = 2 * Math.PI * inverseStep;

for (var i = 0; i < l; i++) {
    var ix = i / inverseStep;

    d1[i] = [ix, 15+Math.sin(5*ix)];
    d2[i] = [ix, 10+Math.sin(4*ix)];
    var d = d1[i][1] + d2[i][1];
    d3[i] = [ix, d];
}

$('#output').html(d3.join('<br/>'));