Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
第一个Javascript程序。我做错了什么?_Javascript - Fatal编程技术网

第一个Javascript程序。我做错了什么?

第一个Javascript程序。我做错了什么?,javascript,Javascript,我终于开始用Javascript创建我的第一个小练习程序。我知道这不是很优雅。我已经让这段代码的大部分正常工作了,但是当我运行它几次时,仍然会得到一个“未定义”的字符串。我不知道为什么。有没有人能向我解释一下这个未定义的东西是从哪里来的 var work = new Array(); work[1] = "product design"; work[2] = "product system design"; work[3] = "product social media post x5"; wo

我终于开始用Javascript创建我的第一个小练习程序。我知道这不是很优雅。我已经让这段代码的大部分正常工作了,但是当我运行它几次时,仍然会得到一个“未定义”的字符串。我不知道为什么。有没有人能向我解释一下这个未定义的东西是从哪里来的

var work = new Array();
work[1] = "product design";
work[2] = "product system design";
work[3] = "product social media post x5";
work[4] = "product Agent Recruitment system design";
work[5] = "product profile system design";
work[6] = "product Agent testing design";
work[7] = "product customer support";
work[8] = "product promotion";
var course = new Array();
course[1] = "javascript";
course[2] = "mandarin";
course[3] = "javascript practical-Code Academy";
course[4] = "javascript practical-learn Street";
course[5] = "mandarin practical-memrise";
course[6] = "new stuff with audiobooks";
var activity = new Array();
activity[1] = "listen to podcasts";
activity[2] = "chat online";
activity[3] = "Exercise";
activity[4] = "take a walk";
activity[5] = "call a friend";
var picker1 = Math.floor(Math.random()*3+1);
var picker2 = Math.floor(Math.random()*work.length+1);
var picker3 = Math.floor(Math.random()*course.length+1);
var picker4 = Math.floor(Math.random()*activity.length+1);
var group_pick = function(){
  if(picker1 === 1){
    return "Time to work on ";
  } else if(picker1 === 2){
    return "Time to learn some ";
  } else if (picker1 === 3){
    return "Lets relax and ";
  } else {
    return "error in group_pick";
  }
};
var item_pick = function() {
  if (picker1 === 1) {
    return work[picker2] ;
  } else if (picker1 === 2) {
    return course [picker3] ;
  } else if (picker1 === 3) {
    return activity[picker4] ;
  } else {
    return "error in item_pick";
  }
};
var task = group_pick() + item_pick();
document.write(task);

问题是数组的
.length
属性从零开始计算数组中的元素数。例如,
activity
包含元素1到5,因此根据Javascript,
.length
实际上是6。然后,您的随机数计算将选择一个从1到7的数字,超过数组的末尾。这就是未定义的
的来源


您可以通过将索引编号从1改为0来解决此问题,因此
活动
将包含从0到4的元素,其
长度
为5。同时从您的选择计算中删除
+1

数组的开始索引为零。当您为
1
索引指定一个值时,您将创建一个
0
索引,没有任何值(
未定义

长度是2,检查一下。你以为你有一个项目在该数组中,但长度是2

通常,不自己管理数组索引更容易。由于许多原因,数组文字语法通常是首选的

var arr = [];
arr.push('hi!');
console.log(arr); // ["hi!"]
console.log(arr.length) // 1
或者直接创建包含项目的数组,非常方便

var arr = [
  "hi",
  "there!"
];
console.log(arr); // ["hi", "there"]
console.log(arr.length) // 2

正确制作阵列后,您可以通过以下简单操作获得随机项:

var arr = ['a','b','c'];
var index = Math.floor(Math.random() * arr.length);
console.log(arr[index]); // "a", "b" or possibly "c"
这是因为
var指数
将由
0.0
1.0
3
(数组长度)之间的随机值计算得出。它可以为您提供
0
1
2

所以这里的
arr
3个
项,一个在
0
,一个在
1
,一个在
2

学习从零开始寻址数组在心理上可能很棘手。你有点习惯了。最终


下面是使用以下提示的工作示例:

我更改了数组的声明方式,并从
var pickerX
计算中删除了不需要的
+1

当您使用“选择器”时,您不希望将
+1
放在'Math.floor函数中

考虑以下阵列:

var array = [ "one", "two", "three" ];

array.length; // 3
长度是3——有道理,里面有3个项目。
但是数组是零基的

array[0]; // "one"
array[1]; // "two"
array[2]; // "three"
array[3]; // undefined
因此,当您添加
+1
时,您是:
a) 使得无法拾取阵列中的第一个对象
b) 使选择一个比数组中最后一个元素高出1的数字成为可能(
未定义)

我看到这里的问题是,当生成随机变量时,您正在执行PickerX+1

所以正确的方法是不使用+1的PickerX。 另外,如果您不应该使用if命令,请尝试使用switch case

这是固定密码-

var work = new Array()
        work[0] = "product design";
        work[1] = "product system design";
        work[2] = "product social media post x5";
        work[3] = "product Agent Recruitment system design";
        work[4] = "product profile system design";
        work[5] = "product Agent testing design";
        work[6] = "product customer support";
        work[7] = "product promotion";

var course = new Array();
    course[0] = "javascript";
    course[1] = "mandarin";
    course[2] = "javascript practical-Code Academy";
    course[3] = "javascript practical-learn Street";
    course[4] = "mandarin practical-memrise";
    course[5] = "new stuff with audiobooks";

