{ "name": "Basic JavaScript", "order": "6", "time": "5h", "challenges": [ { "id": "bd7123c9c441eddfaeb4bdef", "title": "Comment your JavaScript Code", "description": [ "Comments are lines of code that your computer will intentionally ignore. Comments are a great way to leave notes to yourself and to other people who will later need to figure out what that code does.", "Let's take a look at the two ways you can write comments in JavaScript.", "The double-slash comment will comment out the remainder of the text on the current line:", "// This is a comment.", "The slash-star-star-slash comment will comment out everything between the /* and the */ characters:", "/* This is also a comment */", "

Instructions

", "Try creating one of each type of comment." ], "tests": [ "assert(editor.getValue().match(/(\\/\\/)...../g), 'message: Create a // style comment that contains at least five letters.');", "assert(editor.getValue().match(/(\\/\\*)[\\w\\W]{5,}(?=\\*\\/)/gm), 'message: Create a /* */ style comment that contains at least five letters.');", "assert(editor.getValue().match(/(\\*\\/)/g), 'message: Make sure that you close the comment with a */.');" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7123c9c441eddfaeb5bdef", "title": "Understand Boolean Values", "description": [ "Computers are not inherently smart. Hence, javascript developers made it easy for us to represent data to computer. Data is anything that is meaningful to the computer.", "In computer science, Data types are things that represent various types of data. JavaScript has seven data types which are Undefined, Null, Boolean, String, Symbol, Number, and Object. For example, the Number data type represents numbers.", "Now let's learn about the most basic one: the Boolean data type. Booleans represent a true or false value. They are basically little on-off switches.", "

Instructions

", "Modify the welcomeToBooleans function so that it returns true instead of false when the run button is clicked." ], "tests": [ "assert(typeof(welcomeToBooleans()) === 'boolean', 'message: The welcomeToBooleans() function should return a boolean (true/false) value.');", "assert(welcomeToBooleans() === true, 'message: welcomeToBooleans() should return true.');" ], "challengeSeed": [ "function welcomeToBooleans() {", "", "// Only change code below this line.", "", " return false; // Change this line", "", "// Only change code above this line.", "}" ], "tail": [ "welcomeToBooleans();" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7123c9c443eddfaeb5bdef", "title": "Declare JavaScript Variables", "description": [ "It's nice to have seven different ways of representing data. But to use them in other parts of code, we must store the data somewhere. In computer science, the placeholder where data is stored for further use is known as variable.", "These variables are no different from the x and y variables you use in Maths. Which means they're just a simple name to represent the data we want to refer to.", "Now let's create our first variable and call it \"myName\".", "You'll notice that in myName, we didn't use a space, and that the \"N\" is capitalized. In JavaScript, we write variable names in \"camelCase\".", "

Instructions

", "Use the var keyword to create a variable called myName. Set its value to your name, wrapped in double quotes.", "Hint", "Look at the ourName example if you get stuck." ], "tests": [ "assert((function(){if(typeof(myName) !== \"undefined\" && typeof(myName) === \"string\" && myName.length > 0){return true;}else{return false;}})(), 'message: myName should be a string that contains at least one character in it.');" ], "challengeSeed": [ "// Example", "var ourName = \"Free Code Camp\";", "", "// Only change code below this line", "" ], "tail": [ "if(typeof(myName) !== \"undefined\"){(function(v){return v;})(myName);}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244a8", "title": "Storing Values with the Equal Operator", "description": [ "In Javascript, you can store a value in a variable with the = or assignment operator.", "myVariable = 5;", "Assigns the Number value 5 to myVariable.", "Assignment always goes from right to left. Everything to the right of the = operator is resolved before the value is assigned to the variable to the left of the operator.", "myVar = 5;", "myNum = myVar;", "Assigns 5 to myVar and then resolves myVar to 5 again and assigns it to myNum.", "

Instructions

", "Assign the value 7 to variable a", "Assign the contents of a to variable b." ], "releasedOn": "11/27/2015", "tests": [ "assert(/var a;/.test(editor.getValue()) && /var b = 2;/.test(editor.getValue()), 'message: Do not change code above the line');", "assert(typeof a === 'number' && a === 7, 'message: a should have a value of 7');", "assert(typeof b === 'number' && b === 7, 'message: b should have a value of 7');", "assert(editor.getValue().match(/b\\s*=\\s*a\\s*;/g), 'message: a should be assigned to b with =');" ], "challengeSeed": [ "// Setup", "var a;", "var b = 2;", "", "// Only change code below this line", " " ], "tail": [ "(function(a,b){return \"a = \" + a + \", b = \" + b;})(a,b);" ], "solutions": [ "var a;", "var b = 2;", "a = 7;", "b = a;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244a9", "title": "Initializing Variables with the Equal Operator", "description": [ "It is common to initialize a variable to an initial value in the same line as it is declared.", "", "var myVar = 0;", "Creates a new variable called myVar and assigns it an inital value of 0.", "", "

Instructions

", "Define a variable a with var and initialize it to a value of 9." ], "releasedOn": "11/27/2015", "tests": [ "assert(/var\\s+a\\s*=\\s*9\\s*/.test(editor.getValue()), 'message: Initialize a to a value of 9');" ], "challengeSeed": [ "// Example", "var ourVar = 19;", "", "// Only change code below this line", "" ], "tail": [ "if(typeof a !== 'undefined') {(function(a){return \"a = \" + a;})(a);} else { (function() {return 'a is undefined';})(); }" ], "solutions": [ "var a = 9;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244aa", "title": "Understanding Uninitialized Variables", "description": [ "When Javascript variables are declared, they have an inital value of undefined. If you do a mathematical operation on an undefined variable your result will be NaN which means \"Not a Number\". If you concatanate a string with an undefined variable, you will get a literal string of \"undefined\".", "

Instructions

", "Initialize the three variables a, b, and c with 5, 10, and \"I am a\" respectively so that they will not be undefined." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof a === 'number' && a === 6, 'message: a should be defined and have a value of 6');", "assert(typeof b === 'number' && b === 15, 'message: b should be defined and have a value of 15');", "assert(!/undefined/.test(c) && c === \"I am a String!\", 'message: c should not contain undefined and should have a value of \"I am a String!\"');", "assert(/a = a \\+ 1;/.test(editor.getValue()) && /b = b \\+ 5;/.test(editor.getValue()) && /c = c \\+ \" String!\";/.test(editor.getValue()), 'message: Do not change code below the line');" ], "challengeSeed": [ "// Initialize these three variables", "var a;", "var b;", "var c;", "", "// Do not change code below this line", "", "a = a + 1;", "b = b + 5;", "c = c + \" String!\";", "" ], "tail": [ "(function(a,b,c){ return \"a = \" + a + \", b = \" + b + \", c = '\" + c + \"'\"; })(a,b,c);" ], "solutions": [ "var a = 5;", "var b = 10;", "var c = \"I am a\";", "a = a + 1;", "b = b + 5;", "c = c + \" String!\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244ab", "title": "Understanding Case Sensitivity in Variables", "description": [ "In Javascript all variables and function names are case sensitive. This means that capitalization matters.", "MYVAR is not the same as MyVar nor myvar. It is possible to have multiple distinct variables with the same name but different casing. It is strongly reccomended that for sake of clarity you do not use this language feature.", "

Best Practice

Write variable names in Javascript in camelCase. In camelCase, variable names made of multiple words have the first word in all lowercase and the first letter of each subsequent word(s) capitalized.
", " ", "Examples:
var someVariable;
var anotherVariableName;
var thisVariableNameIsTooLong;
", "

Instructions

", "Correct the variable assignements so their names match their variable declarations above." ], "releasedOn": "11/27/2015", "tests": [ "assert(StUdLyCapVaR === 10, 'message: StUdLyCapVaR has the correct case');", "assert(properCamelCase === \"A String\", 'message: properCamelCase has the correct case');", "assert(TitleCaseOver === 9000, 'message: TitleCaseOver has the correct case');" ], "challengeSeed": [ "// Setup", "var StUdLyCapVaR;", "var properCamelCase;", "var TitleCaseOver;", "", "// Only change code below this line", "", "STUDLYCAPVAR = 10;", "PRoperCAmelCAse = \"A String\";", "tITLEcASEoVER = 9000;", "" ], "solutions": [ "var StUdLyCapVaR;", "var properCamelCase;", "var TitleCase;", "", "StUdLyCapVaR = 10;", "properCamelCase = \"A String\";", "TitleCaseOver = \"9000\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1111c1c11feddfaeb3bdef", "title": "Add Two Numbers with JavaScript", "description": [ "Number is another data type in JavaScript which represents numeric data.", "Now let's try to add two numbers using JavaScript.", "JavaScript uses the + symbol as addition operation when placed between two numbers.", "", "Example
5 + 10 = 15
", "", "

Instructions

", "Change the 0 so that sum will equal 20." ], "tests": [ "assert(sum === 20, 'message: sum should equal 20');", "assert(/\\+/.test(editor.getValue()), 'message: Use the + operator');" ], "challengeSeed": [ "var sum = 10 + 0;", "" ], "tail": [ "(function(z){return 'sum='+z;})(sum);" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c11feddfaeb4bdef", "title": "Subtract One Number from Another with JavaScript", "description": [ "We can also subtract one number from another.", "JavaScript uses the - symbol for subtraction.", "", "Example
12 - 6 = 6
", "", "

Instructions

", "Change the 0 so that difference will equal 12." ], "tests": [ "assert(difference === 12, 'message: Make the variable difference equal 12.');", "assert(/\\d+\\s*-\\s*\\d+/.test(editor.getValue()),'message: User the - operator');" ], "challengeSeed": [ "var difference = 45 - 0;", "", "" ], "tail": [ "(function(z){return 'difference='+z;})(difference);" ], "solutions": [ "var difference = 45 - 33;" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1231c1c11feddfaeb5bdef", "title": "Multiply Two Numbers with JavaScript", "description": [ "We can also multiply one number by another.", "JavaScript uses the * symbol for multiplication of two numbers.", "", "Example
13 * 13 = 169
", "", "

Instructions

", "Change the 0 so that product will equal 80." ], "tests": [ "assert(product === 80,'message: Make the variable product equal 80');", "assert(/\\*/.test(editor.getValue()), 'message: Use the * operator');" ], "challengeSeed": [ "var product = 8 * 0;", "", "" ], "tail": [ "(function(z){return 'product = '+z;})(product);" ], "solutions": [ "var product = 8 * 10;" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c11feddfaeb6bdef", "title": "Divide One Number by Another with JavaScript", "description": [ "We can also divide one number by another.", "JavaScript uses the / symbol for division.", "", "Example
16 / 2 = 8
", "", "

Instructions

", "Change the 0 so that quotient will equal to 2." ], "tests": [ "assert(quotient === 2, 'message: Make the variable quotient equal to 2.');", "assert(/\\d+\\s*\\/\\s*\\d+/.test(editor.getValue()), 'message: Use the / operator');" ], "challengeSeed": [ "var quotient = 66 / 0;", "", "" ], "tail": [ "(function(z){return 'quotient = '+z;})(quotient);" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244ac", "title": "Increment a Number with Javascript", "description": [ "You can easily increment or add one to a variable with the ++ operator.", "i++;", "is the equivilent of", "i = i + 1;", "

Instructions

", "Change the code to use the ++ operator on myVar" ], "releasedOn": "11/27/2015", "tests": [ "assert(myVar === 88, 'message: myVar should equal 88');", "assert(/[+]{2}/.test(editor.getValue()), 'message: Use the ++ operator');", "assert(/var myVar = 87;/.test(editor.getValue()), 'message: Do not change code above the line');" ], "challengeSeed": [ "var myVar = 87;", "", "// Only change code below this line", "myVar = myVar + 1;", "" ], "tail": [ "(function(z){return 'myVar = ' + z;})(myVar);" ], "solutions": [ "var myVar = 87;", "myVar++;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244ad", "title": "Decrement a Number with Javascript", "description": [ "You can easily decrement or decrease by one a Javascript variable with the -- operator.", "i--;", "is the equivilent of", "i = i - 1;", "

Instructions

", "Change the code to use the -- operator on myVar" ], "releasedOn": "11/27/2015", "tests": [ "assert(myVar === 10, 'message: myVar should equal 10');", "assert(/myVar[-]{2}/.test(editor.getValue()), 'message: Use the -- operator on myVar');", "assert(/var myVar = 11;/.test(editor.getValue()), 'message: Do not change code above the line');" ], "challengeSeed": [ "var myVar = 11;", "", "// Only change code below this line", "myVar = myVar - 1;", "" ], "tail": [ "(function(z){return 'myVar = ' + z;})(myVar);" ], "solutions": [ "var myVar = 87;", "myVar--;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1391c1c11feddfaeb4bdef", "title": "Create Decimal Numbers with JavaScript", "description": [ "JavaScript number variables can also have decimal points. Decimal numbers are sometimes refered to as floating point numbers or floats. ", "Note", "Not all real numbers can be accurately represented in floating point. This can lead to rounding errors. Details Here.", "", "Let's create a variable myDecimal and give it a decimal value." ], "tests": [ "assert(typeof myDecimal === \"number\", 'message: myDecimal should be a number.');", "assert(editor.getValue().match(/\\d+\\.\\d+/g).length >= 2, 'message: myDecimal should have a decimal point'); " ], "challengeSeed": [ "var ourDecimal = 5.7;", "", "// Only change code below this line", "", "" ], "tail": [ "(function(){if(typeof(myDecimal) !== \"undefined\"){return myDecimal;}})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7993c9c69feddfaeb7bdef", "title": "Multiply Two Decimals with JavaScript", "description": [ "In JavaScript, you can also perform calculations with decimal numbers, just like whole numbers.", "Let's multiply two decimals together to get their product.", "Change the 0.0 so that product will equal 5.0." ], "tests": [ "assert(product === 5.0, 'message: The variable product should equal 5.0.');", "assert(/\\*/.test(editor.getValue()), 'message: You should use the * operator');" ], "tail": [ "(function(y){return 'product = '+y;})(product);" ], "challengeSeed": [ "var product = 2.0 * 0.0;", "", "" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7993c9ca9feddfaeb7bdef", "title": "Divide one Decimal by Another with JavaScript", "description": [ "Now let's divide one decimal by another.", "Change the 0.0 so that your quotient will equal 2.2." ], "tests": [ "assert(quotient === 2.2, 'message: The variable quotient should equal 2.2.');", "assert(/\\//.test(editor.getValue()), 'message: You should use the / operator');" ], "challengeSeed": [ "var quotient = 0.0 / 2.0;", "", "" ], "tail": [ "(function(y){return 'quotient = '+y;})(quotient);" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244ae", "title": "Find a Remainder with Modulus", "description": [ "The modulus operator % gives the remainder of the division of two numbers.", "5 % 2 is 1 because", "Math.floor(5 / 2) === 2
2 * 2 === 4
5 - 4 === 1
", "Usage", "Modulus can be helpful in creating alternating or cycling values. For example, in a loop an increasing variable myVar % 2 will alternate between 0 and 1 as myVar goes between even and odd numbers respectively.", "

Instructions

", "Set remainder equal to the remainder of 11 divided by 3 using the modulus operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(remainder === 2, 'message: The value of remainder should be 2');", "assert(/\\d+\\s*%\\s*\\d+/.test(editor.getValue()), 'message: You should use the % operator');" ], "challengeSeed": [ "var quotient = Math.floor(11 / 3);", "", "// Only change code below this line", "", "var remainder;", "", "" ], "tail": [ "(function(y){return 'remainder = '+y;})(remainder);" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244af", "title": "Assignment with Plus Equals", "description": [ "In Javascript it is common to need to modify the contents of a variable mathematically. Remember that everything to the right of the equals sign is evaluated first, so we can say:", "myVar = myVar + 5;", "to add 5 to myVar. Since this is such a common pattern, there are operators which do both a mathematical operation and assignement in one step.", "One such operator is the += operator.", "myVar += 5; will add 5 to myVar.", "

Instructions

", "Convert the assignements for a, b, and c to use the += operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(a === 15, 'message: a should equal 15');", "assert(b === 26, 'message: b should equal 26');", "assert(c === 19, 'message: c should equal 19');", "assert(editor.getValue().match(/\\+=/g).length === 3, 'message: You should use the += operator for each variable');", "assert(/var a = 3;/.test(editor.getValue()) && /var b = 17;/.test(editor.getValue()) && /var c = 12;/.test(editor.getValue()), 'message: Do not modify the code above the line');" ], "challengeSeed": [ "var a = 3;", "var b = 17;", "var c = 12;", "", "// Only modify code below this line", "", "a = a + 12;", "b = 9 + b;", "c = c + 7;", "" ], "tail": [ "(function(a,b,c){ return \"a = \" + a + \", b = \" + b + \", c = '\" + c + \"'\"; })(a,b,c);" ], "solutions": [ "var a = 3;", "var b = 17;", "var c = 12;", "", "a += 12;", "b += 9;", "c += 7;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b0", "title": "Assignment with Minus Equals", "description": [ "Like the += operator, -= subtracts a number from a variable.", "myVar = myVar - 5;", "Will subtract 5 from myVar. This can be rewritten as: ", "myVar -= 5;", "

Instructions

", "Convert the assignements for a, b, and c to use the -= operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(a === 5, 'message: a should equal 5');", "assert(b === -6, 'message: b should equal -6');", "assert(c === 2, 'message: c should equal 2');", "assert(editor.getValue().match(/-=/g).length === 3, 'message: You should use the -= operator for each variable');", "assert(/var a = 11;/.test(editor.getValue()) && /var b = 9;/.test(editor.getValue()) && /var c = 3;/.test(editor.getValue()), 'message: Do not modify the code above the line');" ], "challengeSeed": [ "var a = 11;", "var b = 9;", "var c = 3;", "", "// Only modify code below this line", "", "a = a - 6;", "b = b - 15;", "c = c - 1;", "", "" ], "tail": [ "(function(a,b,c){ return \"a = \" + a + \", b = \" + b + \", c = '\" + c + \"'\"; })(a,b,c);" ], "solutions": [ "var a = 11;", "var b = 9;", "var c = 3;", "", "a -= 6;", "b -= 15;", "c -= 1;", "", "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b1", "title": "Assignment with Times Equals", "description": [ "Yhe *= operator multiplies a variable by a number.", "myVar = myVar * 5;", "Will multiply myVar by 5. This can be rewritten as: ", "myVar *= 5;", "

Instructions

", "Convert the assignements for a, b, and c to use the *= operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(a === 25, 'message: a should equal 25');", "assert(b === 36, 'message: b should equal 36');", "assert(c === 46, 'message: c should equal 46');", "assert(editor.getValue().match(/\\*=/g).length === 3, 'message: You should use the *= operator for each variable');", "assert(/var a = 5;/.test(editor.getValue()) && /var b = 12;/.test(editor.getValue()) && /var c = 4\\.6;/.test(editor.getValue()), 'message: Do not modify the code above the line');" ], "challengeSeed": [ "var a = 5;", "var b = 12;", "var c = 4.6;", "", "// Only modify code below this line", "", "a = a * 5;", "b = 3 * b;", "c = c * 10;", "", "" ], "tail": [ "(function(a,b,c){ return \"a = \" + a + \", b = \" + b + \", c = '\" + c + \"'\"; })(a,b,c);" ], "solutions": [ "var a = 20;", "var b = 12;", "var c = 96;", "", "a *= 5;", "b *= 3;", "c *= 10;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b2", "title": "Assignment with Divided by Equals", "description": [ "The /= operator divides a variable by another number.", "myVar = myVar / 5;", "Will divide myVar by 5. This can be rewritten as: ", "myVar /= 5;", "

Instructions

", "Convert the assignments for a, b, and c to use the /= operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(a === 4, 'message: a should equal 4');", "assert(b === 27, 'message: b should equal 27');", "assert(c === 3, 'message: c should equal 3');", "assert(editor.getValue().match(/\\/=/g).length === 3, 'message: You should use the /= operator for each variable');", "assert(/var a = 48;/.test(editor.getValue()) && /var b = 108;/.test(editor.getValue()) && /var c = 33;/.test(editor.getValue()), 'message: Do not modify the code above the line');" ], "challengeSeed": [ "var a = 48;", "var b = 108;", "var c = 33;", "", "// Only modify code below this line", "", "a = a / 12;", "b = b / 4;", "c = c / 11;", "" ], "tail": [ "(function(a,b,c){ return \"a = \" + a + \", b = \" + b + \", c = \" + c; })(a,b,c);" ], "solutions": [ "var a = 48;", "var b = 108;", "var c = 33;", "", "a /= 12;", "b /= 4;", "c /= 11;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b3", "title": "Convert Celsius to Fahrenheit", "description": [ "To test your learning you will create a solution \"from scratch\". Place your code between the indicated lines and it will be tested against multiple test cases.", "The algorithm to convert from Celsius to Fahrenheit is the temperature in Celsius times 9/5, plus 32.", "You are given a variable Tc representing a temperature in Celsius. Create a variable Tf and apply the algorithm to assign it the corrasponding temperature in Fahrenheit." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof convert(0) === 'number', 'message: convert(0) should return a number');", "assert(convert(-30) === -22, 'message: convert(-30) should return a value of -22');", "assert(convert(-10) === 14, 'message: convert(-10) should return a value of 14');", "assert(convert(0) === 32, 'message: convert(0) should return a value of 32');", "assert(convert(20) === 68, 'message: convert(20) should return a value of 68');", "assert(convert(30) === 86, 'message: convert(30) should return a value of 86');" ], "challengeSeed": [ "function convert(Tc) {", " // Only change code below this line", "", "", " // Only change code above this line", " if(typeof Tf !== 'undefined') {", "\treturn Tf;", " } else {", " return \"Tf not defined\";", " }", "}", "", "// Change the inputs below to test your code", "convert(30);" ], "solutions": [ "function convert(Tc) {", " var Tf = Tc * 9/5 + 32;", " if(typeof Tf !== 'undefined') {", "\treturn Tf;", " } else {", " return \"Tf not defined\";", " }", "}" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bd7123c9c444eddfaeb5bdef", "title": "Declare String Variables", "description": [ "Previously we have used the code var myName = \"your name\". This is what we call a String variable. It is nothing more than a \"string\" of characters. JavaScript strings are always wrapped in quotes.", "

Instructions

", "Create two new string variables: myFirstName and myLastName and assign them the values of your first and last name, respectively." ], "tests": [ "assert((function(){if(typeof(myFirstName) !== \"undefined\" && typeof(myFirstName) === \"string\" && myFirstName.length > 0){return true;}else{return false;}})(), 'message: myFirstName should be a string with at least one character in it.');", "assert((function(){if(typeof(myLastName) !== \"undefined\" && typeof(myLastName) === \"string\" && myLastName.length > 0){return true;}else{return false;}})(), 'message: myLastName should be a string with at least one character in it.');" ], "challengeSeed": [ "// Example", "var firstName = \"Alan\";", "var lastName = \"Turing\";", "", "// Only change code below this line", "", "", "" ], "tail": [ "if(typeof(myFirstName) !== \"undefined\" && typeof(myLastName) !== \"undefined\"){(function(){return myFirstName + ', ' + myLastName;})();}" ], "solutions": [ "var myFirstName = \"Alan\";", "var myLastName = \"Turing\";" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244b5", "title": "Escaping Literal Quotes in Strings", "description": [ "When you are defining a string you must start and end with a double or single quote. What happens when you need a literal quote inside of your string?", "In Javascript you can escape a quote inside a string by placing a backslash (\\) in front of the quote. This signals Javascript that the following quote is not the end of the string, but should instead should appear inside the string.", "

Instruction

", "Use backslashes to assign the following to myStr:
\"I am a \"double quoted\" string inside \"double quotes\"\"" ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/\\\\\"/g).length === 4 && editor.getValue().match(/[^\\\\]\"/g).length === 2, 'message: You should use two double quotes (") and four escaped double quotes (\") ');" ], "challengeSeed": [ "var myStr; // Change this line", "", "" ], "solutions": [ "var myStr = \"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b4", "title": "Quoting Strings with Single Quotes", "description": [ "Strings in Javascript may be declared with both single or double quotes, so long as you start and end with the same type of quote. Unlike some languages, single and double quotes are functionally identical in Javascript.", "\"This string has \\\"double quotes\\\" in it\"", "The value in using one or the other has to do with the need to escape quotes of the same type. If you have a string with many double quotes, this can be difficult to write and to read. Instead, use single quotes:", "'This string has \"double quotes\" in it'", "

Instructions

", "Change the provided string from double to single quotes and remove the escaping." ], "releasedOn": "11/27/2015", "tests": [ "assert(!/\\\\/g.test(editor.getValue()), 'message: Remove all the backslashes (\\)');", "assert(editor.getValue().match(/\"/g).length === 4 && editor.getValue().match(/'/g).length === 2, 'message: You should have two single quotes ' and four double quotes "')" ], "challengeSeed": [ "var myStr = \"Link\";", "", "" ], "solutions": [ "var myStr = 'Link';" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b6", "title": "Escape Sequences in Strings", "description": [ "Quotes are not the only character than can be escaped inside a string. Here is a table of common escape sequences:", "
CodeOutput
\\'single quote
\\\"double quote
\\\\backslash
\\nnew line
\\rcarriage return
\\ttab
\\bbackspace
\\fform feed
", "Note that the backslash itself must be escaped in order to display as a backslash.", "

Instructions

", "Encode the following sequence, seperated by spaces:
backslash tab tab carriage return new line and assign it to myStr" ], "releasedOn": "11/27/2015", "tests": [ "assert(myStr === \"\\\\ \\t \\t \\r \\n\", 'message: myStr should have the escape sequences for backslash tab tab carriage return new line seperated by spaces');" ], "challengeSeed": [ "var myStr; // Change this line", "", "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b7", "title": "Concatanting Strings with the Plus Operator", "description": [ "In Javascript the + operator for strings is called the concatanation operator. You can build strings out of other strings by concatanating them together.", "

Instructions

", "Build myStr from the strings \"This is the start. \" and \"This is the end.\" using the + operator.", "" ], "releasedOn": "11/27/2015", "tests": [ "assert(myStr === \"This is the start. This is the end.\", 'message: myStr should have a value of This is the start. This is the end');", "assert(editor.getValue().match(/\"\\s*\\+\\s*\"/g).length > 1, 'message: Use the + operator to build myStr');" ], "challengeSeed": [ "// Example", "var ourStr = \"I come first. \" + \"I come second.\";", "", "// Only change code below this line", "", "var myStr;", "", "" ], "solutions": [ "var myStr = \"This is the start. \" + \"This is the end.\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b8", "title": "Concatanting Strings with the Plus Equals Operator", "description": [ "We can also use the += operator to concatanate a string onto the end of an existing string. This can be very helpful to break a long string over several lines.", "

Instructions

", "Build myStr over several lines by concatenating these two strings:
\"This is the first line. \" and \"This is the second line.\" using the += operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(myStr === \"This is the first line. This is the second line.\", 'message: myStr should have a value of This is the first line. This is the second line.');", "assert(editor.getValue().match(/\\w\\s*\\+=\\s*\"/g).length > 1 && editor.getValue().match(/\\w\\s*\\=\\s*\"/g).length > 1, 'message: Use the += operator to build myStr');" ], "challengeSeed": [ "// Example", "var ourStr = \"I come first. \";", "ourStr += \"I come second.\";", "", "// Only change code below this line", "", "var myStr;", "", "" ], "solutions": [ "var myStr = \"This is the first line. \";", "myStr += \"This is the second line.\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244b9", "title": "Constructing Strings with Variables", "description": [ "Sometimes you will need to build a string, Mad Libs style. By using the concatanation operator (+) you can insert one or more varaibles into a string you're building.", "

Instructions

", "Set myName and build myStr with myName between the strings \"My name is \" and \" and I am swell!\"" ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof myName !== 'undefined' && myName.length > 2, 'message: myName should be set to a string at least 3 characters long');", "assert(editor.getValue().match(/\"\\s*\\+\\s*myName\\s*\\+\\s*\"/g).length > 0, 'message: Use two + operators to build myStr with myName inside it');" ], "challengeSeed": [ "// Example", "var ourName = \"Free Code Camp\";", "var ourStr = \"Hello, our name is \" + ourName + \", how are you?\";", "", "// Only change code below this line", "var myName;", "var myStr;", "", "" ], "solutions": [ "var myName = \"Bob\";", "var myStr = \"My name is \" + myName + \" and I am swell!\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244ed", "title": "Appending Variables to Strings", "description": [ "Just as we can build a string over multiple lines out of string literals, we can also append variables to a string using the plus equals (+=) operator.", "

Instructions

", "Set someAdjective and append it to myStr using the += operator." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof someAdjective !== 'undefined' && someAdjective.length > 2, 'message: someAdjective should be set to a string at least 3 characters long');", "assert(editor.getValue().match(/\\w\\s*\\+=\\s*someAdjective\\s*;/).length > 0, 'message: Append someAdjective to myStr using the += operator');" ], "challengeSeed": [ "// Example", "var anAdjective = \"awesome!\";", "var ourStr = \"Free Code Camp is \";", "ourStr += anAdjective;", "", "// Only change code below this line", "", "var someAdjective;", "var myStr = \"Learning to code is \";", "" ], "solutions": [ "var anAdjective = \"awesome!\";", "var ourStr = \"Free Code Camp is \";", "ourStr += anAdjective;", "", "var someAdjective = \"neat\";", "var myStr = \"Learning to code is \";", "myStr += someAdjective;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bd7123c9c448eddfaeb5bdef", "title": "Check the Length Property of a String Variable", "description": [ "Data structures have properties. For example, strings have a property called .length that will tell you how many characters are in the string.", "For example, if we created a variable var firstName = \"Charles\", we could find out how long the string \"Charles\" is by using the firstName.length property.", "

Instructions

", "Use the .length property to count the number of characters in the lastName variable and assign it to lastNameLength." ], "tests": [ "assert((function(){if(typeof(lastNameLength) !== \"undefined\" && typeof(lastNameLength) === \"number\" && lastNameLength === 8){return true;}else{return false;}})(), 'message: lastNameLength should be equal to eight.');", "assert((function(){if(editor.getValue().match(/\\.length/gi) && editor.getValue().match(/\\.length/gi).length >= 2 && editor.getValue().match(/var lastNameLength \\= 0;/gi) && editor.getValue().match(/var lastNameLength \\= 0;/gi).length >= 1){return true;}else{return false;}})(), 'message: You should be getting the length of lastName by using .length like this: lastName.length.');" ], "challengeSeed": [ "// Example", "var firstNameLength = 0;", "var firstName = \"Ada\";", "", "firstNameLength = firstName.length;", "", "// Setup", "var lastNameLength = 0;", "var lastName = \"Lovelace\";", "", "// Only change code below this line.", "", "lastNameLength = lastName;", "", "" ], "tail": [ "if(typeof(lastNameLength) !== \"undefined\"){(function(){return lastNameLength;})();}" ], "solution": "var lastNameLength = 0;\nvar lastName = \"Lovelace\";\nlastNameLength = lastName.length;", "type": "waypoint", "challengeType": "1" }, { "id": "bd7123c9c549eddfaeb5bdef", "title": "Use Bracket Notation to Find the First Character in a String", "description": [ "Bracket notation is a way to get a character at a specific index within a string.", "Computers don't start counting at 1 like humans do. They start at 0. This is refered to as Zero-based indexing.", "For example, the character at index 0 in the word \"Charles\" is \"C\". So if var firstName = \"Charles\", you can get the value of the first letter of the string by using firstName[0].", "

Instructions

", "Use bracket notation to find the first character in the lastName variable and assign it to firstLetterOfLastName.", "Hint
Try looking at the firstLetterOfFirstName variable declaration if you get stuck." ], "tests": [ "assert((function(){if(typeof(firstLetterOfLastName) !== \"undefined\" && editor.getValue().match(/\\[0\\]/gi) && typeof(firstLetterOfLastName) === \"string\" && firstLetterOfLastName === \"L\"){return true;}else{return false;}})(), 'message: The firstLetterOfLastName variable should have the value of L.');" ], "challengeSeed": [ "// Example", "var firstLetterOfFirstName = \"\";", "var firstName = \"Ada\";", "", "firstLetterOfFirstName = firstName[0];", "", "// Setup", "var firstLetterOfLastName = \"\";", "var lastName = \"Lovelace\";", "", "// Only change code below this line", "firstLetterOfLastName = lastName;", "" ], "tail": [ "(function(v){return v;})(firstLetterOfLastName);" ], "solutions": [ "var firstLetterOfLastName = \"\";", "var lastName = \"Lovelace\";", "", "// Only change code below this line", "firstLetterOfLastName = lastName.length" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244ba", "title": "Understand String Immutability", "description": [ "In Javascript, strings are immutable, which means that they cannot be changed or modified once created. For example, this code:", "var myStr = \"Bob\";
myStr[0] = \"J\";
", "will not change the contents of myStr to \"Job\", because the contents of myStr cannot be altered. Note that this does not mean that myStr cannot be change, just that individual characters cannot be changes. The only way to change myStr would be to overwrite the contents with a new string, like this:", "var myStr = \"Bob\";
myStr = \"Job\";
", "

Instructions

", "Correct the assignment to myStr to achieve the desired effect." ], "releasedOn": "11/27/2015", "tests": [ "assert(myStr === \"Hello World\", 'message: myStr should have a value of Hello World');", "assert(/myStr = \"Jello World\"/.test(editor.getValue()), 'message: Do not change the code above the line');" ], "tail": [ "(function(v){return \"myStr = \" + v;})(myStr);" ], "challengeSeed": [ "// Setup", "var myStr = \"Jello World\";", "", "// Only change code below this line", "", "myStr[0] = \"H\"; // Fix Me", "", "" ], "solutions": [ "var myStr = \"Jello World\";", "myStr = \"Hello World\";" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bd7123c9c450eddfaeb5bdef", "title": "Use Bracket Notation to Find the Nth Character in a String", "description": [ "You can also use bracket notation to get the character at other positions within a string.", "Remember that computers start counting at 0, so the first character is actually the zeroth character.", "

Instructions

", "Let's try to set thirdLetterOfLastName to equal the third letter of the lastName variable.", "Hint
Try looking at the secondLetterOfFirstName variable declaration if you get stuck." ], "tests": [ "assert(thirdLetterOfLastName === 'v', 'message: The thirdLetterOfLastName variable should have the value of v.');" ], "challengeSeed": [ "// Example", "var firstName = \"Ada\";", "var secondLetterOfFirstName = firstName[1];", "", "// Setup", "var lastName = \"Lovelace\";", "", "// Only change code below this line.", "var thirdLetterOfLastName = lastName;", "", "" ], "tail": [ "(function(v){return v;})(thirdLetterOfLastName);" ], "solutions": [ "var lastName = \"Lovelace\";", "var thirdLetterOfLastName = lastName[2];" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7123c9c451eddfaeb5bdef", "title": "Use Bracket Notation to Find the Last Character in a String", "description": [ "In order to get the last letter of a string, you can subtract one from the string's length.", "For example, if var firstName = \"Charles\", you can get the value of the last letter of the string by using firstName[firstName.length - 1].", "

Instructions

", "Use bracket notation to find the last character in the lastName variable.", "Hint
Try looking at the lastLetterOfFirstName variable declaration if you get stuck." ], "tests": [ "assert(lastLetterOfLastName === \"e\", 'message: lastLetterOfLastName should be \"e\".');", "assert(editor.getValue().match(/\\.length/g).length === 2, 'message: You have to use .length to get the last letter.');" ], "challengeSeed": [ "// Example", "var firstName = \"Ada\";", "var lastLetterOfFirstName = firstName[firstName.length - 1];", "", "// Setup", "var lastName = \"Lovelace\";", "", "// Only change code below this line.", "var lastLetterOfLastName = lastName;", "", "" ], "tail": [ "(function(v){return v;})(lastLetterOfLastName);" ], "solutions": [ "var lastName = \"Lovelace\";", "var lastLetterOfLastName = lastName[lastName.length - 1];" ], "type": "waypoint", "challengeType": "1" }, { "id": "bd7123c9c452eddfaeb5bdef", "title": "Use Bracket Notation to Find the Nth-to-Last Character in a String", "description": [ "You can use the same principle we just used to retrieve the last character in a string to retrieve the Nth-to-last character.", "For example, you can get the value of the third-to-last letter of the var firstName = \"Charles\" string by using firstName[firstName.length - 3]", "

Instructions

", "Use bracket notation to find the second-to-last character in the lastName string.", " Hint
Try looking at the thirdToLastLetterOfFirstName variable declaration if you get stuck." ], "tests": [ "assert(secondToLastLetterOfLastName === 'c', 'message: secondToLastLetterOfLastName should be \"c\".');", "assert(editor.getValue().match(/\\.length/g).length === 2, 'message: You have to use .length to get the second last letter.');" ], "challengeSeed": [ "// Example", "var firstName = \"Ada\";", "var thirdToLastLetterOfFirstName = firstName[firstName.length - 3];", "", "// Setup", "var lastName = \"Lovelace\";", "", "// Only change code below this line", "var secondToLastLetterOfLastName = lastName;", "", "" ], "tail": [ "(function(v){return v;})(secondToLastLetterOfLastName);" ], "solutions": [ "var lastName = \"Lovelace\";", "var secondToLastLetterOfLastName = lastName[lastName.length - 2];" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244bb", "title": "Word Blanks", "description": [ "We will now use our knowledge of strings to build a \"Mad Libs\" style word game we're calling \"Word Blanks\". We have provided a framework for testing your results with different words. ", "You will need to use string operators to build a new string, result, using the provided variables: ", "myNoun, myAdjative, myVerb, and myAdverb.", "The tests will run your function with several different inputs to make sure it works properly." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof wordBlanks(\"\",\"\",\"\",\"\") === 'string', 'message: wordBlanks(\"\",\"\",\"\",\"\") should return a string');", "assert(wordBlanks(\"\",\"\",\"\",\"\").length > 50, 'message: wordBlanks(\"\",\"\",\"\",\"\") should return at least 50 characters with empty inputs');", "assert(/dog/.test(test1) && /big/.test(test1) && /ran/.test(test1) && /quickly/.test(test1),'message: wordBlanks(\"dog\", \"big\", \"ran\", \"quickly\") should contain all of the passed words.');", "assert(/cat/.test(test2) && /little/.test(test2) && /hit/.test(test2) && /slowly/.test(test2),'message: wordBlanks(\"cat\", \"little\", \"hit\", \"slowly\") should contain all of the passed words.');" ], "challengeSeed": [ "function wordBlanks(myNoun, myAdjative, myVerb, myAdverb) {", " var result = \"\";", " // Your code below this line", "", "", " // Your code above this line", "\treturn result;", "}", "", "// Change the words here to test your function", "wordBlanks(\"dog\", \"big\", \"ran\", \"quickly\");" ], "tail": [ "var test1 = wordBlanks(\"dog\", \"big\", \"ran\", \"quickly\");", "var test2 = wordBlanks(\"cat\", \"little\", \"hit\", \"slowly\");" ], "solutions": [ "function wordBlanks(myNoun, myAdjative, myVerb, myAdverb) {", " var result = \"\";", " result = \"Once there was a \" + myNoun + \" which was very \" + myAdjative + \". \";", "\tresult += \"It \" + myVerb + \" \" + myAdverb + \" around the yard.\";", "\treturn result;", "}" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bd7993c9c69feddfaeb8bdef", "title": "Store Multiple Values in one Variable using JavaScript Arrays", "description": [ "With JavaScript array variables, we can store several pieces of data in one place.", "You start an array declaration with an opening square bracket, end it with a closing square bracket, and put a comma between each entry, like this:
var sandwich = [\"peanut butter\", \"jelly\", \"bread\"].", "

Instructions

", "Create a new array called myArray that contains both a string and a number (in that order).", "Hint
Refer to the example code in the text editor if you get stuck." ], "tests": [ "assert(typeof(myArray) == 'object', 'message: myArray should be an array.');", "assert(typeof(myArray[0]) !== 'undefined' && typeof(myArray[0]) == 'string', 'message: The first item in myArray should be a string.');", "assert(typeof(myArray[1]) !== 'undefined' && typeof(myArray[1]) == 'number', 'message: The second item in myArray should be a number.');" ], "challengeSeed": [ "// Example", "var array = [\"John\", 23];", "", "// Only change code below this line.", "var myArray = [];", "" ], "tail": [ "(function(z){return z;})(myArray);" ], "solutions": [ "var myArray = [\"The Answer\", 42];" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c11feddfaeb7bdef", "title": "Nest one Array within Another Array", "description": [ "You can also nest arrays within other arrays, like this: [[\"Bulls\", 23]]. This is also called a Multi-dimensional Array.", "

Instructions

", "Create a nested array called myArray." ], "tests": [ "assert(Array.isArray(myArray) && myArray.some(Array.isArray), 'message: myArray should have at least one array nested within another array.');" ], "challengeSeed": [ "// Example", "var ourArray = [[\"the universe\", \"everything\", 42]];", "", "// Only change code below this line.", "var myArray = [];", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "solutions": [ "var myArray = [[1,2,3]];" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9997c9c79feddfaeb9bdef", "title": "Access Array Data with Indexes", "description": [ "We can access the data inside arrays using indexes.", "Array indexes are written in the same bracket notation that strings use, except that instead of specifying a character, they are specifying an entry in the array. Like strings, arrays use zero-based indexing, so the first element in an array is element 0", "For example:", "var array = [1,2,3];", "array[0]; //equals 1", "var data = array[1];", "

Instructions

", "Create a variable called myData and set it to equal the first value of myArray." ], "tests": [ "assert((function(){if(typeof(myArray) != 'undefined' && typeof(myData) != 'undefined' && myArray[0] == myData){return true;}else{return false;}})(), 'message: The variable myData should equal the first value of myArray.');" ], "challengeSeed": [ "// Example", "var ourArray = [1,2,3];", "var ourData = ourArray[0]; // equals 1", "", "// Setup", "var myArray = [1,2,3];", "", "// Only change code below this line.", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\" && typeof(myData) !== \"undefined\"){(function(y,z){return 'myArray = ' + JSON.stringify(y) + ', myData = ' + JSON.stringify(z);})(myArray, myData);}" ], "solutions": [ "var myArray = [1,2,3];", "var myData = myArray[0];" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c11feddfaeb8bdef", "title": "Modify Array Data With Indexes", "description": [ "Unlike strings, the contents of arrays can are mutable and can be freely changed.", "For example:", "var ourArray = [3,2,1];", "ourArray[0] = 1; // equals [1,2,1]", "

Instructions

", "Modify the data stored at index 0 of myArray to a value of 3." ], "tests": [ "assert((function(){if(typeof(myArray) != 'undefined' && myArray[0] == 3 && myArray[1] == 2 && myArray[2] == 3){return true;}else{return false;}})(), 'message: myArray should now be [3,2,3].');", "assert((function(){if(editor.getValue().match(/myArray\\[0\\]\\s?=\\s?/g)){return true;}else{return false;}})(), 'message: You should be using correct index to modify the value in myArray.');" ], "challengeSeed": [ "// Example", "var ourArray = [1,2,3];", "ourArray[1] = 3; // ourArray now equals [1,3,3].", "", "// Setup", "var myArray = [1,2,3];", "", "// Only change code below this line.", "", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "solutions": [ "var myArray = [1,2,3];", "myArray[0] = 3;" ], "type": "waypoint", "challengeType": "1" }, { "id": "56592a60ddddeae28f7aa8e1", "title": "Access Multi-Dimensional Arrays With Indexes", "description": [ "One way to think of a multi-dimensional array, is as an array of arrays. When you use brackets to access your array, the first set of bracket refers to the outer-most array, and each subsequent level of brackets refers to the next level in.", "For example:", "
var arr = [
[1,2,3],
[4,5,6],
[7,8,9],
[[10,11,12], 13, 14]
];
", "arr[0]; // equals [1,2,3]", "arr[1][2]; // equals 6", "arr[3][0][1]; // equals 11", "

Instructions

", "Read from myArray using bracket notation so that myData is equal to 8" ], "tests": [ "assert(myData === 8, 'message: myData should be equal to 8.');", "assert(/myArray\\[2\\]\\[1\\]/g.test(editor.getValue()), 'message: You should be using bracket notation to read the value from myArray.');" ], "challengeSeed": [ "// Setup", "var myArray = [[1,2,3],[4,5,6], [7,8,9], [[10,11,12], 13, 14]];", "", "// Only change code below this line.", "var myData = myArray[0][0];", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return \"myData: \" + myData + \" myArray: \" + JSON.stringify(myArray);})();}" ], "solutions": [ "var myArray = [[1,2,3],[4,5,6], [7,8,9], [[10,11,12], 13, 14]];", "var myData = myArray[2][1];" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9995c9c69feddfaeb9bdef", "title": "Manipulate Arrays With push()", "description": [ "An easy way to append data to the end of an array is via the push() method. push() takes a value and \"pushes\" it onto the end of the array.", "var arr = [1,2,3];", "arr.push(4);", "// arr is now [1,2,3,4]", "

Instructions

", "Push [\"dog\", 3] onto the end of the myArray variable." ], "tests": [ "\nassert((function(d){if(d[2] != undefined && d[0][0] == 'John' && d[0][1] == 23 && d[2][0] == 'dog' && d[2][1] == 3 && d[2].length == 2){return true;}else{return false;}})(myArray), 'message: myArray should now equal [[\"John\", 23], [\"cat\", 2], [\"dog\", 3]].');" ], "challengeSeed": [ "// Example", "var ourArray = [\"Stimpson\", \"J\", \"cat\"];", "ourArray.push([\"happy\", \"joy\"]); ", "// ourArray now equals [\"Stimpson\", \"J\", \"cat\", [\"happy\", \"joy\"]]", "", "// Setup", "var myArray = [[\"John\", 23], [\"cat\", 2]];", "", "// Only change code below this line.", "", "\t" ], "tail": [ "(function(z){return 'myArray = ' + JSON.stringify(z);})(myArray);" ], "solutions": [ "var myArray = [[\"John\", 23], [\"cat\", 2]];", "myArray.push([\"dog\",3]);" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9994c9c69feddfaeb9bdef", "title": "Manipulate Arrays With pop()", "description": [ "Another way to change the data in an array is with the .pop() function. ", ".pop() is used to \"pop\" a value off of the end of an array. We can store this \"popped off\" variable by performing pop() within a variable declaration.", "Any type of data structure can be \"popped\" off of an array - numbers, strings, even nested arrays.", "

Instructions

", "Use the .pop() function to remove the last item from myArray, assigning the \"popped off\" value to removedFromMyArray." ], "tests": [ "assert((function(d){if(d[0][0] == 'John' && d[0][1] == 23 && d[2] == undefined){return true;}else{return false;}})(myArray), 'message: myArray should only contain [[\"John\", 23]].');", "assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removedFromMyArray), 'message: removedFromMyArray should only contain [\"cat\", 2].');" ], "challengeSeed": [ "// Example", "var ourArray = [1,2,3];", "var removedFromOurArray = ourArray.pop(); ", "// removedFromOurArray now equals 3, and ourArray now equals [1,2]", "", "// Setup", "var myArray = [[\"John\", 23], [\"cat\", 2]];", "", "// Only change code below this line.", "var removedFromMyArray;", "", "" ], "tail": [ "(function(y, z){return 'myArray = ' + JSON.stringify(y) + ' & removedFromMyArray = ' + JSON.stringify(z);})(myArray, removedFromMyArray);" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9996c9c69feddfaeb9bdef", "title": "Manipulate Arrays With shift()", "description": [ "pop() always removes the last element of an array. What if you want to remove the first?", "That's where .shift() comes in. It works just like .pop(), except it removes the first element instead of the last.", "

Instructions

", "Use the .shift() function to remove the first item from myArray, assigning the \"shifted off\" value to removedFromMyArray." ], "tests": [ "assert((function(d){if(d[0][0] == 'dog' && d[0][1] == 3 && d[1] == undefined){return true;}else{return false;}})(myArray), 'message: myArray should now equal [[\"dog\", 3]].');", "assert((function(d){if(d[0] === 'John' && d[1] === 23 && typeof(removedFromMyArray) === 'object'){return true;}else{return false;}})(removedFromMyArray), 'message: removedFromMyArray should contain [\"John\", 23].');" ], "challengeSeed": [ "// Example", "var ourArray = [\"Stimpson\", \"J\", [\"cat\"]];", "removedFromOurArray = ourArray.shift();", "// removedFromOurArray now equals \"Stimpson\" and ourArray now equals [\"J\", [\"cat\"]].", "", "// Setup", "var myArray = [[\"John\", 23], [\"dog\", 3]];", "", "// Only change code below this line.", "var removedFromMyArray;", "", "" ], "tail": [ "(function(y, z){return 'myArray = ' + JSON.stringify(y) + ' & removedFromMyArray = ' + JSON.stringify(z);})(myArray, removedFromMyArray);" ], "solutions": [ "var myArray = [\"John\", 23, [\"dog\", 3]];", "", "// Only change code below this line.", "var removedFromMyArray = myArray.shift();" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9997c9c69feddfaeb9bdef", "title": "Manipulate Arrays With unshift()", "description": [ "Not only can you shift elements off of the beginning of an array, you can also unshift elements to the beginning of an array.", "unshift() works exactly like push(), but instead of adding the element at the end of the array, unshift() adds the element at the beginning of the array.", "

Instructions

", "Add [\"Paul\",35] to the beginning of the myArray variable using unshift()." ], "tests": [ "assert((function(d){if(typeof(d[0]) === \"object\" && d[0][0].toLowerCase() == 'paul' && d[0][1] == 35 && d[1][0] != undefined && d[1][0] == 'dog' && d[1][1] != undefined && d[1][1] == 3){return true;}else{return false;}})(myArray), 'message: myArray should now have [[\"Paul\", 35], [\"dog\", 3]]).');" ], "challengeSeed": [ "// Example", "var ourArray = [\"Stimpson\", \"J\", \"cat\"];", "ourArray.shift(); // ourArray now equals [\"J\", \"cat\"]", "ourArray.unshift(\"Happy\"); ", "// ourArray now equals [\"Happy\", \"J\", \"cat\"]", "", "// Setup", "var myArray = [[\"John\", 23], [\"dog\", 3]];", "myArray.shift();", "", "// Only change code below this line.", "", "" ], "tail": [ "(function(y, z){return 'myArray = ' + JSON.stringify(y);})(myArray);" ], "solutions": [ "var myArray = [[\"John\", 23], [\"dog\", 3]];", "myArray.shift();", "myArray.unshift([\"Paul\", 35]);" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244bc", "title": "Shopping List", "description": [ "Create a shopping list in the variable myList. The list should be a multi-dimensional array containing several sub-arrays. ", "The first element in each sub-array should contain a string with the name of the item. The second element should be a number representing the quantity. IE:", "[\"Chocolate Bar\", 15]", "There should be at least 5 sub-arrays in the list." ], "releasedOn": "11/27/2015", "tests": [ "assert(isArray, 'message: myList should be an array');", "assert(hasString, 'message: The first elements in each of your sub-arrays must all be strings');", "assert(hasNumber, 'message: The second elements in each of your sub-arrays must all be numbers');", "assert(count > 4, 'message: You must have at least 5 items in your list');" ], "challengeSeed": [ "var myList = [];", "", "" ], "tail": [ "var count = 0;", "var isArray = true;", "var hasString = true;", "var hasNumber = true;", "(function(list){", " if(Array.isArray(myList)) {", " myList.forEach(function(elem) {", " if(typeof elem[0] !== 'string') {", " hasString = false;", " }", " if(typeof elem[1] !== 'number') {", " hasNumber = false;", " }", " });", " count = myList.length;", " return JSON.stringify(myList);", " } else {", " isArray = false;", " return \"myList is not an array\";", " }", "", "})(myList);" ], "solutions": [ "var myList = [", " [\"Candy\", 10],", " [\"Potatoes\", 12],", " [\"Eggs\", 12],", " [\"Catfood\", 1],", " [\"Toads\", 9]", "];" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bg9997c9c89feddfaeb9bdef", "title": "Write Reusable JavaScript with Functions", "description": [ "In JavaScript, we can divide up our code into reusable parts called functions.", "Here's an example of a function:", "
function functionName() {
console.log(\"Hello World\");
}
", "You can call or invoke this function by using its name followed by parentheses, like this:", "functionName();", "Each time the function is called it will print out the message \"Hello World\" on the dev console. All of the code between the curly braces will be executed every time the function is called.", "

Instructions

", "Create a function called myFunction which prints \"Hi World\" to the dev console. Call that function." ], "tests": [ "assert(typeof myFunction === 'function', 'message: myFunction should be a function');", "assert(\"Hi World\" === logOutput, 'message: myFunction should output \"Hi World\" to the dev console');", "assert(/^\\s*myFunction\\(\\)\\s*;/m.test(editor.getValue()), 'message: Call myFunction after you define it');" ], "challengeSeed": [ "// Example", "function ourFunction() {", " console.log(\"Heyya, World\");", "}", "", "ourFunction();", "", "// Only change code below this line", "", "" ], "tail": [ "var logOutput = \"\";", "var oldLog = console.log;", "function capture() {", " console.log = function (message) {", " logOutput = message.trim();", " oldLog.apply(console, arguments);", " };", "}", "", "function uncapture() {", " console.log = oldLog;", "}", "", "if (typeof myFunction !== \"function\") { ", " (function() { return \"myFunction is not defined\"; })();", "} else {", " capture();", " myFunction(); ", " uncapture();", " (function() { return logOutput || \"console.log never called\"; })();", "}" ], "solutions": [ "function myFunction() {", " console.log(\"Hi World\");", "}", "myFunction();" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244bd", "title": "Passing Values to Functions with Arguments", "description": [ "Functions can take input in the form of parameters. Parameters are variables that take on the value of the arguments which are passed in to the function. Here is a function with two parameters, param1 and param2:", "
function testFun(param1, param2) {
console.log(param1, param2);
}
", "Then we can call testFun:", "testFun(\"Hello\", \"World\");", "We have passed two arguments, \"Hello\" and \"World\". Inside the function, param1 will equal \"Hello\" and param2 will equal \"World\". Note that you could call testFun again with different arguments and the parameters would take on the value of the new arguments.", "

Instructions

", "Create a function called myFunction that accepts two arguments and outputs their sum to the dev console. Call your function." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof myFunction === 'function', 'message: myFunction should be a function');", "capture(); myFunction(1,2); uncapture(); assert(logOutput == 3, 'message: myFunction(1,2) should output 3');", "capture(); myFunction(7,9); uncapture(); assert(logOutput == 16, 'message: myFunction(7,9) should output 16');", "assert(/^\\s*myFunction\\(\\s*\\d+\\s*,\\s*\\d+\\s*\\)\\s*;/m.test(editor.getValue()), 'message: Call myFunction after you define it');" ], "head": [ "var logOutput = \"\";", "var oldLog = console.log;", "function capture() {", " console.log = function (message) {", " logOutput = message + ''.trim();", " oldLog.apply(console, arguments);", " };", "}", "", "function uncapture() {", " console.log = oldLog;", "}", "", "capture();" ], "challengeSeed": [ "// Example", "function ourFunction(a, b) {", " console.log(a - b);", "}", "ourFunction(10, 5); // Outputs 5", "", "// Only change code below this line.", "", "" ], "tail": [ "uncapture();", "", "if (typeof myFunction !== \"function\") { ", " (function() { return \"myFunction is not defined\"; })();", "} else {", " (function() { return logOutput || \"console.log never called\"; })();", "}" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244be", "title": "Global Scope and Functions", "description": [ "In Javascript, scope refers to the visibility of variables. Variables which are defined outside of a function block have Global scope. This means the can be seen everywhere in your Javascript code. ", "Variables which are used without the var keyword are automatically created in the global scope. This can create unintended concequences elsewhere in your code or when running a function again. You should always declare your variables with var.", "

Instructions

", "Declare a global variable myGlobal outside of any function. Initialize it to have a value of 10 ", "Inside function fun1, assign 5 to oopsGlobal without using the var keyword." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof myGlobal != \"undefined\", 'message: myGlobal should be defined');", "assert(myGlobal === 10, 'message: myGlobal should have a value of 10');", "assert(/var\\s+myGlobal/.test(editor.getValue()), 'message: myGlobal should be declared using the var keyword');", "assert(typeof oopsGlobal != \"undefined\" && oopsGlobal === 5, 'message: oopsGlobal should have a value of 5');", "assert(!/var\\s+oopsGlobal/.test(editor.getValue()), 'message: Do not decalre oopsGlobal using the var keyword');" ], "head": [ "var logOutput = \"\";", "var oldLog = console.log;", "function capture() {", " console.log = function (message) {", " logOutput = message;", " oldLog.apply(console, arguments);", " };", "}", "", "function uncapture() {", " console.log = oldLog;", "}", "", "capture();" ], "challengeSeed": [ "// Declare your variable here", "", "", "function fun1() {", " // Assign 5 to oopsGlobal Here", "}", "", "// Only change code above this line", "function fun2() {", " var output = \"\";", " if(typeof myGlobal != \"undefined\") {", " output += \"myGlobal: \" + myGlobal;", " }", " if(typeof oopsGlobal != \"undefined\") {", " output += \" oopsGlobal: \" + oopsGlobal;", " }", " console.log(output);", "}" ], "tail": [ "fun1();", "fun2();", "uncapture();", "(function() { return logOutput || \"console.log never called\"; })();" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244bf", "title": "Local Scope and Functions", "description": [ "Variables which are declared within a function, as well as function parameters are local. Thos means they are only visible within that function. ", "Here is a function myTest with a local variable called loc.", "
function myTest() {
var local1 = \"foo\";
console.log(local1);
}
myTest(); // \"foo\"
console.log(local1); // \"undefined\"
", "local1 is not defined outside of the function.", "

Instructions

", "Declare a local variable myVar inside myFunction" ], "releasedOn": "11/27/2015", "tests": [ "assert(1===1, 'message: message here');" ], "challengeSeed": [ "function myFunction() {", " ", " console.log(myVar);", "}", "", "console.log(myVar);", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c0", "title": "Global vs. Local Scope in Functions", "description": [ "It is possible to have both a local and global variables with the same name. When you do this, the local variable takes precedence over the global variable.", "In this example:", "
var someVar = \"Hat\";
function myFun() {
var someVar = \"Head\";
return someVar;
}
", "The function myFun will return \"Head\" because the local version of the variable is present.", "

Instructions

", "Add a local variable to myFunction to override the value of outerWear with \"sweater\"." ], "releasedOn": "11/27/2015", "tests": [ "assert(outerWear === \"T-Shirt\", 'message: Do not change the value of the global outerWear');", "assert(myFunction() === \"sweater\", 'message: myFunction should return \"sweater\"');", "assert(/return outerWear/.test(editor.getValue()), 'message: Do not change the return statement');" ], "challengeSeed": [ "// Setup", "var outerWear = \"T-Shirt\";", "", "function myFunction() {", " // Only change code below this line", "", "", "", " // Only change code above this line", " return outerWear;", "}", "", "myFunction();" ], "solutions": [ "var outerWear = \"T-Shirt\";", "function myFunction() {", " var outerWear = \"sweater\";", " return outerWear;", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c2", "title": "Return a Value from a Function with Return", "description": [ "We can pass values into a function with arguments. You can use a return statement to send a value back out of a function.", "For Example:", "
function plusThree(num) {
return num + 3;
}
var answer = plusThree(5); // 8
", "plusThree takes an argument for num and returns a value equal to num + 3.", "

Instructions

", "Create a function timesFive that accepts one argument, multiplies it by 5, and returns the new value." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof timesFive === 'function', 'message: timesFive should be a function');", "assert(timesFive(5) === 25, 'message: timesFive(5) should return 25');", "assert(timesFive(2) === 10, 'message: timesFive(2) should return 10');", "assert(timesFive(0) === 0, 'message: timesFive(0) should return 0');" ], "challengeSeed": [ "// Example", "function minusSeven(num) {", " return num - 7;", "}", "", "// Only change code below this line", "", "" ], "tail": [ "(function() { if(typeof timesFive === 'function'){ return \"timesfive(5) === \" + timesFive(5); } else { return \"timesFive is not a function\"} })();" ], "solutions": [ "function timesFive(num) {", " return num * 5;", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c3", "title": "Assignment with a Returned Value", "description": [ "If you'll recall from our discussion of Storing Values with the Equal Operator, everything to the right of the equal sign is resolved before the value is assigned. This means we can take the return value of a function and assign it to a variable.", "Assume we have pre-defined a function sum which adds two numbers together, then: ", "var ourSum = sum(5, 12);", "will call sum, which returns a value of 17 and assigns it to ourSum.", "

Instructions

", "Call process with an argument of 7 and assign it's return valueto the variable processed." ], "releasedOn": "11/27/2015", "tests": [ "assert(processed === 2, 'message: processed should have a value of 10');", "assert(/processed\\s*=\\s*process\\(\\s*7\\s*\\)\\s*;/.test(editor.getValue()), 'message: You should assign process to processed');" ], "challengeSeed": [ "// Setup", "var processed = 0;", "", "function process(num) {", " return (num + 3) / 5;", "}", "", "// Only change code below this line", "", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c6", "title": "Stand in Line", "description": [ "In Computer Science a queue is an abastract datatype where items are kept in order. New items can be added to the back of the queue and old items are taken off the front of the queue.", "Write a function queue which takes an array and an item as arguments. Add the item onto the end of the array, then remove and return the item at the front of the queue." ], "releasedOn": "11/27/2015", "tests": [ "assert(queue([],1) === 1, 'message: queue([], 1) should return 1');", "assert(queue([2],1) === 2, 'message: queue([2], 1) should return 2');", "queue(myArr, 10); assert(myArr[4] === 10, 'message: After queue(myArr, 10), myArr[4] should be 10');" ], "head": [ "var logOutput = [];", "var oldLog = console.log;", "function capture() {", " console.log = function (message) {", " logOutput.push(message);", " oldLog.apply(console, arguments);", " };", "}", "", "function uncapture() {", " console.log = oldLog;", "}", "", "capture();" ], "challengeSeed": [ "// Setup", "var myArr = [1,2,3,4,5];", "", "function queue(arr, item) {", " // Your code here", " ", " return item; // Change this line", "}", "", "// Display Code", "console.log(\"Before: \" + JSON.stringify(myArr));", "console.log(queue(myArr, 6)); // Modify this line to test", "console.log(\"After: \" + JSON.stringify(myArr));" ], "tail": [ "uncapture();", "myArr = [1,2,3,4,5];", "(function() { return logOutput.join(\"\\n\");})();" ], "solutions": [ "var arr = [ 1,2,3,4,5];", "", "function queue(myArr, item) {", " myArr.push(item);", " return myArr.shift();", "}" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1111c1c12feddfaeb3bdef", "title": "Use Conditional Logic with If Statements", "description": [ "We can use if statements in JavaScript to only execute code if a certain condition is met.", "if statements require a boolean condition to evaluate. If the boolean evaluates to true, the statement inside the curly braces executes. If it evaluates to false, the code will not execute.", "For example:", "
function test(myVal) {
if (myVal > 10) {
return \"Greater Than\";
}
return \"Not Greater Than\";
}
", "If myVal is greater than 10, the function will return \"Greater Than\". If it is not, the function will return \"Not Greater Than\".", "

Instructions

", "Create an if statement inside the function to return \"Yes\" if testMe is greater than 5. Return \"No\" if it is less than 5." ], "tests": [ "assert(typeof myFunction === \"function\", 'message: myFunction should be a function');", "assert(typeof myFunction(4) === \"string\", 'message: myFunction(4) should return a string');", "assert(typeof myFunction(6) === \"string\", 'message: myFunction(6) should return a string');", "assert(myFunction(4) === \"No\", 'message: myFunction(4) should \"No\"');", "assert(myFunction(5) === \"No\", 'message: myFunction(5) should \"No\"');", "assert(myFunction(6) === \"Yes\", 'message: myFunction(6) should \"Yes\"');" ], "challengeSeed": [ "// Example", "function ourFunction(testMe) {", " if (testMe > 10) { ", " return \"Yes\";", " }", " return \"No\";", "}", "", "// Setup", "function myFunction(testMe) {", "", " // Only change code below this line.", "", "", "", " // Only change code above this line.", "", "}", "", "// Change this value to test", "myFunction(10);" ], "solutions": [ "function myFunction(testMe) {", " if (testMe > 5) {", " return 'Yes';", " }", " return 'No';", "}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244d0", "title": "Comparison with the Equality Operator", "description": [ "There are many Comparison Operators in Javascript. All of these operators return a boolean true or false value.", "The most basic operators is the equality operator ==. The equality operator compares to values and returns true if they're equivilent or false if they are not. Note that equality is different from assignement (=), which returns the value to the right of the operator.", "
function equalityTest(myVal) {
if (myVal == 10) {
return \"Equal\";
}
return \"Not Equal\";
}
", "If myVal is equal to 10, the function will return \"Equal\". If it is not, the function will return \"Not Equal\".", "The equality operator will do it's best to convert values for comparison, for example:", "
1 == 1 // true
\"1\" == 1 // true
1 == '1' // true
0 == false // true
0 == null // false
0 == undefined // false
null == undefined // true
", "

Instructions

", "Add the equality operator to the indicated line so the function will return \"Equal\" when val is equivilent to 12" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(10) === \"Not Equal\", 'message: myTest(10) should return \"Not Equal\"');", "assert(myTest(12) === \"Equal\", 'message: myTest(12) should return \"Equal\"');", "assert(myTest(\"12\") === \"Equal\", 'message: myTest(\"12\") should return \"Equal\"');", "assert(editor.getValue().match(/val\\s*==\\s*\\d+/g).length > 0, 'message: You should use the == operator');" ], "challengeSeed": [ "// Setup", "function myTest(val) {", " if (val) { // Change this line", " return \"Equal\";", " }", " return \"Not Equal\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val == 12) {", " return \"Equal\";", " }", " return \"Not Equal\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d1", "title": "Comparison with the Strict Equality Operator", "description": [ "Strict equality (===) is the counterpart to the equality operator (==). Unlike the equality operator, strict equality tests both the type and value of the compared elements.", "Examples
3 === 3 // true
3 === '3' // false
", "

Instructions

", "Change the equality operator to a strict equality on the if statement so the function will return \"Equal\" when val is strictltly equal to 7" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(10) === \"Not Equal\", 'message: myTest(10) should return \"Not Equal\"');", "assert(myTest(7) === \"Equal\", 'message: myTest(7) should return \"Equal\"');", "assert(myTest(\"7\") === \"Not Equal\", 'message: myTest(\"7\") should return \"Not Equal\"');", "assert(editor.getValue().match(/val\\s*===\\s*\\d+/g).length > 0, 'message: You should use the === operator');" ], "challengeSeed": [ "// Setup", "function myTest(val) {", " if (val) { // Change this line", " return \"Equal\";", " }", " return \"Not Equal\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val == 7) {", " return \"Equal\";", " }", " return \"Not Equal\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d2", "title": "Comparison with the Inequality Operator", "description": [ "The inequality operator (!=) is the opposite of the equality operator. It means \"Not Equal\" and returns false where equality would return true and vice versa. Like the equality operator, the inequality operator will convert types.", "Examples
1 != 2 // true
1 != \"1\" // false
1 != '1' // false
1 != true // false
0 != false // false
", "

Instructions

", "Add the inequality operator != to the if statement so the function will return \"Not Equal\" when val is not equivilent to 99" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(99) === \"Equal\", 'message: myTest(99) should return \"Equal\"');", "assert(myTest(\"99\") === \"Equal\", 'message: myTest(\"99\") should return \"Equal\"');", "assert(myTest(12) === \"Not Equal\", 'message: myTest(12) should return \"Not Equal\"');", "assert(myTest(\"12\") === \"Not Equal\", 'message: myTest(\"12\") should return \"Not Equal\"');", "assert(myTest(\"bob\") === \"Not Equal\", 'message: myTest(\"bob\") should return \"Not Equal\"');", "assert(editor.getValue().match(/val\\s*!=\\s*\\d+/g).length > 0, 'message: You should use the != operator');" ], "challengeSeed": [ "// Setup", "function myTest(val) {", " if (val) { // Change this line", " return \"Not Equal\";", " }", " return \"Equal\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val != 99) {", " return \"Not Equal\";", " }", " return \"Equal\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d3", "title": "Comparison with the Strict Inequality Operator", "description": [ "The inequality operator (!==) is the opposite of the strict equality operator. It means \"Strictly Not Equal\" and returns false where strict equality would return true and vice versa. Strict inequality will not convert types.", "Examples
3 !== 3 // false
3 !== '3' // true
4 !== 3 // true
", "

Instructions

", "Add the strict inequality operator to the if statement so the function will return \"Not Equal\" when val is not strictly equal to 17" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(17) === \"Equal\", 'message: myTest(17) should return \"Equal\"');", "assert(myTest(\"17\") === \"Not Equal\", 'message: myTest(\"17\") should return \"Not Equal\"');", "assert(myTest(12) === \"Not Equal\", 'message: myTest(12) should return \"Not Equal\"');", "assert(myTest(\"bob\") === \"Not Equal\", 'message: myTest(\"bob\") should return \"Not Equal\"');", "assert(editor.getValue().match(/val\\s*!==\\s*\\d+/g).length > 0, 'message: You should use the !== operator');" ], "challengeSeed": [ "// Setup", "function myTest(val) {", " // Only Change Code Below this Line", " ", " if (val) {", "", " // Only Change Code Above this Line", "", " return \"Not Equal\";", " }", " return \"Equal\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val != 17) {", " return \"Not Equal\";", " }", " return \"Equal\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d4", "title": "Comparison with the Greater Than Operator", "description": [ "The greater than operator (>) compares the values of two numbers. If the number to the left is greater than the number to the right, it returns true. If the number on the left is less than or equal to the number on the right, it returns false. Like the equality operator, greater than converts data types.", "Examples
5 > 3 // true
7 > '3' // true
2 > 3 // false
'1' > 9 // false
", "

Instructions

", "Add the greater than operator to the indicated lines so that the return statements make sense." ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(0) === \"10 or Under\", 'message: myTest(0) should return \"10 or Under\"');", "assert(myTest(10) === \"10 or Under\", 'message: myTest(10) should return \"10 or Under\"');", "assert(myTest(11) === \"Over 10\", 'message: myTest(11) should return \"Over 10\"');", "assert(myTest(99) === \"Over 10\", 'message: myTest(99) should return \"Over 10\"');", "assert(myTest(100) === \"Over 10\", 'message: myTest(100) should return \"Over 10\"');", "assert(myTest(101) === \"Over 100\", 'message: myTest(101) should return \"Over 100\"');", "assert(myTest(150) === \"Over 100\", 'message: myTest(150) should return \"Over 100\"');\nassert(editor.getValue().match(/val\\s*>\\s*\\d+/g).length > 1, 'message: You should use the > operator at least twice');" ], "challengeSeed": [ "function myTest(val) {", " if (val) { // Change this line", " return \"Over 100\";", " }", " ", " if (val) { // Change this line", " return \"Over 10\";", " }", "", " return \"10 or Under\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val > 100) { // Change this line", " return \"Over 100\";", " }", " if (val > 10) { // Change this line", " return \"Over 10\";", " }", " return \"10 or Under\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d5", "title": "Comparison with the Greater Than Equal To Operator", "description": [ "The greater than equal to operator (>=) compares the values of two numbers. If the number to the left is greater than or equal the number to the right, it returns true. If the number on the left is less than the number on the right, it returns false. Like the equality operator, greater than equal to converts data types.", "Examples
6 >= 6 // true
7 >= '3' // true
2 >= 3 // false
'7' >= 9 // false
", "

Instructions

", "Add the greater than equal to operator to the indicated lines so that the return statements make sense." ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(0) === \"9 or Under\", 'message: myTest(0) should return \"9 or Under\"');", "assert(myTest(9) === \"9 or Under\", 'message: myTest(9) should return \"9 or Under\"');", "assert(myTest(10) === \"10 or Over\", 'message: myTest(10) should return \"10 or Over\"');", "assert(myTest(11) === \"10 or Over\", 'message: myTest(10) should return \"10 or Over\"');", "assert(myTest(19) === \"10 or Over\", 'message: myTest(19) should return \"10 or Over\"');", "assert(myTest(20) === \"20 or Over\", 'message: myTest(100) should return \"20 or Over\"');", "assert(myTest(21) === \"20 or Over\", 'message: myTest(101) should return \"20 or Over\"');", "assert(editor.getValue().match(/val\\s*>=\\s*\\d+/g).length > 1, 'message: You should use the >= operator at least twice');" ], "challengeSeed": [ "function myTest(val) {", " if (val) { // Change this line", " return \"20 or Over\";", " }", " ", " if (val) { // Change this line", " return \"10 or Over\";", " }", "", " return \"9 or Under\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d6", "title": "Comparison with the Less Than Operator", "description": [ "The less than operator (<) compares the values of two numbers. If the number to the left is less than the number to the right, it returns true. If the number on the left is greater than or equal to the number on the right, it returns false. Like the equality operator, less than converts data types.", "Examples
2 < 5 // true
'3' < 7 // true
5 < 5 // false
3 < 2 // false
'8' < 4 // false
", "

Instructions

", "Add the less than operator to the indicated lines so that the return statements make sense." ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(0) === \"Under 25\", 'message: myTest(0) should return \"Under 25\"');", "assert(myTest(24) === \"Under 25\", 'message: myTest(24) should return \"Under 25\"');", "assert(myTest(25) === \"Under 55\", 'message: myTest(25) should return \"Under 55\"');", "assert(myTest(54) === \"Under 55\", 'message: myTest(54) should return \"Under 55\"');", "assert(myTest(55) === \"55 or Over\", 'message: myTest(55) should return \"55 or Over\"');", "assert(myTest(99) === \"55 or Over\", 'message: myTest(99) should return \"55 or Over\"');", "assert(editor.getValue().match(/val\\s*<\\s*\\d+/g).length > 1, 'message: You should use the < operator at least twice');" ], "challengeSeed": [ "function myTest(val) {", " if (val) { // Change this line", " return \"Under 25\";", " }", " ", " if (val) { // Change this line", " return \"Under 55\";", " }", "", " return \"55 or Over\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d7", "title": "Comparison with the Less Than Equal To Operator", "description": [ "The less than equal to operator (<=) compares the values of two numbers. If the number to the left is less than or equl the number to the right, it returns true. If the number on the left is greater than the number on the right, it returns false. Like the equality operator, less than equal to converts data types.", "Examples
4 <= 5 // true
'7' <= 7 // true
5 <= 5 // true
3 <= 2 // false
'8' <= 4 // false
", "

Instructions

", "Add the less than equal to operator to the indicated lines so that the return statements make sense." ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(0) === \"Smaller Than 12\", 'message: myTest(0) should return \"Smaller Than 12\"');", "assert(myTest(11) === \"Smaller Than 12\", 'message: myTest(11) should return \"Smaller Than 12\"');", "assert(myTest(12) === \"Smaller Than 24\", 'message: myTest(12) should return \"Smaller Than 24\"');", "assert(myTest(23) === \"Smaller Than 24\", 'message: myTest(23) should return \"Smaller Than 24\"');", "assert(myTest(24) === \"25 or More\", 'message: myTest(24) should return \"24 or More\"');", "assert(myTest(55) === \"25 or More\", 'message: myTest(55) should return \"24 or More\"');", "assert(editor.getValue().match(/val\\s*<=\\s*\\d+/g).length > 1, 'message: You should use the <= operator at least twice');" ], "challengeSeed": [ "function myTest(val) {", " if (val) { // Change this line", " return \"Smaller Than 12\";", " }", " ", " if (val) { // Change this line", " return \"Smaller Than 24\";", " }", "", " return \"25 or More\";", "}", "", "// Change this value to test", "myTest(10);", "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d8", "title": "Comparisons with the Logical And Operator", "description": [ "Sometimes you will need to test more than one thing at a time. The logical and operator (&&) returns true if and only if the operands to the left and right of it are true.", "The same effect could be achieved by nesting an if statement inside another if:", "
if (num < 10) {
if (num > 5) {
return \"Yes\";
}
}
return \"No\";
Will only return \"Yes\" if num is between 6 and 9. The same logic can be written as:
if (num < 10 && num > 5) {
return \"Yes\";
}
return \"No\";
", "

Instructions

", "Combine the two if statements into one statement which returns \"Yes\" if val is less than or equal to 50 and greater than or equal to 25. Otherwise, return \"No\"." ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/&&/g).length === 1, 'message: You should use the && operator once');", "assert(editor.getValue().match(/if/g).length === 1, 'message: You should only have one if statement');", "assert(myTest(0) === \"No\", 'message: myTest(0) should return \"No\"');", "assert(myTest(24) === \"No\", 'message: myTest(24) should return \"No\"');", "assert(myTest(25) === \"Yes\", 'message: myTest(25) should return \"Yes\"');", "assert(myTest(49) === \"Yes\", 'message: myTest(30) should return \"Yes\"');", "assert(myTest(50) === \"Yes\", 'message: myTest(50) should return \"Yes\"');", "assert(myTest(51) === \"No\", 'message: myTest(51) should return \"No\"');", "assert(myTest(75) === \"No\", 'message: myTest(75) should return \"No\"');", "assert(myTest(51) === \"No\", 'message: myTest(51) should return \"No\"');" ], "challengeSeed": [ "function myTest(val) {", " // Only change code below this line", "", " if (val) {", " if (val) {", " return \"Yes\";", "\t }", " }", "", " // Only change code above this line", " return \"No\";", "}", "", "// Change this value to test", "myTest(10);" ], "solutions": [ "function myTest(val) {", " if (val >= 25 && val <= 50) {", " return \"Yes\";", " }", " return \"No\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244d9", "title": "Comparisons with the Logical Or Operator", "description": [ "The logical or operator (||) returns true if either ofoperands is true, or false if neither is true.", "The pattern below should look familiar from prior waypoints:", "
if (num > 10) {
return \"No\";
}
if (num < 5) {
return \"No\";
}
return \"Yes\";
Will only return \"Yes\" if num is between 5 and 10. The same logic can be written as:
if (num > 10 || num < 5) {
return \"No\";
}
return \"Yes\";
", "

Instructions

", "Combine the two if statements into one statement which returns \"Inside\" if val is between 10 and 20, inclusive. Otherwise, return \"Outside\"." ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/\\|\\|/g).length === 1, 'message: You should use the || operator once');", "assert(editor.getValue().match(/if/g).length === 1, 'message: You should only have one if statement');", "assert(myTest(0) === \"Outside\", 'message: myTest(0) should return \"Outside\"');", "assert(myTest(9) === \"Outside\", 'message: myTest(9) should return \"Outside\"');", "assert(myTest(10) === \"Inside\", 'message: myTest(10) should return \"Inside\"');", "assert(myTest(15) === \"Inside\", 'message: myTest(15) should return \"Inside\"');", "assert(myTest(19) === \"Inside\", 'message: myTest(19) should return \"Inside\"');", "assert(myTest(20) === \"Inside\", 'message: myTest(20) should return \"Inside\"');", "assert(myTest(21) === \"Outside\", 'message: myTest(21) should return \"Outside\"');", "assert(myTest(25) === \"Outside\", 'message: myTest(25) should return \"Outside\"');" ], "challengeSeed": [ "function myTest(val) {", " // Only change code below this line", "", " if (val) {", " return \"Outside\";", " }", "", " if (val) {", " return \"Outside\";", " }", "", " // Only change code above this line", " return \"Inside\";", "}", "", "// Change this value to test", "myTest(15);" ], "solutions": [ "function myTest(val) {", " if (val < 10 || val > 20) {", " return \"Outside\";", " }", " return \"Inside\";", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "5664820f61c48e80c9fa476c", "title": "Golf Code", "description": [ "In the game of golf each hole has a par for the average number of strokes needed to sink the ball. Depending on how far above or below par your stokes are, there is a different nickname.", "Your function will be passed a par and strokes. Return strings according to this table:", "
StokesReturn
1\"Hole-in-one!\"
<= par - 2\"Eagle\"
par - 1\"Birdie\"
par\"Par\"
par + 1\"Bogey\"
par + 2\"Double Bogey\"
>= par + 3\"Go Home!\"
", "par and strokes will always be numeric and positive." ], "releasedOn": "11/27/2015", "tests": [ "assert(golfScore(4, 1) === \"Hole-in-one!\", 'message: golfScore(4, 1) should return \"Hole-in-one!\"');", "assert(golfScore(4, 2) === \"Eagle\", 'message: golfScore(4, 2) should return \"Eagle\"');", "assert(golfScore(5, 2) === \"Eagle\", 'message: golfScore(4, 2) should return \"Eagle\"');", "assert(golfScore(4, 3) === \"Birdie\", 'message: golfScore(4, 3) should return \"Birdie\"');", "assert(golfScore(4, 4) === \"Par\", 'message: golfScore(4, 4) should return \"Par\"');", "assert(golfScore(5, 5) === \"Par\", 'message: golfScore(5, 5) should return \"Par\"');", "assert(golfScore(4, 5) === \"Bogey\", 'message: golfScore(4, 5) should return \"Bogey\"');", "assert(golfScore(4, 6) === \"Double Bogey\", 'message: golfScore(4, 6) should return \"Double Bogey\"');", "assert(golfScore(4, 7) === \"Go Home!\", 'message: golfScore(4, 7) should return \"Go Home!\"');", "assert(golfScore(5, 9) === \"Go Home!\", 'message: golfScore(5, 9) should return \"Go Home!\"');" ], "challengeSeed": [ "function golfScore(par, strokes) {", " // Only change code below this line", "", " ", " return \"Change Me\";", " // Only change code above this line", "}", "", "// Change these values to test", "golfScore(5, 4);" ], "solutions": [ "function golfScore(par, strokes) {", " if (strokes === 1) {", " return \"Hole-in-one!\";", " }", " ", " if (strokes <= par - 2) {", " return \"Eagle\";", " }", " ", " if (strokes === par - 1) {", " return \"Birdie\";", " }", " ", " if (strokes === par) {", " return \"Par\";", " }", " ", " if (strokes === par + 1) {", " return \"Bogey\";", " }", " ", " if(strokes === par + 2) {", " return \"Double Bogey\";", " }", " ", " return \"Go Home!\";", "}" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244da", "title": "Introducing Else Statements", "description": [ "When a condition for an if statement is true, the block of code following it is executed. What about when that condition is false? Normally nothing would happen. With an else statement, an alternate block of code can be executed.", "
if (num > 10) {
return \"Bigger than 10\";
} else {
return \"10 or Less\";
}
", "

Instructions

", "Combine the if statements into a single statement." ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/if/g).length === 1, 'message: You should only have one if statement');", "assert(/else/g.test(editor.getValue()), 'message: You should use an else statement');", "assert(myTest(4) === \"5 or Smaller\", 'message: myTest(4) should return \"5 or Smaller\"');", "assert(myTest(5) === \"5 or Smaller\", 'message: myTest(5) should return \"5 or Smaller\"');", "assert(myTest(6) === \"Bigger than 5\", 'message: myTest(6) should return \"Bigger than 5\"');", "assert(myTest(10) === \"Bigger than 5\", 'message: myTest(10) should return \"Bigger than 5\"');", "assert(/var result = \"\";/.test(editor.getValue()) && /return result;/.test(editor.getValue()), 'message: Do not change the code above or below the lines.');" ], "challengeSeed": [ "function myTest(val) {", " var result = \"\";", " // Only change code below this line", "", " if(val > 5) {", " result = \"Bigger than 5\";", " }", " ", " if(val <= 5) {", " result = \"5 or Smaller\";", " }", " ", " // Only change code above this line", " return result;", "}", " ", "// Change this value to test", "myTest(4);", "" ], "solutions": [ "function myTest(val) {", " var result = \"\";", " if(val > 5) {", " result = \"Bigger than 5\";", " } else {", " result = \"5 or Smaller\";", " }", " return result;", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244db", "title": "Introducing Else If Statements", "description": [ "If you have multiple conditions that need to be met, you can chain if statements together with else if statements.", "
if (num > 15) {
return \"Bigger then 15\";
} else if (num < 5) {
return \"Smaller than 5\";
} else {
return \"Between 5 and 15\";
}
", "

Instructions

Convert the logic to use else if statements." ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/else/g).length > 1, 'message: You should have at least two else statements');", "assert(editor.getValue().match(/if/g).length > 1, 'message: You should have at least two if statements');", "assert(myTest(0) === \"Smaller than 5\", 'message: myTest(4) should return \"Smaller than 5\"');", "assert(myTest(5) === \"Between 5 and 10\", 'message: myTest(5) should return \"Smaller than 5\"');", "assert(myTest(7) === \"Between 5 and 10\", 'message: myTest(7) should return \"Between 5 and 10\"');", "assert(myTest(10) === \"Between 5 and 10\", 'message: myTest(10) should return \"Between 5 and 10\"');", "assert(myTest(12) === \"10 or Bigger\", 'message: myTest(12) should return \"10 or Bigger\"');" ], "challengeSeed": [ "function myTest(val) {", " if(val > 10) {", " return \"10 or Bigger\";", " }", " ", " if(val < 5) {", " return \"Smaller than 5\";", " }", " ", " return \"Between 5 and 10\";", "}", " ", "// Change this value to test", "myTest(7);", "" ], "solutions": [ "function myTest(val) {", " if(val > 10) {", " return \"10 or Bigger\";", " } else if(val < 5) {", " return \"Smaller than 5\";", " } else {", " return \"Between 5 and 10\";", " }", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244dc", "title": "Chaining If/Else Statements", "description": [ "if...else if statements can be chained together for complex logic. Here is pseudocode of multiple chained if/else if statements:", "
if(condition1) {
statement1
} else if (condition1) {
statement1
} else if (condition3) {
statement3
. . .
} else {
statementN
}
", "

Instructions

", "Write chained if/else if statements to fulfill the following conditions:", "num < 5 - return \"Tiny\"
num < 10 - return \"Small\"
num < 15 - return \"Medium\"
num < 20 - return \"Large\"
num >= 20 - return \"Huge\"" ], "releasedOn": "11/27/2015", "tests": [ "assert(editor.getValue().match(/else/g).length > 3, 'message: You should have at least four else statements');", "assert(editor.getValue().match(/if/g).length > 3, 'message: You should have at least four if statements');", "assert(editor.getValue().match(/return/g).length === 5, 'message: You should have five return statements');", "assert(myTest(0) === \"Tiny\", 'message: myTest(0) should return \"Tiny\"');", "assert(myTest(4) === \"Tiny\", 'message: myTest(4) should return \"Tiny\"');", "assert(myTest(5) === \"Small\", 'message: myTest(5) should return \"Small\"');", "assert(myTest(8) === \"Small\", 'message: myTest(8) should return \"Small\"');", "assert(myTest(10) === \"Medium\", 'message: myTest(10) should return \"Medium\"');", "assert(myTest(14) === \"Medium\", 'message: myTest(14) should return \"Medium\"');", "assert(myTest(15) === \"Large\", 'message: myTest(15) should return \"Large\"');", "assert(myTest(17) === \"Large\", 'message: myTest(17) should return \"Large\"');", "assert(myTest(20) === \"Huge\", 'message: myTest(20) should return \"Huge\"');", "assert(myTest(25) === \"Huge\", 'message: myTest(25) should return \"Huge\"');" ], "challengeSeed": [ "function myTest(num) {", " // Only change code below this line", "", "", " return \"Change Me\";", " // Only change code above this line", "}", "", "// Change this value to test", "myTest(7);" ], "solutions": [ "function myTest(num) {", " if (num < 5) {", " return \"Tiny\";", " } else if (num < 10) {", " return \"Small\";", " } else if (num < 15) {", " return \"Medium\";", " } else if (num < 20) {", " return \"Large\";", " } else {", " return \"Huge\";", " }", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244dd", "title": "Selecting from many options with Switch Statements", "description": [ "If you have many options to choose from use a switch statement A switch statement tests a value and has many case statements which define that value can be, shown here in pseudocode:", "
switch (num) {
case value1:
statement1
break;
value2:
statement2;
break;
...
valueN:
statementN;
}
", "case values are tested with strict equality (===). The break tells Javascript to stop executing statements. If the break is omitted, the next statement will be executed.", "

Instructions

", "Write a switch statement to set answer for the following conditions:
1 - \"alpha\"
2 - \"beta\"
3 - \"gamma\"
4 - \"delta\"" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(1) === \"alpha\", 'message: myTest(1) should have a value of \"alpha\"');", "assert(myTest(2) === \"beta\", 'message: myTest(2) should have a value of \"beta\"');", "assert(myTest(3) === \"gamma\", 'message: myTest(3) should have a value of \"gamma\"');", "assert(myTest(4) === \"delta\", 'message: myTest(4) should have a value of \"delta\"');", "assert(!/else/g.test(editor.getValue()) || !/if/g.test(editor.getValue()), 'message: You should not use any if or else statements');", "assert(editor.getValue().match(/break/g).length > 2, 'message: You should have at least 3 break statements');" ], "challengeSeed": [ "function myTest(val) {", " var answer = \"\";", " // Only change code below this line", " ", " ", "", " // Only change code above this line ", " return answer; ", "}", "", "// Change this value to test", "myTest(1);", "" ], "solutions": [ "function myTest(val) {", " var answer = \"\";", "", " switch (val) {", " case 1:", " answer = \"alpha\";", " break;", " case 2:", " answer = \"beta\";", " break;", " case 3:", " answer = \"gamma\";", " break;", " case 4:", " answer = \"delta\";", " }", " return answer; ", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244de", "title": "Adding a default option in Switch statements", "description": [ "In a switch statement you may not be able to specify all possible values as case statements. Instead, you can use the default statement where a case would go. Think of it like an else statement for switch.", "A default statement should be the last \"case\" in the list.", "
switch (num) {
case value1:
statement1
break;
value2:
statement2;
break;
...
default:
defaultStatement;
}
", "

Instructions

", "Write a switch statement to set answer for the following conditions:
\"a\" - \"apple\"
\"b\" - \"bird\"
\"c\" - \"cat\"
default - \"stuff\"" ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(\"a\") === \"apple\", 'message: myTest(\"a\") should have a value of \"apple\"');", "assert(myTest(\"b\") === \"bird\", 'message: myTest(\"b\") should have a value of \"bird\"');", "assert(myTest(\"c\") === \"cat\", 'message: myTest(\"c\") should have a value of \"cat\"');", "assert(myTest(\"d\") === \"stuff\", 'message: myTest(\"d\") should have a value of \"stuff\"');", "assert(myTest(4) === \"stuff\", 'message: myTest(4) should have a value of \"stuff\"');", "assert(!/else/g.test(editor.getValue()) || !/if/g.test(editor.getValue()), 'message: You should not use any if or else statements');", "assert(editor.getValue().match(/break/g).length > 2, 'message: You should have at least 3 break statements');" ], "challengeSeed": [ "function myTest(val) {", " var answer = \"\";", " // Only change code below this line", " ", " ", "", " // Only change code above this line ", " return answer; ", "}", "", "// Change this value to test", "myTest(1);", "" ], "solutions": [ "function myTest(val) {", " var answer = \"\";", "", " switch(val) {", " case \"a\":", " answer = \"apple\";", " break;", " case \"b\":", " answer = \"bird\";", " break;", " case \"c\":", " answer = \"cat\";", " break;", " default:", " answer = \"stuff\";", " }", " return answer; ", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244df", "title": "Multiple Identical Options in Switch Statements", "description": [ "If the break statement is ommitted from a switch statement case, the following case statement(s). If you have mutiple inputs with the same output, you can represent them in a switch statement like this:", "
switch(val) {
case 1:
case 2:
case 3:
result = \"1, 2, or 3\";
break;
case 4:
result = \"4 alone\";
}
", "Cases for 1, 2, and 3 will all produce the same result.", "

Instructions

", "Write a switch statement to set answer for the following ranges:
1-3 - \"Low\"
4-6 - \"Mid\"
7-9 - \"High\"", "Note
You will need to have a case statement for each number in the range." ], "releasedOn": "11/27/2015", "tests": [ "assert(myTest(1) === \"Low\", 'message: myTest(1) should return \"Low\"');", "assert(myTest(2) === \"Low\", 'message: myTest(2) should return \"Low\"');", "assert(myTest(3) === \"Low\", 'message: myTest(3) should return \"Low\"');", "assert(myTest(4) === \"Mid\", 'message: myTest(4) should return \"Mid\"');", "assert(myTest(5) === \"Mid\", 'message: myTest(5) should return \"Mid\"');", "assert(myTest(6) === \"Mid\", 'message: myTest(6) should return \"Mid\"');", "assert(myTest(7) === \"High\", 'message: myTest(7) should return \"High\"');", "assert(myTest(8) === \"High\", 'message: myTest(8) should return \"High\"');", "assert(myTest(9) === \"High\", 'message: myTest(9) should return \"High\"');", "assert(!/else/g.test(editor.getValue()) || !/if/g.test(editor.getValue()), 'message: You should not use any if or else statements');", "assert(editor.getValue().match(/case/g).length === 9, 'message: You should have nine case statements');" ], "challengeSeed": [ "function myTest(val) {", " var answer = \"\";", " // Only change code below this line", " ", " ", "", " // Only change code above this line ", " return answer; ", "}", "", "// Change this value to test", "myTest(1);", "" ], "solutions": [ "function myTest(val) {", " var answer = \"\";", " ", " switch (val) {", " case 1:", " case 2:", " case 3:", " answer = \"Low\";", " break;", " case 4:", " case 5:", " case 6:", " answer = \"Mid\";", " break;", " case 7:", " case 8:", " case 9:", " answer = \"High\";", " }", " ", " return answer; ", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244e0", "title": "Replacing If/Else chains with Switch", "description": [ "If you have many options to choose from, a switch statement can be easier to write than many chained if/if else statements. The following:", "
if(val === 1) {
answer = \"a\";
} else if(val === 2) {
answer = \"b\";
} else {
answer = \"c\";
}
", "can be replaced with:", "
switch (val) {
case 1:
answer = \"a\";
break;
case 2:
answer = \"b\";
break;
default:
answer = \"c\";
}
", "

Instructions

", "Change the chained if/if else statements into a switch statement." ], "releasedOn": "11/27/2015", "tests": [ "assert(!/else/g.test(editor.getValue()), 'message: You should not use any else statements');", "assert(!/if/g.test(editor.getValue()), 'message: You should not use any if statements');", "assert(editor.getValue().match(/break/g).length === 4, 'message: You should have four break statements');", "assert(myTest(\"bob\") === \"Marley\", 'message: myTest(\"bob\") should be \"Marley\"');", "assert(myTest(42) === \"The Answer\", 'message: myTest(42) should be \"The Answer\"');", "assert(myTest(1) === \"There is no #1\", 'message: myTest(1) should be \"There is no #1\"');", "assert(myTest(99) === \"Missed me by this much!\", 'message: myTest(99) should be \"Missed me by this much!\"');", "assert(myTest(7) === \"Ate Nine\", 'message: myTest(7) should be \"Ate Nine\"');" ], "challengeSeed": [ "function myTest(val) {", " var answer = \"\";", " // Only change code below this line", " ", " if(val === \"bob\") {", " answer = \"Marley\";", " } else if(val === 42) {", " answer = \"The Answer\";", " } else if(val === 1) {", " answer = \"There is no #1\";", " } else if(val === 99) {", " answer = \"Missed me by this much!\";", " } else if(val === 7) {", " answer = \"Ate Nine\";", " }", "", " // Only change code above this line ", " return answer; ", "}", "", "// Change this value to test", "myTest(7);", "" ], "solutions": [ "function myTest(val) {", " var answer = \"\";", "", " switch (val) {", " case \"bob\":", " answer = \"Marley\";", " break;", " case 42:", " answer = \"The Answer\";", " break;", " case 1:", " answer = \"There is no #1\";", " break;", " case 99:", " answer = \"Missed me by this much!\";", " break;", " case 7:", " answer = \"Ate Nine\";", " }", " return answer; ", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "5679ceb97cbaa8c51670a16b", "title": "Returning Boolean Values from Functions", "description": [ "You may recall from Comparison with the Equality Operator that all comparison operators return a boolean true or false value.", "A common anti-pattern is to use an if/else statement to do a comparison and then return true/false:", "
function isEqual(a,b) {
if(a === b) {
return true;
} else {
return false;
}
}
", "Since === returns true or false, we can simply return the result of the comparion:", "
function isEqual(a,b) {
return a === b;
}
", "

Instructions

", "Fix the function isLess to remove the if/else statements." ], "releasedOn": "11/27/2015", "tests": [ "assert(isLess(10,15) === true, 'message: isLess(10,15) should return true');", "assert(isLess(15, 10) === false, 'message: isLess(15,10) should return true');", "assert(!/if|else/g.test(editor.getValue()), 'message: You should not use any if or else statements');" ], "challengeSeed": [ "function isLess(a, b) {", " // Fix this code", " if(a < b) {", " return true;", " } else {", " return false;", " }", "}", "", "// Change these values to test", "isLess(10, 15);" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c4", "title": "Return Early Pattern for Functions", "description": [ "When a return statement is reached, the execution of the current function stops at that point. " ], "releasedOn": "11/27/2015", "tests": [ "assert(1===1, 'message: message here');" ], "challengeSeed": [ "", "", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c5", "title": "Optional Arguments for Functions", "description": [ "" ], "releasedOn": "11/27/2015", "tests": [ "assert(1===1, 'message: message here');" ], "challengeSeed": [ "", "", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "565bbe00e9cc8ac0725390f4", "title": "Counting Cards", "description": [ "In the casino game Blackjack, a player can gain an advantage over the house by keeping track of the relative number of high and low cards remaining in the deck. This is called Card Counting. ", "Having more high cards remaining in the deck favors the player. Each card is assigned a value according to the table below. When the count is positive, the player should bet high. When the count is zero or negative, the player should bet low.", "
ValueCards
+12, 3, 4, 5, 6
07, 8, 9
-110, 'J', 'Q', 'K','A'
", "You will write a card counting function. It will recieve a card parameter and increment or decrement the global count variable according to the card's value (see table). The function will then return the current count and the string \"Bet\" if the count if positive, or \"Hold\" if the count is zero or negative.", "Example Output", "-3 Hold
5 Bet" ], "releasedOn": "11/27/2015", "tests": [ "assert((function(){ count = 0; cc(2);cc(3);cc(4);cc(5);var out = cc(6); if(out === \"5 Bet\") {return true;} return false; })(), 'message: Cards Sequence 2, 3, 4, 5, 6 should return \"5 Bet\"');", "assert((function(){ count = 0; cc(7);cc(8);var out = cc(9); if(out === \"0 Hold\") {return true;} return false; })(), 'message: Cards Sequence 7, 8, 9 should return \"0 Hold\"');", "assert((function(){ count = 0; cc(10);cc('J');cc('Q');cc('K');var out = cc('A'); if(out === \"-5 Hold\") {return true;} return false; })(), 'message: Cards Sequence 10, J, Q, K, A should return \"-5 Hold\"');", "assert((function(){ count = 0; cc(3);cc(2);cc('A');cc(10);var out = cc('K'); if(out === \"-1 Hold\") {return true;} return false; })(), 'message: Cards Sequence 3, 2, A, 10, K should return \"-1 Hold\"');" ], "challengeSeed": [ "var count = 0;", "", "function cc(card) {", " // Only change code below this line", "", "", " return \"Change Me\";", " // Only change code above this line", "}", "", "// Add/remove calls to test your function. ", "// Note: Only the last will display", "cc(2); cc(3); cc(7); cc('K'); cc('A');" ], "solutions": [ "var count = 0;", "function cc(card) {", " switch(card) {", " case 2:", " case 3:", " case 4:", " case 5:", " case 6:", " count++;", " break;", " case 10:", " case 'J':", " case 'Q':", " case 'K':", " case 'A':", " count--;", " }", " if(count > 0) {", " return count + \" Bet\";", " } else {", " return count + \" Hold\";", " }", "}" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bg9998c9c99feddfaeb9bdef", "title": "Build JavaScript Objects", "description": [ "You may have heard the term object before.", "Objects are similar to arrays, except that instead of using indexes to access and modify their data, you access the data in objects through what are called properties.", "Here's a sample object:", "
var cat = {
\"name\": \"Whiskers\",
\"legs\": 4,
\"tails\": 1,
\"enemies\": [\"Water\", \"Dogs\"]
};
", "Objects are useful for storing data in a structured way, and can represent real world objects, like a cat.", "

Instructions

", "Make an object that represents a dog called myDog which contains the properties \"name\" (a string), \"legs\", \"tails\" and \"friends\".", "You can set these object properties to whatever values you want, as long \"name\" is a string, \"legs\" and \"tails\" are numbers, and \"friends\" is an array." ], "tests": [ "assert((function(z){if(z.hasOwnProperty(\"name\") && z.name !== undefined && typeof(z.name) === \"string\"){return true;}else{return false;}})(myDog), 'message: myDog should contain the property name and it should be a string.');", "assert((function(z){if(z.hasOwnProperty(\"legs\") && z.legs !== undefined && typeof(z.legs) === \"number\"){return true;}else{return false;}})(myDog), 'message: myDog should contain the property legs and it should be a number.');", "assert((function(z){if(z.hasOwnProperty(\"tails\") && z.tails !== undefined && typeof(z.tails) === \"number\"){return true;}else{return false;}})(myDog), 'message: myDog should contain the property tails and it should be a number.');", "assert((function(z){if(z.hasOwnProperty(\"friends\") && z.friends !== undefined && Array.isArray(z.friends)){return true;}else{return false;}})(myDog), 'message: myDog should contain the property friends and it should be an array.');" ], "challengeSeed": [ "// Example", "var ourDog = {", " \"name\": \"Camper\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"everything!\"]", "};", "", "// Only change code below this line.", "", "var myDog = {", "", "", "", "", "};" ], "tail": [ "(function(z){return z;})(myDog);" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244c7", "title": "Accessing Objects Properties with the Dot Operator", "description": [ "There are two ways to access the properties of an object: the dot operator (.) and bracket notation ([]), similar to an array.", "The dot operator is what you use when you know the name of the property you're trying to access ahead of time.", "Here is a sample of using the . to read an object property:", "
var myObj = {
prop1: \"val1\",
prop2: \"val2\"
};
myObj.prop1; // val1
myObj.prop2; // val2
", "

Instructions

", "Read the values of the properties hat and shirt of testObj using dot notation." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof hatValue === 'string' , 'message: hatValue should be a string');", "assert(hatValue === 'ballcap' , 'message: The value of hatValue should be \"ballcap\"');", "assert(typeof shirtValue === 'string' , 'message: shirtValue should be a string');", "assert(shirtValue === 'jersey' , 'message: The value of shirtValue should be \"jersey\"');\nassert(editor.getValue().match(/testObj\\.\\w+/g).length > 1, 'message: You should use dot notation twice');" ], "challengeSeed": [ "// Setup", "var testObj = {", " \"hat\": \"ballcap\",", " \"shirt\": \"jersey\",", " \"shoes\": \"cleats\"", "};", "", "// Only change code below this line", "", "var hatValue = testObj; // Change this line", "var shirtValue = testObj; // Change this line" ], "tail": [ "(function(a,b) { return \"hatValue = '\" + a + \"', shirtValue = '\" + b + \"'\"; })(hatValue,shirtValue);" ], "solutions": [ "var testObj = {", " \"hat\": \"ballcap\",", " \"shirt\": \"jersey\",", " \"shoes\": \"cleats\"", "};", "", "var hatValue = testObj.hat; ", "var shirtValue = testObj.shirt;" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c8", "title": "Accessing Objects Properties with Bracket Notation", "description": [ "The second way to access the properties of an objectis bracket notation ([]). If the property of the object you are trying to access has a space in it, you will need to use bracket notation.", "Here is a sample of using bracket notation to read an object property:", "
var myObj = {
\"Space Name\": \"Kirk\",
\"More Space\": \"Spock\"
};
myObj[\"Space Name\"]; // Kirk
myObj['More Space']; // Spock
", "Note that property names with spaces in them must be in quotes (single or double).", "

Instructions

", "Read the values of the properties \"an entree\" and \"the drink\" of testObj using bracket notation." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof entreeValue === 'string' , 'message: entreeValue should be a string');", "assert(entreeValue === 'hamburger' , 'message: The value of entreeValue should be \"hamburger\"');", "assert(typeof drinkValue === 'string' , 'message: drinkValue should be a string');", "assert(drinkValue === 'water' , 'message: The value of drinkValue should be \"water\"');", "assert(editor.getValue().match(/testObj\\[('|\")[^'\"]+\\1\\]/g).length > 1, 'message: You should use bracket notation twice');" ], "challengeSeed": [ "// Setup", "var testObj = {", " \"an entree\": \"hamburger\",", " \"my side\": \"veggies\",", " \"the drink\": \"water\"", "};", "", "// Only change code below this line", "", "var entreeValue = testObj; // Change this line", "var drinkValue = testObj; // Change this line" ], "tail": [ "(function(a,b) { return \"entreeValue = '\" + a + \"', shirtValue = '\" + b + \"'\"; })(entreeValue,drinkValue);" ], "solutions": [ "var testObj = {", " \"an entree\": \"hamburger\",", " \"my side\": \"veggies\",", " \"the drink\": \"water\"", "};", "var entreeValue = testObj[\"an entree\"];", "var drinkValue = testObj['the drink'];" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244c9", "title": "Accessing Objects Properties with Variables", "description": [ "Another use of bracket notation on objects is to use a variable to access a property. This can be very useful for itterating through lists of object properties or for doing lookups.", "Here is an example of using a variable to access a property:", "
var someProp = \"propName\";
var myObj = {
propName: \"Some Value\"
}
myObj[someProp]; // \"Some Value\"
", "Note that we do not use quotes around the variable name when using it to access the property because we are using the value of the variable, not the name", "

Instructions

", "Use the playerNumber variable to lookup player 16 in testObj using bracket notation." ], "releasedOn": "11/27/2015", "tests": [ "assert(typeof playerNumber === 'number', 'message: playerNumber should be a number');", "assert(typeof player === 'string', 'message: The variable player should be a string');", "assert(player === 'Montana', 'message: The value of player should be \"Montana\"');", "assert(/testObj\\[\\s*playerNumber\\s*\\]/.test(editor.getValue()),'message: You should use bracket notation to access testObj');" ], "challengeSeed": [ "// Setup", "var testObj = {", " 12: \"Namath\",", " 16: \"Montana\",", " 19: \"Unitas\"", "};", "", "// Only change code below this line;", "", "var playerNumber; // Change this Line", "var player = testObj; // Change this Line" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "bg9999c9c99feddfaeb9bdef", "title": "Updating Object Properties", "description": [ "After you've created a JavaScript object, you can update its properties at any time just like you would update any other variable. You can use either dot or bracket notation to update.", "For example, let's look at ourDog:", "
var ourDog = {
\"name\": \"Camper\",
\"legs\": 4,
\"tails\": 1,
\"friends\": [\"everything!\"]
};
", "Since he's a particularly happy dog, let's change his name to \"Happy Camper\". Here's how we update his object's name property:", "ourDog.name = \"Happy Camper\"; or", "outDog[\"name\"] = \"Happy Camper\";", "Now when we evaluate ourDog.name, instead of getting \"Camper\", we'll get his new name, \"Happy Camper\".", "

Instructions

", "Update the myDog object's name property. Let's change her name from \"Coder\" to \"Happy Coder\". You can use either dot or bracket notation." ], "tests": [ "assert(/happy coder/gi.test(myDog.name), 'message: Update myDog's \"name\" property to equal \"Happy Coder\".');", "assert(/\"name\": \"Coder\"/.test(editor.getValue()), 'message: Do not edit the myDog definition');" ], "challengeSeed": [ "// Example", "var ourDog = {", " \"name\": \"Camper\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"everything!\"]", "};", "", "ourDog.name = \"Happy Camper\";", "", "// Setup", "var myDog = {", " \"name\": \"Coder\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"Free Code Camp Campers\"]", "};", "", "// Only change code below this line.", "", "" ], "tail": [ "(function(z){return z;})(myDog);" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9999c9c99feedfaeb9bdef", "title": "Add New Properties to a JavaScript Object", "description": [ "You can add new properties to existing JavaScript objects the same way you would modify them. ", "Here's how we would add a \"bark\" property to ourDog:", "ourDog.bark = \"bow-wow\"; ", "or", "ourDog[\"bark\"] = \"bow-wow\";", "Now when we evaluate ourDog.bark, we'll get his bark, \"bow-wow\".", "

Instructions

", "Add a \"bark\" property to myDog and set it to a dog sound, such as \"woof\". You may use either dot or bracket notation." ], "tests": [ "assert(myDog.bark !== undefined, 'message: Add the property \"bark\" to myDog.');", "assert(!/bark[^\\n]:/.test(editor.getValue()), 'message: Do not add \"bark\" to the setup section');" ], "challengeSeed": [ "// Example", "var ourDog = {", " \"name\": \"Camper\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"everything!\"]", "};", "", "ourDog.bark = \"bow-wow\";", "", "// Setup", "var myDog = {", " \"name\": \"Happy Coder\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"Free Code Camp Campers\"]", "};", "", "// Only change code below this line.", "" ], "tail": [ "(function(z){return z;})(myDog);" ], "solutions": [ "var myDog = {", " \"name\": \"Happy Coder\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"Free Code Camp Campers\"]", "};", "myDog.bark = \"Woof Woof\";" ], "type": "waypoint", "challengeType": "1" }, { "id": "bg9999c9c99fdddfaeb9bdef", "title": "Delete Properties from a JavaScript Object", "description": [ "We can also delete properties from objects like this:", "delete ourDog.bark;", "

Instructions

", "Delete the \"tails\" property from myDog. You may use either dot or bracket notation." ], "tests": [ "assert(myDog.tails === undefined, 'message: Delete the property \"tails\" from myDog.');", "assert(editor.getValue().match(/\"tails\": 1/g).length > 1, 'message: Do not modify the myDog setup');" ], "challengeSeed": [ "// Example", "var ourDog = {", " \"name\": \"Camper\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"everything!\"],", " \"bark\": \"bow-wow\"", "};", "", "delete ourDog.bark;", "", "// Setup", "var myDog = {", " \"name\": \"Happy Coder\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"Free Code Camp Campers\"],", " \"bark\": \"woof\"", "};", "", "// Only change code below this line.", "", "" ], "tail": [ "(function(z){return z;})(myDog);" ], "solutions": [ "// Setup", "var myDog = {", " \"name\": \"Happy Coder\",", " \"legs\": 4,", " \"tails\": 1,", " \"friends\": [\"Free Code Camp Campers\"],", " \"bark\": \"woof\"", "};", "delete myDog.tails;" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244ca", "title": "Using Objects for Lookups", "description": [ "Objects can be thought of as a key/value storage, like a dictonary. If you have tabular data, you can use an object to \"lookup\" values rather than a switch statement or an if...else chain. This is most useful when you know that your input data is limited to a certain range.", "Here is an example of a simple reverse alphabet lookup:", "
var alpha = {
1:\"Z\"
2:\"Y\"
3:\"X\"
...
4:\"W\"
24:\"C\"
25:\"B\"
26:\"A\"
};
alpha[2]; // \"Y\"
alpha[24]; // \"C\"
", "

Instructions

", "Convert the switch statement into a lookup table called lookup. Use it to lookup val and return the associated string." ], "releasedOn": "11/27/2015", "tests": [ "assert(numberLookup(0) === 'zero', 'message: numberLookup(0) should equal \"zero\"');", "assert(numberLookup(1) === 'one', 'message: numberLookup(1) should equal \"one\"');", "assert(numberLookup(2) === 'two', 'message: numberLookup(2) should equal \"two\"');", "assert(numberLookup(3) === 'three', 'message: numberLookup(3) should equal \"three\"');", "assert(numberLookup(4) === 'four', 'message: numberLookup(4) should equal \"four\"');", "assert(numberLookup(5) === 'five', 'message: numberLookup(5) should equal \"five\"');", "assert(numberLookup(6) === 'six', 'message: numberLookup(6) should equal \"six\"');", "assert(numberLookup(7) === 'seven', 'message: numberLookup(7) should equal \"seven\"');", "assert(numberLookup(8) === 'eight', 'message: numberLookup(8) should equal \"eight\"');", "assert(numberLookup(9) === 'nine', 'message: numberLookup(9) should equal \"nine\"');", "assert(!/case|switch|if/g.test(editor.getValue()), 'message: You should not use case, switch, or if statements');" ], "challengeSeed": [ "// Setup", "function numberLookup(val) {", " var result = \"\";", "", " // Only change code below this line", " switch(val) {", " case 0: ", " result = \"zero\";", " break;", " case 1: ", " result = \"one\";", " break;", " case 2: ", " result = \"two\";", " break;", " case 3: ", " result = \"three\";", " break;", " case 4: ", " result = \"four\";", " break;", " case 5: ", " result = \"five\";", " break;", " case 6: ", " result = \"six\";", " break;", " case 7: ", " result = \"seven\";", " break;", " case 8: ", " result = \"eight\";", " break;", " case 9: ", " result = \"nine\";", " break;", " }", "", " // Only change code above this line", " return result;", "}", "", "" ], "solutions": [ "function numberLookup(val) {", " var result = \"\";", "", " var lookup = {", " 0:\"zero\",", " 1:\"one\",", " 2:\"two\",", " 3:\"three\",", " 4:\"four\",", " 5:\"five\",", " 6:\"six\",", " 7:\"seven\",", " 8:\"eight\",", " 9:\"nine\"", " };", " result = lookup[val];", "", " return result;", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "567af2437cbaa8c51670a16c", "title": "Testing Objects for Properties", "description": [ "Sometimes it is useful to check of the property of a given object exists or not. We can use the .hasOwnProperty([propname]) method of objects to determine if that object has the given property name. .hasOwnProperty() returns true or false if the property is found or not.", "Example:", "
var myObj = {
top: \"hat\",
bottom: \"pants\"
};
myObj.hasOwnProperty(\"hat\"); // true
myObj.hasOwnProperty(\"middle\"); // false
", "

Instructions

", " Modify function checkObj to test myObj for checkProp. If the property is found, return that property's value. If not return \"Not Found\"." ], "tests": [ "assert(checkObj(\"gift\") === \"pony\", 'message: checkObj(\"gift\") should return \"pony\".');", "assert(checkObj(\"pet\") === \"kitten\", 'message: checkObj(\"gift\") should return \"kitten\".');", "assert(checkObj(\"house\") === \"Not Found\", 'message: checkObj(\"house\") should return \"Not Found\".');" ], "challengeSeed": [ "// Setup", "var myObj = {", " gift: \"pony\",", " pet: \"kitten\",", " bed: \"sleigh\"", "};", "", "function checkObj(checkProp) {", " // Your Code Here", "", " return \"Change Me!\";", "}", "", "// Test your code by modifying these values", "checkObj(\"gift\");" ], "tail": [ "" ], "solutions": [ "var myObj = {", " gift: \"pony\",", " pet: \"kitten\",", " bed: \"sleigh\"", "};", "function checkObj(checkProp) {", " if(myObj.hasOwnProperty(checkProp)) {", " return myObj[checkProp];", " } else {", " return \"Not Found\";", " }", "}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244cb", "title": "Introducing JavaScript Object Notation (JSON)", "description": [ "JavaScript Object Notation or JSON uses the format of Javascript Objects to store data. JSON is flexible becuase it allows for data structures with arbitrary combinations of strings, numbers, booleans, arrays, and objects. ", "Here is an example of a JSON object:", "
var ourMusic = [
{
\"artist\": \"Daft Punk\",
\"title\": \"Homework\",
\"release_year\": 1997,
\"formats\": [
\"CD\",
\"Cassette\",
\"LP\" ],
\"gold\": true
}
];
", "This is an array of objects and the object has various peices of metadata about an album. It also has a nested array of formats. Additional album records could be added to the top level array.", "

Instructions

", "Add a new album to the myMusic JSON object. Add artist and title strings, release_year year, and a formats array of strings." ], "releasedOn": "11/27/2015", "tests": [ "assert(Array.isArray(myMusic), 'message: myMusic should be an array');", "assert(myMusic.length > 1, 'message: myMusic should have at least two elements');", "assert(typeof myMusic[1] === 'object', 'message: myMusic[1] should be an object');", "assert(Object.keys(myMusic[1]).length > 3, 'message: myMusic[1] should have at least 4 properties');", "assert(myMusic[1].hasOwnProperty('artist') && typeof myMusic[1].artist === 'string', 'message: myMusic[1] should contain an artist property which is a string');", "assert(myMusic[1].hasOwnProperty('title') && typeof myMusic[1].title === 'string', 'message: myMusic[1] should contain a title property which is a string');", "assert(myMusic[1].hasOwnProperty('release_year') && typeof myMusic[1].release_year === 'number', 'message: myMusic[1] should contain a release_year property which is a number');", "assert(myMusic[1].hasOwnProperty('formats') && Array.isArray(myMusic[1].formats), 'message: myMusic[1] should contain a formats property which is an array');", "assert(typeof myMusic[1].formats[0] === 'string' && myMusic[1].formats.length > 1, 'message: formats should be an array of strings with at least two elements');" ], "challengeSeed": [ "var myMusic = [", " {", " \t\"artist\": \"Billy Joel\",", " \"title\": \"Piano Man\",", " \"release_year\": 1993,", " \"formats\": [ ", " \"CS\", ", " \"8T\", ", " \"LP\" ],", " \"gold\": true", " }", " // Add record here", "];", "" ], "tail": [ "(function(x){ if (Array.isArray(x)) { return JSON.stringify(x); } return \"myMusic is not an array\"})(myMusic);" ], "solutions": [ "var myMusic = [", " {", " \t\"artist\": \"Billy Joel\",", " \"title\": \"Piano Man\",", " \"release_year\": 1993,", " \"formats\": [ ", " \"CS\", ", " \"8T\", ", " \"LP\" ],", " \"gold\": true", " }, ", " {", " \"artist\": \"ABBA\",", " \"title\": \"Ring Ring\",", " \"release_year\": 1973,", " \"formats\": [ ", " \"CS\", ", " \"8T\", ", " \"LP\",", "\t \"CD\",", "\t]", " }", "}", " // Add record here", "];" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244cc", "title": "Accessing Nested Objects in JSON", "description": [ "The properties and sub-properties of JSON objects can be accessed by chaining together the dot or bracket notation.", "Here is a nested JSON Object:", "
var ourStorage = {
\"desk\": {
\"drawer\": \"stapler\"
},
\"cabinet\": {
\"top drawer\": {
\"folder1\": \"a file\",
\"folder2\": \"secrets\"
},
\"bottom drawer\": \"soda\"
}
}
ourStorage.cabinet[\"top drawer\"].folder2; // \"secrets\"
ourStoage.desk.drawer; // \"stapler\"
", "

Instructions

", "Access the myStorage JSON object to retrieve the contents of the glove box. Only use object notation for properties with a space in their name." ], "releasedOn": "11/27/2015", "tests": [ "assert(gloveBoxContents === \"maps\", 'message: gloveBoxContents should equal \"maps\"');", "assert(/=\\s*myStorage\\.car\\.inside\\[([\"'])glove box\\1\\]/.test(editor.getValue()), 'message: Use dot and bracket notation to access myStorage');" ], "challengeSeed": [ "// Setup", "var myStorage = {", " \"car\": {", " \"inside\": {", " \"glove box\": \"maps\",", " \"passenger seat\": \"crumbs\"", " },", " \"outside\": {", " \"trunk\": \"jack\"", " }", " }", "};", "", "// Only change code below this line", "", "var gloveBoxContents = \"\"; // Change this line", "" ], "tail": [ "(function(x) { if(typeof gloveBoxContents != 'undefined') { return \"gloveBoxContents = \", x} else return \"gloveBoxContents is undefined\";})(gloveBoxContents);" ], "solutions": [ "var myStorage = {", " \"car\": {", " \"inside\": {", " \"glove box\": \"maps\",", " \"passenger seat\": \"crumbs\"", " },", " \"outside\": {", " \"trunk\": \"jack\"", " }", " }", "};", "var gloveBoxContents = myStorage.car.inside['glove box']; // Change this line" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244cd", "title": "Accessing Nested Arrays in JSON", "description": [ "As we have seen in earlier examples, JSON objects can contain both nested objects and nested arrays. Similar to accessing nested objects, Array bracket notation can be chained to access nested arrays.", "Here is an example of how to access a nested array:", "
var ourPets = {
\"cats\": [
\"Meowzer\",
\"Fluffy\",
\"Kit-Cat\"
],
\"dogs:\" [
\"Spot\",
\"Bowser\",
\"Frankie\"
]
};
ourPets.cats[1]; // \"Fluffy\"
ourPets.dogs[0]; // \"Spot\"
", "

Instructions

", "Retrieve the second tree using object dot and array bracket notation." ], "releasedOn": "11/27/2015", "tests": [ "assert(secondTree === \"pine\", 'message: secondTree should equal \"pine\"');", "assert(/=\\s*myPlants\\[1\\].list\\[1\\]/.test(editor.getValue()), 'message: Use dot and bracket notation to access myPlants');" ], "challengeSeed": [ "// Setup", "var myPlants = [", " { ", " type: \"flowers\",", " list: [", " \"rose\",", " \"tulip\",", " \"dandelion\"", " ]", " },", " {", " type: \"trees\",", " list: [", " \"fir\",", " \"pine\",", " \"birch\"", " ]", " } ", "];", "", "// Only change code below this line", "", "var secondTree = \"\"; // Change this line", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244ce", "title": "Modifying JSON Values", "description": [ "Modify the contents of a JSON object" ], "releasedOn": "11/27/2015", "tests": [ "assert(1===1, 'message: message here');" ], "challengeSeed": [ "", "", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244cf", "title": "Checkpoint: Objects", "description": [ "Update a JSON or other Object with a property name and value passed in variables" ], "releasedOn": "11/27/2015", "tests": [ "assert(1===1, 'message: message here');" ], "challengeSeed": [ "", "", "" ], "tail": [ "" ], "solutions": [ "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1111c1c11feddfaeb5bdef", "title": "Iterate with JavaScript For Loops", "description": [ "You can run the same code multiple times by using a loop.", "The most common type of JavaScript loop is called a \"for loop\" because it runs \"for\" a specific number of times.", "For loops are declared with three optional expressions seperated by semicolons:", "for ([initialization]; [condition]; [final-expression])", "The initialization statement is executed one time only before the loop starts. It is typically used to define and setup your loop variable.", "The condition statement is evaluated at the beginning of every loop iteration and will continue as long as it evalutes to true. When condition is false at the start of the iteration, the loop will stop executing. This means if condition starts as false, your loop will never execute.", "The final-expression is executed at the end of each loop iteration, prior to the next condition check and is usually used to increment or decrement your loop counter.", "In the following example we initialize with i = 0 and iterate while our condition i < 5 is true. We'll increment i by 1 in each loop iteration with i++ as our final-expression.", "
var ourArray = [];
for (var i = 0; i < 5; i++) {
ourArray.push(i);
}
", "ourArray will now contain [0,1,2,3,4].", "

Instructions

", "Use a for loop to work to push the values 1 through 5 onto myArray." ], "tests": [ "assert(editor.getValue().match(/for\\s*\\(/g).length > 1, 'message: You should be using a for loop for this.');", "assert.deepEqual(myArray, [1,2,3,4,5], 'message: myArray should equal [1,2,3,4,5].');" ], "challengeSeed": [ "// Example", "var ourArray = [];", "", "for (var i = 0; i < 5; i++) {", " ourArray.push(i);", "}", "", "// Setup", "var myArray = [];", "", "// Only change code below this line.", "", "" ], "tail": [ "if (typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56104e9e514f539506016a5c", "title": "Iterate Odd Numbers With a For Loop", "description": [ "For loops don't have to iterate one at a time. By changing our final-expression, we can count by even numbers.", "We'll start at i = 0 and loop while i < 10. We'll increment i by 2 each loop with i += 2.", "
var ourArray = [];
for (var i = 0; i < 10; i += 2) {
ourArray.push(i);
}
", "ourArray will now contain [0,2,4,6,8].", "Let's change our initialization so we can count by odd numbers.", "

Instructions

", "Push the odd numbers from 1 through 9 to myArray using a for loop." ], "tests": [ "assert(editor.getValue().match(/for\\s*\\(/g).length > 1, 'message: You should be using a for loop for this.');", "assert.deepEqual(myArray, [1,3,5,7,9], 'message: myArray should equal [1,3,5,7,9].');" ], "challengeSeed": [ "// Example", "var ourArray = [];", "", "for (var i = 0; i < 10; i += 2) {", " ourArray.push(i);", "}", "", "// Setup", "var myArray = [];", "", "// Only change code below this line.", "", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56105e7b514f539506016a5e", "title": "Count Backwards With a For Loop", "description": [ "A for loop can also count backwards, so long as we can define the right conditions.", "In order to count backwards by twos, we'll need to change our initialization, condition, and final-expression.", "We'll start at i = 10 and loop while i > 0. We'll decrement i by 2 each loop with i -= 2.", "
var ourArray = [];
for (var i=10; i > 0; i-=2) {
ourArray.push(i);
}
", "ourArray will now contain [10,8,6,4,2].", "Let's change our initialization and final-expression so we can count backward by twos by odd numbers.", "

Instructions

", "Push the odd numbers from 9 through 1 to myArray using a for loop." ], "tests": [ "assert(editor.getValue().match(/for\\s*\\(/g).length > 1, 'message: You should be using a for loop for this.');", "assert.deepEqual(myArray, [9,7,5,3,1], 'message: myArray should equal [9,7,5,3,1].');" ], "challengeSeed": [ "// Example", "var ourArray = [];", "", "for (var i = 10; i > 0; i -= 2) {", " ourArray.push(i);", "}", "", "// Setup", "var myArray = [];", "", "// Only change code below this line.", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "type": "waypoint", "challengeType": "1" }, { "id": "5675e877dbd60be8ad28edc6", "title": "Iterate Through an Array with a For Loop", "description": [ "A common task in Javascript is to iterate through the contents of an array. One way to do that is with a for loop. This code will output each element of the array arr to the console:", "
var arr = [10,9,8,7,6];
for (var i=0; i < arr.length; i++) {
console.log(arr[i]);
}
", "Remember that Arrays have zero-based numbering, which means the last index of the array is length - 1. Our condition for this loop is i < arr.length, which stops when i is at length - 1.", "

Instructions

", "Create a variable total. Use a for loop to add each element of myArr to total." ], "releasedOn": "11/27/2015", "tests": [ "assert(total !== 'undefined', 'message: total should be defined');", "assert(total === 20, 'message: total should equal 20');", "assert(!/20/.test(editor.getValue()), 'message: Do not set total to 20 directly');" ], "challengeSeed": [ "// Example", "var ourArr = [ 9, 10, 11, 12];", "var ourTotal = 0;", "", "for (var i = 0; i < ourArr.length; i++) {", " ourTotal += ourArr[i];", "}", "", "// Setup", "var myArr = [ 2, 3, 4, 5, 6];", "", "// Only change code below this line", "", "" ], "tail": [ "(function(t) { if(typeof t !== 'undefined') { return \"Total = \" + t; } else { return \"Total is undefined\";}})(total);" ], "solutions": [ "var myArr = [ 2, 3, 4, 5, 6];", "var total = 0;", "", "for (var i = 0; i < myArr.length; i++) {", " total += myArr[i];", "}" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "56533eb9ac21ba0edf2244e1", "title": "Nesting For Loops", "description": [ "If you have a multi-dimensional array, you can use the same logic as the prior waypoint to loop through both the array and any sub-arrays. Here is an example:", "
var arr = [
[1,2], [3,4], [5,6]
];
for (var i=0; i < arr.length; i++) {
for (var j=0; k < arr[i].length; j++) {
console.log(arr[i][j]);
}
}
", "This outputs each sub-element in arr one at a time. Note that for the inner loop we are checking the .length of arr[i], since arr[i] is itself an array.", "

Instructions

", "Modify function multiplyAll so that it multiplies product by each number in the subarrays of arr" ], "releasedOn": "11/27/2015", "tests": [ "assert(multiplyAll([[1],[2],[3]]) === 6, 'message: multiplyAll([[1],[2],[3]]); should return 6');", "assert(multiplyAll([[1,2],[3,4],[5,6,7]]) === 5040, 'message: multiplyAll([[1,2],[3,4],[5,6,7]]) should return 5040');", "assert(multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]) === 54, 'message: multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]);) should return 54');" ], "challengeSeed": [ "function multiplyAll(arr) {", " var product = 1;", " // Only change code below this line", "", " // Only change code above this line", " return product;", "}", "", "// Modify values below to test your code", "multiplyAll([[1,2],[3,4],[5,6,7]]);", "" ], "tail": [ "" ], "solutions": [ "function multiplyAll(arr) {", " var product = 1;", " for (var i = 0; i < arr.length; i++) {", " for (var j = 0; j < arr[i].length; j++) {", " product *= arr[i][j];", " }", " }", " return product;", "}", "", "multiplyAll([[1,2],[3,4],[5,6,7]]);", "", "" ], "type": "waypoint", "challengeType": "1", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1111c1c11feddfaeb1bdef", "title": "Iterate with JavaScript While Loops", "description": [ "You can run the same code multiple times by using a loop.", "Another type of JavaScript loop is called a \"while loop\", because it runs \"while\" something is true and stops once that something is no longer true.", "
var ourArray = [];
var i = 0;
while(i < 5) {
ourArray.push(i);
i++;
}
", "Let's try getting a while loop to work by pushing values to an array.", "

Instructions

", "Push the numbers 0 through 4 to myArray using a while loop." ], "tests": [ "assert(editor.getValue().match(/while/g), 'message: You should be using a while loop for this.');", "assert.deepEqual(myArray, [0,1,2,3,4], 'message: myArray should equal [0,1,2,3,4].');" ], "challengeSeed": [ "// Setup", "var myArray = [];", "", "// Only change code below this line.", "", "" ], "tail": [ "if(typeof(myArray) !== \"undefined\"){(function(){return myArray;})();}" ], "type": "waypoint", "challengeType": "1" }, { "id": "56533eb9ac21ba0edf2244e2", "title": "Caesar's Cipher", "description": [ "One of the simplest and most widely known ciphers is a Caesar cipher, also known as a shift cipher. In a shift cipher the meanings of the letters are shifted by some set amount. ", "A common modern use is a ROT13 cipher, where the values of the letters are shifted by 13 places. Thus A = N, B = O and so on.", "Write a function which takes a ROT13 encoded array of characters as input and returns a plain text encoded array. All letters will be uppercase. Do not transform any non-alphabetic character (IE: spaces, punctiation)." ], "releasedOn": "11/27/2015", "tests": [ "assert( rot13([ 'S', 'E', 'R', 'R', ' ', 'P', 'B', 'Q', 'R', ' ', 'P', 'N', 'Z', 'C' ]).join(\"\") === \"FREE CODE CAMP\", 'message: rot13([ 'S', 'E', 'R', 'R', ' ', 'P', 'B', 'Q', 'R', ' ', 'P', 'N', 'Z', 'C' ]) should decode to [ 'F', 'R', 'E', 'E', ' ', 'C', 'O', 'D', 'E', ' ', 'C', 'A', 'M', 'P' ]');", "assert(1===1, 'message: blah');" ], "challengeSeed": [ "function rot13(codeArr) {", " // Your Code Here", "", " return []; // Change this Line", "}", "", "// Change the inputs below to test", "rot13([ 'S', 'E', 'R', 'R', ' ', 'P', 'B', 'Q', 'R', ' ', 'P', 'N', 'Z', 'C' ]);" ], "tail": [ "" ], "solutions": [ "" ], "type": "bonfire", "challengeType": "5", "nameCn": "", "nameFr": "", "nameRu": "", "nameEs": "", "namePt": "" }, { "id": "cf1111c1c11feddfaeb9bdef", "title": "Generate Random Fractions with JavaScript", "description": [ "Random numbers are useful for creating random behavior.", "JavaScript has a Math.random() function that generates a random decimal number.", "Change myFunction to return a random number instead of returning 0.", "Note that you can return a function, just like you would return a variable or value." ], "tests": [ "assert(typeof(myFunction()) === \"number\", 'message: myFunction should return a random number.');", "assert((myFunction()+''). match(/\\./g), 'message: The number returned by myFunction should be a decimal.');", "assert(editor.getValue().match(/Math\\.random/g).length >= 0, 'message: You should be using Math.random to generate the random decimal number.');" ], "challengeSeed": [ "function myFunction() {", "", " // Only change code below this line.", "", " return 0;", "", " // Only change code above this line.", "}", "", "(function(){return myFunction();})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb1bdef", "title": "Generate Random Whole Numbers with JavaScript", "description": [ "It's great that we can generate random decimal numbers, but it's even more useful if we use it to generate random whole numbers.", "First, let's use Math.random() to generate a random decimal.", "Then let's multiply this random decimal by 20.", "Finally, let's use another function, Math.floor() to round the number down to its nearest whole number.", "This technique will gives us a whole number between 0 and 19.", "Note that because we're rounding down, it's impossible to actually get 20.", "Putting everything together, this is what our code looks like:", "Math.floor(Math.random() * 20);", "See how Math.floor takes (Math.random() * 20) as its argument? That's right - you can pass a function to another function as an argument.", "Let's use this technique to generate and return a random whole number between 0 and 9." ], "tests": [ "assert(typeof(myFunction()) === \"number\" && (function(){var r = myFunction();return Math.floor(r) === r;})(), 'message: The result of myFunction should be a whole number.');", "assert(editor.getValue().match(/Math.random/g).length > 1, 'message: You should be using Math.random to generate a random number.');", "assert(editor.getValue().match(/\\(\\s*?Math.random\\s*?\\(\\s*?\\)\\s*?\\*\\s*?10\\s*?\\)/g) || editor.getValue().match(/\\(\\s*?10\\s*?\\*\\s*?Math.random\\s*?\\(\\s*?\\)\\s*?\\)/g), 'message: You should have multiplied the result of Math.random by 10 to make it a number that is between zero and nine.');", "assert(editor.getValue().match(/Math.floor/g).length > 1, 'message: You should use Math.floor to remove the decimal part of the number.');" ], "challengeSeed": [ "var randomNumberBetween0and19 = Math.floor(Math.random() * 20);", "", "function myFunction() {", "", " // Only change code below this line.", "", " return Math.random();", "", " // Only change code above this line.", "}" ], "tail": [ "(function(){return myFunction();})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb2bdef", "title": "Generate Random Whole Numbers within a Range", "description": [ "Instead of generating a random number between zero and a given number like we did before, we can generate a random number that falls within a range of two specific numbers.", "To do this, we'll define a minimum number min and a maximum number max.", "Here's the formula we'll use. Take a moment to read it and try to understand what this code is doing:", "Math.floor(Math.random() * (max - min + 1)) + min", "Define two variables: myMin and myMax, and set them both equal to numbers.", "Then create a function called myFunction that returns a random number that's greater than or equal to myMin, and is less than or equal to myMax." ], "tests": [ "assert(myFunction() >= myMin, 'message: The random number generated by myFunction should be greater than or equal to your minimum number, myMin.');", "assert(myFunction() <= myMax, 'message: The random number generated by myFunction should be less than or equal to your maximum number, myMax.');", "assert(myFunction() % 1 === 0 , 'message: The random number generated by myFunction should be an integer, not a decimal.');", "assert((function(){if(editor.getValue().match(/myMax/g).length > 1 && editor.getValue().match(/myMin/g).length > 2 && editor.getValue().match(/Math.floor/g) && editor.getValue().match(/Math.random/g)){return true;}else{return false;}})(), 'message: myFunction() should use use both myMax and myMin, and return a random number in your range.');" ], "challengeSeed": [ "var ourMin = 1;", "", "var ourMax = 9;", "", "function ourFunction() {", "", " return Math.floor(Math.random() * (ourMax - ourMin + 1)) + ourMin;", "", "}", "", "// Only change code below this line.", "", "var myMin;", "", "var myMax;", "", "function myFunction() {", "", " return;", "", "}", "", "// Only change code above this line.", "", "", "(function(){return myFunction();})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb6bdef", "title": "Sift through Text with Regular Expressions", "description": [ "Regular expressions are used to find certain words or patterns inside of strings.", "For example, if we wanted to find the word the in the string The dog chased the cat, we could use the following regular expression: /the/gi", "Let's break this down a bit:", "the is the pattern we want to match.", "g means that we want to search the entire string for this pattern instead of just the first match.", "i means that we want to ignore the case (uppercase or lowercase) when searching for the pattern.", "Regular expressions are written by surrounding the pattern with / symbols.", "Let's try selecting all the occurrences of the word and in the string Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it.", "We can do this by replacing the . part of our regular expression with the word and." ], "tests": [ "assert(test==2, 'message: Your regular expression should find two occurrences of the word and.');", "assert(editor.getValue().match(/\\/and\\/gi/), 'message: Use regular expressions to find the word and in testString.');" ], "challengeSeed": [ "var test = (function() {", " var testString = \"Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it.\";", " var expressionToGetSoftware = /software/gi;", "", " // Only change code below this line.", "", " var expression = /./gi;", "", " // Only change code above this line.", "", " return testString.match(expression).length;", "})();(function(){return test;})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb7bdef", "title": "Find Numbers with Regular Expressions", "description": [ "We can use special selectors in Regular Expressions to select a particular type of value.", "One such selector is the digit selector \\d which is used to retrieve the numbers in a string.", "It is used like this: /\\d/g.", "For numbers this is often written as /\\d+/g, where the + following the digit selector allows this regular expression to match multi-digit numbers.", "Use the \\d selector to select the number of numbers in the string, allowing for the possibility of multi-digit numbers." ], "tests": [ "assert(editor.getValue().match(/\\/\\\\d\\+\\//g), 'message: Use the /\\d+/g regular expression to find the numbers in testString.');", "assert(test === 2, 'message: Your regular expression should find two numbers in testString.');" ], "challengeSeed": [ "var test = (function() {", "", " var testString = \"There are 3 cats but 4 dogs.\";", "", " // Only change code below this line.", "", " var expression = /.+/g;", "", " // Only change code above this line.", "", " return testString.match(expression).length;", "", "})();(function(){return test;})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb8bdef", "title": "Find Whitespace with Regular Expressions", "description": [ "We can also use regular expression selectors like \\s to find whitespace in a string.", "The whitespace characters are \" \" (space), \\r (the carriage return), \\n (newline), \\t (tab), and \\f (the form feed).", "The whitespace regular expression looks like this:", "/\\s+/g", "Use it to select all the whitespace characters in the sentence string." ], "tests": [ "assert(editor.getValue().match(/\\/\\\\s\\+\\//g), 'message: Use the /\\s+/g regular expression to find the spaces in testString.');", "assert(test === 7, 'message: Your regular expression should find seven spaces in testString.');" ], "challengeSeed": [ "var test = (function(){", " var testString = \"How many spaces are there in this sentence?\";", "", " // Only change code below this line.", "", " var expression = /.+/g;", "", " // Only change code above this line.", "", " return testString.match(expression).length;", "", "})();(function(){return test;})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c13feddfaeb3bdef", "title": "Invert Regular Expression Matches with JavaScript", "description": [ "You can invert any match by using the uppercase version of the regular expression selector.", "For example, \\s will match any whitespace, and \\S will match anything that isn't whitespace.", "Use /\\S/g to count the number of non-whitespace characters in testString." ], "tests": [ "assert(editor.getValue().match(/\\/\\\\S\\/g/g), 'message: Use the /\\S/g regular expression to find non-space characters in testString.');", "assert(test === 49, 'message: Your regular expression should find forty nine non-space characters in the testString.');" ], "challengeSeed": [ "var test = (function(){", " var testString = \"How many non-space characters are there in this sentence?\";", "", " // Only change code below this line.", "", " var expression = /./g;", "", " // Only change code above this line.", "", " return testString.match(expression).length;", "})();(function(){return test;})();" ], "type": "waypoint", "challengeType": "1" }, { "id": "cf1111c1c12feddfaeb9bdef", "title": "Create a JavaScript Slot Machine", "isBeta": "true", "description": [ "We are now going to try and combine some of the stuff we've just learned and create the logic for a slot machine game.", "For this we will need to generate three random numbers between 1 and 3 to represent the possible values of each individual slot.", "Store the three random numbers in slotOne, slotTwo and slotThree.", "Generate the random numbers by using the system we used earlier (an explanation of the formula can be found here):", "Math.floor(Math.random() * (3 - 1 + 1)) + 1;" ], "tests": [ "assert(typeof(runSlots($(\".slot\"))[0]) === \"number\" && runSlots($(\".slot\"))[0] > 0 && runSlots($(\".slot\"))[0] < 4, 'slotOne should be a random number.')", "assert(typeof(runSlots($(\".slot\"))[1]) === \"number\" && runSlots($(\".slot\"))[1] > 0 && runSlots($(\".slot\"))[1] < 4, 'slotTwo should be a random number.')", "assert(typeof(runSlots($(\".slot\"))[2]) === \"number\" && runSlots($(\".slot\"))[2] > 0 && runSlots($(\".slot\"))[2] < 4, 'slotThree should be a random number.')", "assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?3\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1/gi) !== null){return editor.match(/slot.*?=.*?\\(.*?\\).*?/gi).length >= 3;}else{return false;}})(), 'You should have used Math.floor(Math.random() * (3 - 1 + 1)) + 1; three times to generate your random numbers.')" ], "challengeSeed": [ "fccss", " function runSlots() {", " var slotOne;", " var slotTwo;", " var slotThree;", " ", " var images = [\"http://i.imgur.com/9H17QFk.png\", \"http://i.imgur.com/9RmpXTy.png\", \"http://i.imgur.com/VJnmtt5.png\"];", " ", " // Only change code below this line.", " ", " ", " ", " // Only change code above this line.", " ", " ", " if (slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined) {", " $(\".logger\").html(slotOne + \" \" + slotTwo + \" \" + slotThree);", " }", " ", " ", " $(\".logger\").append(\" Not A Win\")", " return [slotOne, slotTwo, slotThree];", " }", "", " $(document).ready(function() {", " $(\".go\").click(function() {", " runSlots();", " });", " });", "fcces", " ", "
", "
", "
", " \"learn", "

FCC Slot Machine

", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", "
", " ", "
", "
", "
", "", "" ], "type": "waypoint", "challengeType": "0" }, { "id": "cf1111c1c13feddfaeb1bdef", "title": "Add your JavaScript Slot Machine Slots", "isBeta": "true", "description": [ "Now that our slots will each generate random numbers, we need to check whether they've all returned the same number.", "If they have, we should notify our user that they've won and we should return null.", "null is a JavaScript data structure that means nothing.", "The user wins when all the three numbers match. Let's create an if statement with multiple conditions in order to check whether all numbers are equal.", "if(slotOne === slotTwo && slotTwo === slotThree){", "  return null;", "}", "Also, we need to show the user that he has won the game when he gets the same number in all the slots.", "If all three numbers match, we should also set the text \"It's A Win\" to the element with class logger." ], "tests": [ "assert((function(){var data = runSlots();return data === null || data.toString().length === 1;})(), 'If all three of our random numbers are the same we should return that number. Otherwise we should return null.')" ], "challengeSeed": [ "fccss", " function runSlots() {", " var slotOne;", " var slotTwo;", " var slotThree;", " ", " var images = [\"http://i.imgur.com/9H17QFk.png\", \"http://i.imgur.com/9RmpXTy.png\", \"http://i.imgur.com/VJnmtt5.png\"];", " ", " slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " ", " ", " // Only change code below this line.", " ", " ", " ", " // Only change code above this line.", " ", " if(slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){", " $(\".logger\").html(slotOne + \" \" + slotTwo + \" \" + slotThree);", " }", " ", " $(\".logger\").append(\" Not A Win\");", " ", " return [slotOne, slotTwo, slotThree];", " }", "", " $(document).ready(function() {", " $(\".go\").click(function() {", " runSlots();", " });", " });", "fcces", " ", "
", "
", "
", " \"learn", "

FCC Slot Machine

", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", "
", " ", "
", "
", "
", "", "" ], "type": "waypoint", "challengeType": "0" }, { "id": "cf1111c1c13feddfaeb2bdef", "title": "Bring your JavaScript Slot Machine to Life", "isBeta": "true", "description": [ "Now we can detect a win. Let's get this slot machine working.", "Let's use the jQuery selector $(\".slot\") to select all of the slots.", "Once they are all selected, we can use bracket notation to access each individual slot:", "$($(\".slot\")[0]).html(slotOne);", "This jQuery will select the first slot and update it's HTML to display the correct number.", "Use the above selector to display each number in its corresponding slot." ], "tests": [ "assert((function(){runSlots();if($($(\".slot\")[0]).html().replace(/\\s/gi, \"\") !== \"\" && $($(\".slot\")[1]).html().replace(/\\s/gi, \"\") !== \"\" && $($(\".slot\")[2]).html().replace(/\\s/gi, \"\") !== \"\"){return true;}else{return false;}})(), 'You should be displaying the result of the slot numbers in the corresponding slots.')", "assert((editor.match( /\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[\\d\\]\\s*?\\)/gi) && editor.match( /\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[\\d\\]\\s*?\\)/gi ).length >= 3 && editor.match( /\\.html\\(slotOne\\)/gi ) && editor.match( /\\.html\\(slotTwo\\)/gi ) && editor.match( /\\.html\\(slotThree\\)/gi )), 'You should have used the the selector given in the description to select each slot and assign it the value of slotOne, slotTwo and slotThree respectively.')" ], "challengeSeed": [ "fccss", " function runSlots() {", " var slotOne;", " var slotTwo;", " var slotThree;", " ", " var images = [\"http://i.imgur.com/9H17QFk.png\", \"http://i.imgur.com/9RmpXTy.png\", \"http://i.imgur.com/VJnmtt5.png\"];", " ", " slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " ", " ", " // Only change code below this line.", " ", " ", " ", " // Only change code above this line.", " ", " if (slotOne === slotTwo && slotTwo === slotThree) {", " $(\".logger\").html(\" It's A Win\")", " return null;", " }", " ", " if(slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){", " $(\".logger\").html(slotOne + \" \" + slotTwo + \" \" + slotThree);", " }", " ", " $(\".logger\").append(\" Not A Win\");", " ", " ", " return [slotOne, slotTwo, slotThree];", " }", "", " $(document).ready(function() {", " $(\".go\").click(function() {", " runSlots();", " });", " });", "fcces", " ", "
", "
", "
", " \"learn", "

FCC Slot Machine

", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", "
", " ", "
", "
", "
", "", "" ], "type": "waypoint", "challengeType": "0" }, { "id": "cf1111c1c11feddfaeb1bdff", "title": "Give your JavaScript Slot Machine some Stylish Images", "isBeta": "true", "description": [ "Now let's add some images to our slots.", "We've already set up the images for you in an array called images. We can use different indexes to grab each of these.", "Here's how we would set the first slot to show a different image depending on which number its random number generates:", "$($('.slot')[0]).html('<img src = \"' + images[slotOne-1] + '\">');", "Set up all three slots like this, then click the \"Go\" button to play the slot machine." ], "tests": [ "assert((editor.match(/\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[\\d\\]\\s*?\\)\\.html\\(\\s*?\\'\\\\'\\s*?\\);/gi) && editor.match(/\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[\\d\\]\\s*?\\)\\.html\\(\\s*?\\'\\\\'\\s*?\\);/gi).length >= 3), 'Use the provided code three times. One for each slot.')", "assert(editor.match(/\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[0\\]\\s*?\\)/gi), 'You should have used $('.slot')[0] at least once.')", "assert(editor.match(/\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[1\\]\\s*?\\)/gi), 'You should have used $('.slot')[1] at least once.')", "assert(editor.match(/\\$\\s*?\\(\\s*?\\$\\s*?\\(\\s*?(?:'|\")\\s*?\\.slot\\s*?(?:'|\")\\s*?\\)\\[2\\]\\s*?\\)/gi), 'You should have used $('.slot')[2] at least once.')", "assert(editor.match(/slotOne/gi) && editor.match(/slotOne/gi).length >= 7, 'You should have used the slotOne value at least once.')", "assert(editor.match(/slotTwo/gi) && editor.match(/slotTwo/gi).length >= 8, 'You should have used the slotTwo value at least once.')", "assert(editor.match(/slotThree/gi) && editor.match(/slotThree/gi).length >= 7, 'You should have used the slotThree value at least once.')" ], "challengeSeed": [ "fccss", " function runSlots() {", " var slotOne;", " var slotTwo;", " var slotThree;", " ", " var images = [\"http://i.imgur.com/9H17QFk.png\", \"http://i.imgur.com/9RmpXTy.png\", \"http://i.imgur.com/VJnmtt5.png\"];", " ", " slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;", " ", " ", " // Only change code below this line.", " ", " ", " ", " // Only change code above this line.", " ", " if (slotOne === slotTwo && slotTwo === slotThree) {", " $('.logger').html(\"It's A Win\");", " return null;", " }", " ", " if(slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){", " $(\".logger\").html(slotOne + \" \" + slotTwo + \" \" + slotThree);", " }", " ", " $('.logger').append(\" Not A Win\");", " ", " return [slotOne, slotTwo, slotThree];", " }", "", " $(document).ready(function() {", " $('.go').click(function() {", " runSlots();", " });", " });", "fcces", " ", "
", "
", "
", " ", "

FCC Slot Machine

", "
", "
", "
", " ", "
", "
", " ", "
", "
", " ", "
", "
", "
", "
", " ", "
", "
", "
", " ", "
", "
", "
", "", "" ], "type": "waypoint", "challengeType": "0" } ] }