Javascript 未定义,并且可以';我找不到窃听器
我在程序中找不到bug。标有“Debug 3”和“Debug 6”的console.log都返回Javascript 未定义,并且可以';我找不到窃听器,javascript,arrays,function,higher-order-functions,Javascript,Arrays,Function,Higher Order Functions,我在程序中找不到bug。标有“Debug 3”和“Debug 6”的console.log都返回未定义的。我相信这是显而易见的,但如果能帮我指出这些问题,我将不胜感激。我还是个新手,所以如果你对我应该采用的不同方式有任何建议,我愿意接受反馈 我知道我本可以写一堆if/else语句,但我真的很想让代码模块化,并尽可能可重用 旁注:我知道我的函数/变量名是垃圾。我计划在程序正常运行后将它们全部重命名。这只是更容易帮助跟踪(虽然显然效果不太好,所以我在这里) 到目前为止,我掌握的代码是: // ---
未定义的。我相信这是显而易见的,但如果能帮我指出这些问题,我将不胜感激。我还是个新手,所以如果你对我应该采用的不同方式有任何建议,我愿意接受反馈
我知道我本可以写一堆if/else语句,但我真的很想让代码模块化,并尽可能可重用
旁注:我知道我的函数/变量名是垃圾。我计划在程序正常运行后将它们全部重命名。这只是更容易帮助跟踪(虽然显然效果不太好,所以我在这里)
到目前为止,我掌握的代码是:
// ---------------------- INPUT CHECKS ---------------------- //
// Check and return the number of words supplied in the name
const checkNameLength = (name) => {
arr = name.split(' ');
return arr.length;
};
// Checks if the name contains any spaces on the edges
const checkForSpacesOnEdges = (name) => {
if (name[0] === ' ' || name[-1] === ' ') {
return true;
} else {
return false;
}
};
// Checks if the name contains an honorific
const checkIfContainsHonorific = (name) => {
let accumulator = 0;
let result;
for (let i = 0; i < name.length; i++) {
if (name[i] === '.') {
accumulator++;
}
}
if (accumulator !== 0) {
result = true;
} else {
result = false;
}
return result;
};
// Returns a 1 word string
const isSingleName = (name) => {
let result;
let arr = name.split(' ');
if (arr.length === 1) {
result = true;
} else {
result = false;
}
return result;
};
// ---------------------- OUTPUT ---------------------- //
// Return empty string
const emptyOutput = (name) => {
return 'empty string';
};
// Returns the exact string provided by user
const returnAsIs = (name) => {
return name;
};
// Returns the name with trailing spaces removed
const returnWithoutSpaces = (name) => {
return name.trim();
};
// Reverses the name string and returns it
const normalReverse = (name) => {
let arr = [];
let result;
arr = name.split(' ');
arr.reverse();
result = arr[0] + ', ' + arr[1];
result.toString();
return result;
};
// Reverses the first and last name, but leaves the honorific in front
const hasHonorificReverseNames = (name) => {
let arr = name.split(' ');
let firstAndLastArr = [];
for (let i = 1; i < arr.length; i++) {
firstAndLastArr.push(arr[i]);
}
firstAndLastArr.reverse();
return arr[0].toString() + firstAndLastArr[0].toString() + ', ' + firstAndLastArr[1].toString();
};
// Main func
const nameInverter = (name) => {
let result;
if (!name) {
result = emptyOutput(name);
} else if (isSingleName(name)) {
result = returnAsIs(name);
} else if (!checkIfContainsHonorific(name)) {
if (checkForSpacesOnEdges(name)) {
result = returnWithoutSpaces(name);
}
} else if (checkNameLength(name) === 1) {
if (checkIfContainsHonorific(name)) {
result = emptyOutput(name);
}
} else if (checkNameLength(name) === 2) {
console.log("Flag 1: ", name);
if (!checkIfContainsHonorific(name)) {
console.log("Flag 2: ", name);
result = name;
}
} else if (checkNameLength(name) === 2) {
if (checkIfContainsHonorific(name)) {
result = returnAsIs(name);
}
} else if (checkNameLength(name) === 3) {
if (checkIfContainsHonorific(name)) {
result = hasHonorificReverseNames(name);
}
} else {
return normalReverse(name);
}
return result;
};
console.log("Debug 1", nameInverter(''));
console.log("Debug 2", nameInverter('Ronald'));
console.log("Debug 3", nameInverter('Ronald McDonald'));
console.log("Debug 4", nameInverter(' Ronald McDonald '));
console.log("Debug 5", nameInverter('Dr. Ronald McDonald'));
console.log("Debug 6", nameInverter('Dr. Ron'));
谢谢,非常感谢您的指导 因此,这里的问题是,您实际上到达了一些if-else
语句,但没有在该代码块中设置代码
任何时候你在这里得到未定义的
,都是因为你没有设置结果
if else
语句不会“失效”,因此一旦有一条语句为真,它将运行该代码块,但不会运行以下代码块
一个很好的例子是您的“debug 3”“Ronald Mcdonald”检查。它进入if-else语句,并点击has length===2
测试,但在该代码块中,您进行另一个测试,查看它是否包含“Dr.”,如果包含,则将result设置为name,但如果此检查失败,则永远不会将result设置为name
基本上,您需要对if-else语句进行排序,以便能够按顺序检查它们,并且它们不会发生冲突,或者您需要在这些检查中嵌套额外的if-else语句,以检查您想要检查的其他内容。我打赌您在某个地方偏离了一条……尝试将代码缩减为一条。这是太多的代码。而且,隐式全局变量是危险的。在nameInverter函数中有一些情况下,结果将保持未定义-例如,如果checkNameLength(name)==1
和CheckIfContainsNorific(name)
为false。。。这只是众多银行中的一家!我敢肯定它就差一个地方了!我很欣赏这个最小的可复制的示例链接,下次我一定会遵循这个链接。很抱歉今天在这里贴了这么多。谢谢!这一点,加上我已经收到的反馈非常有用。我在这里错过了很多台阶/小路。我要回去再检查一遍,确保没有死胡同。
Debug 1 empty string
Debug 2 Ronald
Debug 3 undefined
Debug 4 Ronald McDonald
Debug 5 Dr.McDonald, Ronald
Flag 1: Dr. Ron
Debug 6 undefined