raiseToPower
将基数提升为指数。不幸的是,它没有被正确调用 - 修复代码,因此power
值是预期的8。 raiseToPower
返回基数 (base) 的指数 (exponent) 次幂。不幸的是,它没有被正确调用 ———— 修改代码,使power
的值为 8。
+power
因此它等于2提升到3功率,而不是3增加到2功率。
+ - text: 你应修复变量power
,使其等于 2 的 3 次方,而不是 3 的 2 次方。
testString: assert(power == 8);
- - text: 您的代码应使用raiseToPower
函数调用的正确参数顺序。
+ - text: 你调用raiseToPower
函数时,传递参数的顺序应正确。
testString: assert(code.match(/raiseToPower\(\s*?base\s*?,\s*?exp\s*?\);/g));
```
@@ -40,7 +44,6 @@ let base = 2;
let exp = 3;
let power = raiseToPower(exp, base);
console.log(power);
-
```
@@ -53,7 +56,14 @@ console.log(power);
function myFunction(){
回归“你摇滚!”;
}
let varOne = myFunction; //设置为等于函数
let varTwo = myFunction(); //设置为等于字符串“You rock!”
result
设置为调用函数getNine
返回的值。 getNine
的返回值赋给变量result
。
+result
以便将其设置为函数getNine
返回的数字。
+ - text: 你应该修复变量result
使其为函数getNine
的返回值。
testString: assert(result == 9);
- - text: 您的代码应该调用getNine
函数。
+ - text: 你应该调用getNine
函数。
testString: assert(code.match(/getNine\(\)/g).length == 2);
```
@@ -40,7 +54,6 @@ function getNine() {
let result = getNine;
console.log(result);
-
```
@@ -53,7 +66,15 @@ console.log(result);
console.log()
和typeof
方法是检查中间值和程序输出类型的两种主要方法。现在是时候进入错误所采用的常见形式了。快速打字机可以同意的一个语法级问题是简单的拼写错误。变量或函数名称中的转置,丢失或错误大写字符将使浏览器查找不存在的对象 - 并以引用错误的形式进行抱怨。 JavaScript变量和函数名称区分大小写。 console.log()
和typeof
方法是检查中间值和程序输出类型的两种主要方法。 现在是时候了解一下 bug 出现的常见的情形。一个语法级别的问题是打字太快带来的低级拼写错误。
+变量或函数名的错写、漏写或大小写弄混都会让浏览器尝试查找并不存在的东西,并报出“引用错误”。JavaScript 变量和函数名称区分大小写。
+netWorkingCapital
计算有效。 netWorkingCapital
计算有效。
+receivables
在代码中声明并正确使用应receivables
变量。
+ - text: 应在代码中声明并正确使用receivables
变量。
testString: assert(code.match(/receivables/g).length == 2);
- text: 代码中不应存在拼写错误的变量。
testString: assert(!code.match(/payable;/g));
- - text: 应在组织中声明并正确使用payables
变量。
+ - text: 应在代码中声明并正确使用payables
变量。
testString: assert(code.match(/payables/g).length == 2);
```
@@ -42,7 +47,6 @@ let receivables = 10;
let payables = 8;
let netWorkingCapital = recievables - payable;
console.log(`Net working capital is: ${netWorkingCapital}`);
-
```
@@ -55,7 +59,10 @@ console.log(`Net working capital is: ${netWorkingCapital}`);
//这些是正确的:当然,只使用一种报价样式是可以的。您可以使用反斜杠(\)转义字符来转义字符串中的引号:
const grouchoContraction =“我度过了一个美好的夜晚,但事实并非如此。”;
const quoteInString =“Groucho Marx曾经说过'引用我的话说我被误引了'。”;
//这是不正确的:
const uhOhGroucho ='我度过了一个美妙的夜晚,但这不是它。';
//正确使用相同的引号:
const allSameQuotes ='我度过了一个非常精彩的夜晚,但这不是它。';
\\
) 转义字符来转义字符串中的引号:
+
+```js
+// 一种引号的正确使用方式
+const allSameQuotes = 'I\'ve had a perfectly wonderful evening, but this wasn\'t it.';
+```
+
+href
值使用不同的引号,或者转义现有的引号。在整个字符串周围保留双引号。 href
属性的值使用不同的引号,或者转义现有的引号。注意,整个字符串外面的双引号要保留。
+href
值“#Home”周围的引号。'
+ - text: "你应通过更改或转义来修复href
的值 '#Home' 周围的引号。"
testString: assert(code.match(//g));
- - text: 您的代码应该在整个字符串周围保留双引号。
+ - text: 你应该在整个字符串外围保留双引号。
testString: assert(code.match(/".*?<\/p>";/g)); ``` @@ -34,7 +56,6 @@ tests: ```js let innerHtml = "
Click here to return home
"; console.log(innerHtml); - ``` @@ -47,7 +68,8 @@ console.log(innerHtml);Click here to return home
"; +console.log(innerHtml); ``` -/section> +Off by one errors
(有时称为OBOE)。 JavaScript索引从零开始,而不是一个,这意味着最后一个索引总是小于项目的长度。如果您尝试访问等于长度的索引,程序可能会抛出“索引超出范围”引用错误或打印undefined
。当您使用将索引范围作为参数的字符串或数组方法时,它有助于阅读文档并了解它们是否包含(指定索引处的项目是否是返回的一部分)。以下是一些错误的示例: let alphabet =“abcdefghijklmnopqrstuvwxyz”;
让len = alphabet.length;
for(let i = 0; i <= len; i ++){
//最后循环一次太多次
的console.log(字母[I]);
}
for(let j = 1; j <len; j ++){
//循环一次太少次并错过索引0处的第一个字符
的console.log(字母[J]);
}
for(let k = 0; k <len; k ++){
// Goldilocks赞成 - 这是正确的
的console.log(字母表[K]);
}
Off by one errors
错误(有时称为 OBOE)。JavaScript 索引从0
开始,而不是1
,这意味着最后一个索引总会比字符串或数组的长度少 1。如果尝试访问等于长度的索引,程序可能会抛出“索引超出范围”引用错误或打印出undefined
。
+当使用将索引范围作为参数的字符串或数组方法时,阅读相关的文档并了解参数中的索引的包含性(即是否考虑进返回值中)很重要。以下是一些错误的示例:
+
+```js
+let alphabet = "abcdefghijklmnopqrstuvwxyz";
+let len = alphabet.length;
+for (let i = 0; i <= len; i++) {
+ // 在最后多了一次循环
+ console.log(alphabet[i]);
+}
+for (let j = 1; j < len; j++) {
+ // 循环少了一次,漏掉了索引 0 处的字符
+ console.log(alphabet[j]);
+}
+for (let k = 0; k < len; k++) {
+ // 不多不少,这才是正确的
+ console.log(alphabet[k]);
+}
+```
+
+.reduce()
方法的缺失部分。控制台输出应显示“数组值的总和为:6”。
+ - text: '你应该修复.reduce()
方法缺少的部分。控制台应输出 "Sum of array values is: 6"。'
testString: 'assert(arraySum === 6);'
```
@@ -35,7 +40,6 @@ tests:
let myArray = [1, 2, 3;
let arraySum = myArray.reduce((previous, current => previous + current);
console.log(`Sum of array values is: ${arraySum}`);
-
```
@@ -48,7 +52,9 @@ console.log(`Sum of array values is: ${arraySum}`);
if
, else if
和else
语句。条件有时采取测试结果是否等于值的形式。这种逻辑(至少在英语中)是“如果x等于y,则......”,它可以使用=
或赋值运算符逐字地转换为代码。这会导致程序中出现意外的控制流。如前面的挑战所述,JavaScript中的赋值运算符( =
)为变量名赋值。并且==
和===
运算符检查相等性(严格相等的三重===
测试,意味着值和类型都相同)。下面的代码将x
指定为2,其值为true
。几乎JavaScript中的每个值都评估为true
,除了所谓的“falsy”值: false
, 0
, ""
(空字符串), NaN
, undefined
和null
。 设x = 1;
让y = 2;
if(x = y){
//此代码块将针对y的任何值运行(除非y最初设置为假)
} else {
//这个代码块是本例中应该运行的(但不会)
}
if
,else if
、else
语句。条件有时采取测试一个结果是否等于一个值的形式。
+这种逻辑可以表述为“如果 x 等于 y ,则......”,听起来像是可以使用=
(即赋值运算符)。然而,这会导致程序中流程出问题。
+如前面的挑战所述,JavaScript 中的赋值运算符 (=
) 是用来为变量名赋值的。并且==
和===
运算符检查相等性(三等号===
是用来测试是否严格相等的,严格相等的意思是值和类型都必须相同)。
+下面的代码将x
赋值为 2,表达式x = y
会在执行后得到true
。JavaScript 会把大部分的值都视为true
,除了所谓的 "falsy" 值,即:false
、0
、""
(空字符串)、NaN
、undefined
和 null
。
+
+```js
+let x = 1;
+let y = 2;
+if (x = y) {
+ // 除了 "falsy" 值以外 y 为任意值时这个代码块都将执行
+} else {
+ // 按本例用意这个代码块应该执行(但其实不会)。
+}
+```
+result
分配适当的值。 result
赋上正确的值。
+==
或===
来测试相等性。
+ - text: 条件语句可以使用==
或===
来测试是否相等。
testString: assert(code.match(/x\s*?===?\s*?y/g));
```
@@ -43,7 +60,6 @@ if(x = y) {
}
console.log(result);
-
```
@@ -56,7 +72,17 @@ console.log(result);
loopy()
内的while
循环。不要叫这个功能! function loopy(){程序员的工作是确保最终达到终止条件,该条件告诉程序何时突破循环代码。一个错误是从终端条件向错误方向递增或递减计数器变量。另一个是在循环代码中意外重置计数器或索引变量,而不是递增或递减它。
while(true){
console.log(“Hello,world!”);
}
}
loopy()
内的while
循环。不要调用这个函数!
+
+```js
+function loopy() {
+ while(true) {
+ console.log("Hello, world!");
+ }
+}
+```
+
+程序员的工作是确保最终达到终止条件,该条件告诉程序何时跳出循环。有一种错误是从终端条件向错误方向递增或递减计数器变量。另一种是在循环代码中意外重置计数器或索引变量,而不是递增或递减它。
+myFunc()
函数包含一个无限循环,因为终端条件i != 4
将永远不会计算为false
(并且会中断循环) - i
将每次递增2,然后跳过4,因为i
是奇数启动。固定在终端条件比较运算符因此该循环仅运行i
小于或等于4。 myFunc()
函数包含一个无限循环,因为终止条件i != 4
永远不会为false
(并中断循环) -i
将每次递增 2,然后跳过 4,因为i
是从奇数开始递增。在终端条件中输入比较运算符,使循环仅在i
小于或等于 4 的情况下运行。
+for
循环的终端条件(中间部分)中的比较运算符。
+ - text: 你应该在for
循环的终止条件(中间部分)中更改比较运算符。
testString: assert(code.match(/i\s*?<=\s*?4;/g).length == 1);
- - text: 您的代码应该在循环的终端条件中修复比较运算符。
+ - text: 你应该修改比较运算符来避免出现死循环。
testString: assert(!code.match(/i\s*?!=\s*?4;/g));
```
@@ -37,7 +52,6 @@ function myFunc() {
console.log("Still going!");
}
}
-
```
@@ -50,7 +64,11 @@ function myFunc() {
console.log()
语句将准确打印您告诉他们打印到浏览器控制台的确切次数。在浏览器中的文本编辑器中,过程略有不同,最初可能会让人感到困惑。传递给文本编辑器块中的console.log()
值运行每组测试以及您在代码中进行的任何函数调用的一次。这有助于一些有趣的行为,并且可能会在开始时将您绊倒,因为您希望只看到一次的记录值可能会打印出更多次,具体取决于测试次数和传递给这些测试的值。如果您只想查看单个输出而不必担心运行测试周期,可以使用console.clear()
。 console.log()
语句会在控制台中按照调用的次数准确地打印出要求的内容。然而,在 freeCodeCamp 的代码编辑器中使用console.log()
会略有不同,一开始可能会让你感到困惑。
+在 freeCodeCamp 代码编辑器中,传给console.log()
的值会在每组测试执行的时候输出。另外,如果在代码中还手动调用过挑战题目的函数,调用几次就会增加几次传入值的输出。
+这就产生了一些有趣的行为,并可能在一开始就让你感到困惑,因为你觉得只会输出一次的值可能会输出多次,具体次数取决于挑战题目本身测试的数量以及这些测试调用挑战函数的方式。
+如果你不打算执行挑战的测试,而只想查看自己调用console.log()
的输出,可以使用console.clear()
。
+console.log()
在指示的代码中打印变量。 console.clear()
清空浏览器控制台。然后使用console.log()
在代码中指定的位置打印 output
变量。
+console.log()
打印outputTwo
变量。在浏览器控制台中,这应该打印出变量的值两次。
- testString: 'assert(code.match(/console\.log\(outputTwo\)/g), "Use console.log()
to print the outputTwo
variable. In your Browser Console this should print out the value of the variable two times.");'
- - text: 使用console.log()
打印outputOne
变量。
- testString: 'assert(code.match(/console\.log\(outputOne\)/g), "Use console.log()
to print the outputOne
variable.");'
- - text: 使用console.clear()
修改输出,以便outputOne
变量只输出一次。
- testString: 'assert(code.match(/^(\s*console.clear\(\);?\s*)$/gm), "Use console.clear()
to modify your output so that outputOne
variable only outputs once.");'
+ - text: 应该使用 console.clear()
来清空浏览器控制台。
+ testString: const removeJSComments = code.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, ''); const noSpaces = removeJSComments.replace(/\s/g, ''); assert(noSpaces.match(/console.clear\(\)/));
+ - text: 使用console.log()
输出变量output
的值。
+ testString: const noSpaces = code.replace(/\s/g, ''); assert(noSpaces.match(/console\.log\(output\)/));
```
@@ -34,17 +41,15 @@ tests:
console.log()
在循环的每个循环中打印变量值可以发现与重置相关的错误行为,或者无法重置变量。 console.log()
在每个循环中打印变量值可以发现与重置相关的错误或者重置变量失败。
+m
行和n
列零的二维数组。不幸的是,它没有产生预期的输出,因为row
变量没有在外部循环中重新初始化(设置回空数组)。修复代码,使其返回正确的3x2零数组,看起来像[[0, 0], [0, 0], [0, 0]]
。 m
行和n
列“零”的二维数组。不幸的是,它没有产生预期的输出,因为row
变量没有在外部循环中重新初始化(设置回空数组)。修改代码,使其正确地返回包含 3 行 2 列“零”的二维数组,即[[0, 0], [0, 0], [0, 0]]
。
+matrix
变量设置为一个数组,每个数组包含3行,每列2列零。
+ - text: 你应将变量matrix
设置为 3 行 2 列“零”的二维数组。
testString: assert(JSON.stringify(matrix) == "[[0,0],[0,0],[0,0]]");
- - text: matrix
变量应该有3行。
+ - text: 变量matrix
应有 3 行。
testString: assert(matrix.length == 3);
- - text: matrix
变量每行应有2列。
+ - text: 变量matrix
每行应有 2 列。
testString: assert(matrix[0].length == 2 && matrix[1].length === 2 && matrix[2].length === 2);
```
@@ -53,7 +58,6 @@ function zeroArray(m, n) {
let matrix = zeroArray(3, 2);
console.log(matrix);
-
```
@@ -66,7 +70,25 @@ console.log(matrix);
console.log()
方法将打印其括号内的输出“打印”到控制台,这可能是最有用的调试工具。将它放在代码中的关键点可以显示变量的中间值。在查看输出之前,最好先了解输出应该是什么。在整个代码中使用检查点来查看计算状态将有助于缩小问题所在。这是打印'Hello world!'的示例到控制台: console.log('Hello world!');
console.log()
方法可能是最有用的调试工具,它可以将括号中的内容输出到控制台,将它放在代码中的关键点可以显示变量在当时的值。在查看输出之前,最好先想清楚输出应该是什么。在代码的合适位置打点来查看变量状态有助于定位问题。
+下面是输出 'Hello world!' 到控制台的示例:
+console.log('Hello world!');
+console.log()
方法打印代码中记录的变量a
的值。 console.log()
方法在代码中注明的地方输出变量a
的值。
+console.log()
来检查变量a
的值。
+ - text: 你应使用console.log()
来检查变量a
的值。
testString: assert(code.match(/console\.log\(a\)/g));
```
@@ -38,7 +46,6 @@ a++;
let sumAB = a + b;
console.log(sumAB);
-
```
@@ -50,8 +57,10 @@ console.log(sumAB);
## Solution
typeof
检查变量的数据结构或类型。在处理多种数据类型时,这在调试时很有用。如果您认为您正在添加两个数字,但其中一个实际上是一个字符串,则结果可能是意外的。类型错误可能潜伏在计算或函数调用中。特别是当您以JavaScript Object Notation(JSON)对象的形式访问和使用外部数据时要特别小心。以下是使用typeof
一些示例: console.log(typeof“”); //输出“string”JavaScript识别六种原始(不可变)数据类型:
console.log(typeof 0); //输出“数字”
console.log(typeof []); //输出“对象”
console.log(typeof {}); //输出“对象”
Boolean
, Null
, Undefined
, Number
, String
和Symbol
(ES6新增)和可变项的一种类型: Object
。请注意,在JavaScript中,数组在技术上是一种对象。 typeof
检查变量的数据结构或类型。在处理多种数据类型时,typeof
会对调试很有帮助。如果想计算两数之和,但实际传入了一个字符串参数,则结果可能是错误的。类型错误可能隐藏在计算或函数调用中。当你以 JavaScript 对象(JSON)的形式访问和使用外部数据时尤其要小心。
+下面是使用typeof
的一些示例:
+
+```js
+console.log(typeof ""); // 输出 "string"
+console.log(typeof 0); // 输出 "number"
+console.log(typeof []); // 输出 "object"
+console.log(typeof {}); // 输出 "object"
+```
+JavaScript 有六种原始(不可变)数据类型:Boolean
,Null
,Undefined
,Number
,String
, 和Symbol
(ES6 新增)和一种可变的数据类型:Object
。注意,在 JavaScript 中,数组在本质上是一种对象
+console.log()
语句来检查typeof
每两个变量的seven
和three
中的代码。 console.log()
语句来检查代码中的两个变量seven
和three
的 typeof
值。
+console.log()
语句中使用typeof
来检查变量的类型。
+ - text: 你应在两个console.log()
语句中使用typeof
来检查变量的类型。
testString: assert(code.match(/console\.log\(typeof[\( ].*\)?\)/g).length == 2);
- - text: 您的代码应使用typeof
来检查变量类型seven
。
+ - text: 你应使用typeof
来检查变量seven
的类型。
testString: assert(code.match(/typeof[\( ]seven\)?/g));
- - text: 您的代码应使用typeof
来检查变量的类型three
。
+ - text: 你应使用typeof
来检查变量three
的类型。
testString: assert(code.match(/typeof[\( ]three\)?/g));
```
@@ -50,8 +63,10 @@ console.log(seven + three);
## Solution