var activity = new Array();
    activity[0] = "listen to podcasts";
    activity[1] = "chat online";
    activity[2] = "Exercise";
    activity[3] = "take a walk";
    activity[4] = "call a friend";



    var picker1 = Math.floor(Math.random() * 3 +1 );
    var picker2 = Math.floor(Math.random() * work.length );
    var picker3 = Math.floor(Math.random() * course.length );
    var picker4 = Math.floor(Math.random() * activity.length );




var group_pick = function(){
    switch(picker1){
        case 1:
            return "Time to work on ";
        case 2:
            return "Time to learn some ";
        case 3:
            return "Lets relax and ";
        default:
            return "error in group_pick";        
    }
};




var item_pick = function() {
    switch(picker1){
        case 1:
            return work[picker2] ;
        case 2:
            return course [picker3] ;
        case 3:
            return activity[picker4] ;
        default:
            return "error in item_pick";    
    }
};


var task = group_pick() + item_pick();
document.write( task );​

别那么努力工作。零是你的朋友。我们去打高尔夫球吧

var work = [
    "product design", "product system design",
    "product social media post x5",
    "product Agent Recruitment system design",
    "product profile system design",
    "product Agent testing design",
    "product customer support", "product promotion",
], course = [
    "javascript", "mandarin",
    "javascript practical-Code Academy",
    "javascript practical-learn Street",
    "mandarin practical-memrise", "new stuff with audiobooks",
], activity = [
    "listen to podcasts", "chat online", "Exercise",
    "take a walk", "call a friend",
];
function rint(cap) {
    return (Math.random() * cap) | 0;
}
function pick(item) {
    switch (item) {
    case 0: return "Time to work on " +
        work[ rint(work.length) ];
    case 1: return "Time to learn some " + 
        course[ rint(course.length) ];
    case 2: return "Lets relax and " + 
        activity[ rint(activity.length) ];
    default: return "error";
    }
}
document.write(pick(rint(3)) + '<br>');
var工作=[
“产品设计”、“产品系统设计”,
“产品社交媒体帖子x5”,
“产品代理招聘系统设计”,
“产品简介系统设计”,
“产品代理测试设计”,
“产品客户支持”、“产品推广”,
],课程=[
“javascript”,“普通话”,
“javascript实用代码学院”,
“javascript实用学习街”,
“汉语实用文化”、“有声读物新材料”,
],活动=[
“收听播客”、“在线聊天”、“锻炼”,
“散步”、“给朋友打电话”,
];
函数打印(cap){
返回值(Math.random()*cap)| 0;
}
功能选择(项目){
开关(项目){
案例0:返回“开始工作的时间”+
工作[打印(工作长度)];
案例1:返回“学习时间”+
航向[打印(航向长度)];
案例2:返回“让我们放松”和“+
活动[打印(活动长度)];
默认值:返回“错误”;
}
}
写(选择(打印(3))+“
”);
如果您能给出您在哪一行得到的提示
未定义
错误。那会有帮助的。这对我来说很好。看看这个。你是否意识到数组是以索引
[0]
开始设计的?这不是问题的原因,但却是编写代码的更好方法。Pro提示:不要这样定义数组。最后会是一团糟。Pro tip2:使用尽可能少的回报,我会在顶部声明
var rtn=“”然后给它赋值,只使用一个返回
返回rtn
您的建议虽然正确,但不会以任何方式影响发布的代码。好的,我计算过了,因此从1开始可见值,将0留空。这算是未定义的吗?如果是这样的话,解决这个问题的最佳方法是什么?@AminBrodie:你基本上是正确的,但是没有办法“明确地声明”Javascript数组从不同的索引开始。不给
[0]
索引分配任何内容都不会更改起始索引,起始索引始终为0。@AminBrodie您是正确的。它们总是以零为基础,因此在空数组
arr
中仅定义元素
arr[1]
将导致长度为2,其中
a[0]
将是
未定义的
if(picker1==1){return work[picker2];}
<实际上有时会产生
未定义的
,原因在问题的每个答案中都已说明。请注意,在问题中,数组元素从索引1开始,而不是从0开始,导致
.length
比预期的多出一个。我认为Math.Floor()四舍五入,创建这样一种情况,除非我添加1,否则我的输出可能为0,也不会达到最大值number@AminBrodie当前位置我想你还是看不出问题所在。公共关系
var work = [
    "product design", "product system design",
    "product social media post x5",
    "product Agent Recruitment system design",
    "product profile system design",
    "product Agent testing design",
    "product customer support", "product promotion",
], course = [
    "javascript", "mandarin",
    "javascript practical-Code Academy",
    "javascript practical-learn Street",
    "mandarin practical-memrise", "new stuff with audiobooks",
], activity = [
    "listen to podcasts", "chat online", "Exercise",
    "take a walk", "call a friend",
];
function rint(cap) {
    return (Math.random() * cap) | 0;
}
function pick(item) {
    switch (item) {
    case 0: return "Time to work on " +
        work[ rint(work.length) ];
    case 1: return "Time to learn some " + 
        course[ rint(course.length) ];
    case 2: return "Lets relax and " + 
        activity[ rint(activity.length) ];
    default: return "error";
    }
}
document.write(pick(rint(3)) + '<br>');