//这是一个单行注释
/**
* Your output will go here.
* Any console.log() -type
* statements will appear in
* your browser's DevTools
* JavaScript console.
*/
- 使用
//
来告诉JavaScript来忽略当前行的代码:// This is an in-line comment.
- 你也可以使用多行注释来注释你的代码,以/开始,用/来结束,就像下面这样:
JavaScript
> /* This is a
> multi-line comment */
>- 最佳实践:你应该给你写的代码添加注释,来让你的代码看起来更加地清晰易懂。良好的注释能够清晰地传达你写的代码的意图—对于那些读你的代码的人来说以及未来你看到它的时候,还能理解这段代码的意图。
var myName;
undefined
(未定义),null
(空),boolean
(布尔型),string
(字符串),symbol
(符号),number(数字),
andobject
(对象)。12
和strings
,"12"
和"dog"
, 或"123 cats"
, 都是字母的集合。 计算机能够精确地操作数字, 但是对于字符串却无能为力。var ourName
;Variable
(变量)的名字可以由数字、字母、$
或者_
组成,但是不能包含空格或者以数字为首。var
关键字来创建一个名为myName
的变量。var a = 7;
var b = a;
myVariable = 5;
把Number数字5赋给变量myVariable。=
操作符右边的值都会被赋到左边的变量。 Javascript
> myVar = 5;
> myNum = myVar;
>
数值5
被赋给变量myVar
中, 然后变量myVar
又赋给变量myNum
,这样子myNum
变量中的值也是5
了。
7
赋给变量a
。把变量a
中的内容赋给变量b
。var a = 9;
var myVar = 0;
创建一个名为myVar
的变量并指定一个初始值0
。任务
通过关键字 var 定义一个变量 a 并且给它一个初始值 9。
// 初始化变量
var a = 5;
var b = 10;
var c = "I am a";
// 请只修改这条注释以上的代码
a = a + 1;
b = b + 5;
c = c + " String!";
undefined
。当你对一个值为undefined
的变量进行运算操作的时候,算出来的结果将会是NaN
,NaN
的意思是”Not a Number”。当你用一个没有定义
的变量来做字符串连接操作的时候,它会如实的输出”undefined”。任务
定义3个变量 a、b、c ,并且分别给他们赋值:5、10、”I am a” ,这样它们就不会是 undefined(未定义的了)。
// 初始化变量
var studlyCapVar;
var properCamelCase;
var titleCaseOver;
// 给变量赋值
studlyCapVar = 10;
properCamelCase = "A String";
titleCaseOver = 9000;
MYVAR
与MyVar
和myvar
是截然不同的变量。这就有可能导致多个截然不同的变量却有着有相似的名字。正是由于以上原因所以强烈地建议你, 不要使用这一特性。(以免给自己带来麻烦)驼峰命名法
来书写一个 Javascript 变量,在驼峰命名法
中,变量名的第一个单词的首写字母小写,后面的单词的第一个字母大写。javascript
> var someVariable;
> var anotherVariableName;
> var thisVariableNameIsTooLong;
>
任务
修正声明的变量,让它们的命名符合 驼峰命名法 的规范。
var sum = 10 + 10;
var difference = 45 - 33;
var product = 8 * 10;
var quotient = 66 / 33;
myVar++;
myVar--;
var ourDecimal = 5.7;
var myDecimal = ourDecimal;
var product = 2.0 * 2.5;
var quotient = 4.4 / 2.0;
var remainder = 11 % 3;
a += 12;
b += 9;
c += 7;
a -= 6;
b -= 15;
c -= 1;
a *= 5;
b *= 3;
c *= 10;
a /= 12;
b /= 4;
c /= 11;
function convert(celsius) {
fahrenheit = celsius*9/5+32;
return fahrenheit;
}
convert(30);
从Celsius摄氏度转换为Fahrenheit华氏度的算法是:摄氏度的温度乘于9除于5,再加上32。
创建一个变量 fahrenheit,然后计算出摄氏度对应的华氏度。
var myFirstName = "Vincente";
var myLastName = "Liang";
var myStr = "I am a \"double quoted\" string inside \"double quotes\"";
var myStr = '<a href="http://www.example.com" target="_blank">Linka>';
var myStr = "\\ \t \b \r \n";
|Code|Output|
|:—:|:—:|
|\'
|单引号|
|\"
|双引号|
|\\
|反斜杠符|
|\n
|换行符|
|\r
|回车符|
|\t
|制表符|
|\b
|退格符|
|\f
|换页符|
注意:如果你想要显示一个反斜杠就必须要转义它。
myStr
。var myStr = "This is the start. " + "This is the end.";
var myStr = "This is the first sentence. ";
myStr += "This is the second sentence."
var myName = "Vincente";
var myStr = "My name is " + myName + "and am swell!"
var someAdjective = "cool";
var myStr = "Learning to code is ";
myStr += someAdjective;
var lastNameLength = 0;
var lastName = "Lovelace";
lastNameLength = lastName.length;
.length
来获得字符串变量字符串
值的长度: "Alan Peter".length; // 10
firstLetterOfLastName = lastName[0]
[索引]
来获得对应的字符。基于零
的索引。var firstName = "Charles"
中,你可以使用firstName[0]
来获得第一个位置上的字符。lastName
中的第一个字符,并赋给变量firstLetterOfLastName
。var myStr = "Jello World";
myStr = "Hello World";
字符串
的值是不可变的
,这意味着一旦字符串被创建就不能被改变。javascript
> var myStr = "Bob";
> myStr[0] = "J";
>
是不会把变量myStr
的值改变成"Job"
的,因为变量myStr
是不可变的。
注意,这 并不 意味着myStr
永远不能被改变,只是字符串字面量string literal
的各个字符不能被改变。改变myStr
中的唯一方法是重新给它赋一个值,就像这样:
javascript
> var myStr = "Bob";
> myStr = "Job";
>
myStr
的值改为Hello World
。var thirdLetterOfLastName = lastName[2];
var lastLetterOfLastName = lastName[lastName.length - 1];
var secondToLastLetterOfLastName = lastName[lastName.length - 2];
function wordBlanks(myNoun, myAdjective, myVerb, myAdverb) {
var result = myNoun + " " + myVerb + " " + myAdjective + " things " + myAdverb + ".";
return result;
}
wordBlanks("I", "great", "do", "easily");
myNoun
、形容词myAdjective
、动词myVerb
、副词myAdverb
,来创建一个新的句子result
。var myArray = ["Vincente",20];
数组
,我们可以在一个地方存储多个数据。你以左方括号[
开始定义一个数组,以右方括号]
结束定义,并把每个条目之间用逗号隔开,就像这样:var sandwich = ["peanut butter", "jelly", "bread"]
。
[x] 任务: 创建一个包含字符串
和数字
的数组myArray
。
var myArray = [[1,2],[3,4]];
[["Bulls", 23], ["White Sox", 45]]
。这被称为一个多维数组
。myArray
的多维数组。var myArray = [1,2,3];
var myData = myArray[0];
[index]
来访问数组中的数据。var myArray = [1,2,3];
myArray[0] = 3;
var myArray = [[1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14]];
var myData = myArray[2][1];
var myArray = [["John", 23], ["cat", 2]];
myArray.push(["dog",3]);
push()
函数。.push()
接受把一个或多个参数,并把它“推”入到数组的末尾:
javascript
> var arr = [1,2,3];
> arr.push(4);
> // 现在arr的值为 [1,2,3,4]
>
["dog", 3]
“推”入到myArray
变量的末尾。var removedFromMyArray = myArray.pop();
.pop()
函数。.pop()
函数用来“抛出”一个数组末尾的值。我们可以把这个“抛出”的值赋给一个变量存储起来。var oneDown = [1, 4, 6].pop();
现在oneDown
的值为6
,数组变成了[1, 4]
。.pop()
函数移除myArray
中的最后一条,并且把“抛出”的值赋给removedFromMyArray
。var removedFromMyArray = myArray.shift();
pop()
函数用来移出数组中最后一个元素。如果想要移出第一个元素要怎么办呢?.shift()
的用武之地。它的工作原理就像.pop()
,但它移除的是第一个元素,而不是最后一个。.shift()
函数移出myArray
中的第一项,并把“移出”的值赋给removedFromMyArray
。myArray.unshift(["Paul",35]);
shift
(移出)数组中的第一个元素,你也可以unshift
(移入)一个元素到数组的头部。.unshift()
函数用起来就像.push()
函数一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素。unshift()
函数把["Paul",35]
加入到myArray
的头部。var myList = [["1",1],["2",2],["3",3],["4",4],["5",5]];
myList
的购物清单,清单的数据格式就是多维数组。["Chocolate Bar", 15]
function myFunction() {
console.log("Hi World");
}
myFunction();
函数
(functions)中。
javascript
> function functionName() {
> console.log("Hello World");
> }
>
functionName
加上后面的小括号来调用这个函数(function),就像这样:functionName();
每次调用函数时它会打印出消息的“Hello World”到开发的控制台上。所有的大括号之间的代码将在每次函数调用时执行。
[x] 任务:
- 创建一个名为
myFunction
的函数,这个函数可以打印“Hi World”到开发控制台上。- 调用这个函数。
function myFunction(a,b) {
console.out(a+b);
}
myFunction(1,1);
parameters
在函数中充当占位符(也叫形参)的作用,参数可以为一个或多个。调用一个函数时所传入的参数为实参,实参决定着形参真正的值。简单理解:形参即形式、实参即内容。param1
和param2
: javascript
> function testFun(param1, param2) {
> console.log(param1, param2);
> }
>
接着我们调用testFun
:
javascript
> testFun("Hello", "World");
>
我们传递了两个参数,"Hello"
和"World"
。在函数内部,param1
等于“Hello”
,param2
等于“World”
。请注意,testFun
函数可以多次调用,每次调用时传递的参数会决定形参的实际值。
myFunction
的函数,它可以接收两个参数,计算参数的和,将结果输出到控制台。 var myGlobal = 10;
function fun1() {
oopsGlobal = 5;
}
function fun2() {
var output = "";
if (typeof myGlobal != "undefined") {
output += "myGlobal: " + myGlobal;
}
if (typeof oopsGlobal != "undefined") {
output += " oopsGlobal: " + oopsGlobal;
}
console.log(output);
}
作用域
涉及到变量的作用范围。在函数外定义的变量具有全局
作用域。这意味着,具有全局作用域的变量可以在代码的任何地方被调用。var
关键字定义的变量,会被自动创建在全局作用域中,形成全局变量。当在代码其他地方无意间定义了一个变量,刚好变量名与全局变量相同,这时会产生意想不到的后果。因此你应该总是使用var关键字来声明你的变量。
- 在函数外声明一个
全局
变量myGlobal
,并给它一个初始值10
- 在函数
fun1
的内部,不使用var
关键字来声明oopsGlobal
,并赋值为5
。- [ ] 错误:在函数外用
var
声明也为全局变量。
function myFunction() {
'use strict';
var myVar;
console.log(myVar);
}
myFunction()
myTest
内声明局部变量loc
的最佳例子: javascript
> function myTest() {
> var loc = "foo";
> console.log(loc);
> }
> myTest(); // "foo"
> console.log(loc); // "undefined"
>
在函数外,loc
是未定义的。
var outerWear = "T-Shirt";
function myFunction() {
var outerWear = "sweater";
return outerWear;
}
局部
变量和全局
变量。在这种情况下,局部
变量将会优先于全局
变量。javascript
> var someVar = "Hat";
> function myFun() {
> var someVar = "Head";
> return someVar;
> }
>
函数myFun
将会返回"Head"
,因为局部变量
优先级更高。
myFunction
添加一个局部变量来覆盖outerWear
的值为"sweater"
。var
。function timesFive(num) {
return 5*num;
参数
来传入函数,也可以使用return
语句把数据从一个函数中传出来。var processed = 0;
function process(num) {
return (num + 3) / 5;
}
function queue(arr, item) {
arr.push(item);
item = arr.shift();
return item;
}
队列
(queue)是一个抽象的数据结构,队列中的条目都是有秩序的。新的条目会被加到队列
的末尾,旧的条目会从队列
的头部被移出。写一个函数queue
,用一个数组arr
和一个数字item
作为参数。数字item
添加到数组的结尾,然后移出数组的第一个元素,最后队列函数应该返回被删除的元素。
function welcomeToBooleans() {
return true;
布尔
值要么是true
要么是false
。它非常像电路开关,true
是“开”,false
是“关”。这两种状态是互斥的。Boolean
值绝不会写作被引号包裹起来的形式。字符串
的"true"
和"false"
不是布尔
值,在 JavaScript 中也没有特殊含义。function myFunction(wasThatTrue) {
if(wasThatTrue)
return "That was true";
return "That was false";
}
if
告诉 JavaScript 在小括号中的条件为真的情况下去执行定义在大括号里面的代码。这种条件被称为Boolean
条件,因为他们只可能是true
(真)或false
(假)。function myTest(val) {
if (val == 12) {
return "Equal";
}
return "Not Equal";
}
相互比较
的操作。所有这些操作符都返回一个true
或false
值。function myTest(val) {
if (val === 7) {
return "Equal";
}
return "Not Equal";
}
===
)是相对于相等操作符(==
)的一种操作符。与相等操作符不同的是,它会同时比较元素的值
和数据类型
。
function myTest(val) {
if (val != 99) { // 请修改这一行
return "Not Equal";
}
return "Equal";
}
例如
1 != 2 // true
1 != “1” // false
1 != ‘1’ // false
1 != true // false
0 != false // false –>
- [x] 任务: 在if
语句中,添加不相等运算符!=
,这样函数在当val
不等于99
的时候,会返回"Not Equal"
。
function myTest(val) {
if (val !== 17) {
return "Not Equal";
}
return "Equal";
}
!==
)与全等运算符是相反的。这意味着严格不相等并返回false
的地方,用严格相等运算符会返回true
,反之亦然。严格相等运算符不会转换值的数据类型。function myTest(val) {
if (val > 100) {
return "Over 100";
}
if (val > 10) {
return "Over 10";
}
return "10 or Under";
}
function myTest(val) {
if (val >= 20) {
return "20 or Over";
}
if (val >= 10) {
return "10 or Over";
}
return "9 or Under";
}
function myTest(val) {
if (val < 25) {
return "Under 25";
}
if (val < 55) {
return "Under 55";
}
return "55 or Over";
}
function myTest(val) {
if (val <= 22) {
return "Smaller Than or Equal to 12";
}
if (val <= 24) {
return "Smaller Than or Equal to 24";
}
return "25 or More";
}
function myTest(val) {
if (val <= 50 && val >= 25) {
return "Yes";
}
return "No";
}
function myTest(val) {
if (val < 10 || val > 20) {
return "Outside";
}
return "Inside";
}
function myTest(val) {
var result = "";
if (val > 5) {
result = "Bigger than 5";
}
else {
result = "5 or Smaller";
}
return result;
}
function myTest(val) {
if (val > 10) {
return "Greater than 10";
}
else if (val < 5) {
return "Smaller than 5";
}
else
return "Between 5 and 10";
}
function myTest(val) {
if (val < 5) {
return "Less than 5";
} else if (val < 10) {
return "Less than 10";
} else {
return "Greater than or equal to 10";
}
}
第一个例子:
javascript
> function foo(x) {
> if (x < 1) {
> return "Less than one";
> } else if (x < 2) {
> return "Less than two";
> } else {
> return "Greater than or equal to two";
> }
> }
>
第二个例子更改了代码的执行顺序:
javascript
> function bar(x) {
> if (x < 2) {
> return "Less than two";
> } else if (x < 1) {
> return "Less than one";
> } else {
> return "Greater than or equal to two";
> }
> }
>
这两个函数看起来几乎一模一样,我们传一个值进去看看它们有什么区别。
javascript
> foo(0) // "Less than one"
> bar(0) // "Less than two"
>
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";
}
if/else
语句串联在一起可以实现复杂的逻辑,这是多个if/else if
语句串联在一起的伪代码:
javascript
> if (condition1) {
> statement1
> } else if (condition2) {
> statement2
> } else if (condition3) {
> statement3
> . . .
> } else {
> statementN
> }
>
if/else if
语句串联起来实现下面的逻辑: javascript
> num < 5 - return "Tiny"
> num < 10 - return "Small"
> num < 15 - return "Medium"
> num < 20 - return "Large"
> num >= 20 - return "Huge"
>
function golfScore(par, strokes) {
if(strokes == 1)
return "Hole-in-one!";
else if(strokes <= par - 2)
return "Eagle";
else if(strokes == par - 1)
return "Birdie";
else if(strokes == par)
return "Par";
else if(strokes == par + 1)
return "Bogey";
else if(strokes == par + 2)
return "Double Bogey";
else if(strokes >= par + 3)
return "Go Home!";
}
golf
游戏中,每个洞都有自己的标准杆数par
,代表着距离。根据你把球打进洞所挥杆的次数strokes
,可以计算出你的高尔夫水平。par
和挥杆次数strokes
,根据下面的表格返回正确的水平段位。 |Strokes|Return|
|:—:|:—:|
|1|”Hole-in-one!”|
|<= par - 2|”Eagle”|
|par - 1|”Birdie”|
|par|”Par”|
|par + 1|”Bogey”|
|par + 2|”Double Bogey”|
|>= par + 3|”Go Home!”|
==
而不是=
!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";
break;
}
return answer;
}
switch
语句。根据不同的参数值会匹配上不同的case
分支,语句会从第一个匹配的case
分支开始执行,直到碰到break
就结束。
javascript
> switch (num) {
> case value1:
> statement1;
> break;
> case value2:
> statement2;
> break;
> ...
> case valueN:
> statementN;
> break;
> }
>
case
值使用严格相等运算符进行比较,break
关键字告诉javascript停止执行语句。如果没有break
关键字,下一个语句会继续执行。val
的switch
语句,并且根据下面的条件来设置不同的answer
: 1
- “alpha” 2
- “beta” 3
- “gamma” 4
- “delta”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";
break;
}
return answer;
}
switch
语句中你可能无法用case
来指定所有情况,这时你可以添加default
语句。当再也找不到case
匹配的时候default
语句会执行,非常类似于if/else
组合中的else
语句。default
语句应该是最后一个case
。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";
break;
default:
answer = "4 alone";
}
switch
语句中的case
分支的break
语句漏掉了,后面的case
语句会一直执行直到遇到break
。function myTest(val) {
var answer = "";
switch (val) {
case 1:
answer = "There is no #1";
break;
case 7:
answer = "Ate Nine";
break;
case 42:
answer = "The Answer";
break;
case 99:
answer = "Missed me by this much!";
break;
case "bob":
answer = "Marley";
}
switch
语句写起来会比多个串联的if/if else
语句容易些.function isLess(a, b) {
return a < b;
}
boolean
值,要么是true
要么是false
。if/else
语句来做比较然后返回true
或false
已经成为大家的共识: JavaScript
> function isEqual(a,b) {
> if (a === b) {
> return true;
> } else {
> return false;
> }
> }
>
因为===
总是返回true
或false
,所以我们可以直接返回比较的结果:
JavaScript
> function isEqual(a,b) {
> return a === b;
> }
>
isLess
函数的if/else
语句但不影响函数的功能。// 定义 abTest
function abTest(a, b) {
if(a < 0 || b < 0)
return;
else
return Math.round(Math.pow(Math.sqrt(a) + Math.sqrt(b), 2));
}
return
语句时,函数返回一个结果就结束运行了,return
后面的语句根本不会执行。var count = 0;
function cc(card) {
var action;
switch(card) {
case 2:
case 3:
case 4:
case 5:
case 6:
count += 1;
break;
case 10:
case "J":
case "Q":
case "K":
case "A":
count -= 1;
break;
}
if(count > 0)
action = " Bet";
if(count <= 0)
action = " Hold";
return count+action;
}
var myDog = {
"name": "Dog",
"legs": 4,
"tails": 1,
"friends": ["cat","bird"]
};
object
。
JavaScript
> var cat = {
> "name": "Whiskers",
> "legs": 4,
> "tails": 1,
> "enemies": ["Water", "Dogs"]
> };
>
myDog
的对象,它里面有这些属性: 名称"name"
、 腿"legs"
、尾巴"tails"
、朋友"friends"
。你可以设置对象属性为任何你想要的值,只要"name"
是字符串、"legs"
和"tails"
是数字、"friends"
是数组。var testObj = {
"hat": "ballcap",
"shirt": "jersey",
"shoes": "cleats"
};
var hatValue = testObj.hat;
var shirtValue = testObj.shirt;
.
),一个是中括号操作符([]
)。
JavaScript
> var myObj = {
> prop1: "val1",
> prop2: "val2"
>};
> var prop1val = myObj.prop1; // val1
> var prop2val = myObj.prop2; // val2
>
testObj
,把hat
的属性值赋给变量hatValue
,把shirt
的属性值赋给shirtValue
。var testObj = {
"an entree": "hamburger",
"my side": "veggies",
"the drink": "water"
};
var entreeValue = testObj["an entree"];
var drinkValue = testObj["the drink"];
[]
),如果你想访问的属性的名称有一个空格,这时你只能使用中括号操作符([]
)。[]
)读取对象属性的例子:
JavaScript
> var myObj = {
> "Space Name": "Kirk",
> "More Space": "Spock"
> };
> myObj["Space Name"]; // Kirk
> myObj['More Space']; // Spock
>
testObj
的属性"an entree"
值和属性"the drink"
值。""
。var testObj = {
12: "Namath",
16: "Montana",
19: "Unitas"
};
var playerNumber = 16;
var player = testObj[playerNumber];
JavaScript
> var someProp = "propName";
> var myObj = {
> propName: "Some Value"
> }
> myObj[someProp]; // "Some Value"
>
还有更多:
JavaScript
> var myDog = "Hunter";
> var dogs = {
> Fido: "Mutt",
> Hunter: "Doberman",
> Snoopie: "Beagle"
> };
> var breed = dogs[myDog];
> console.log(breed)// "Doberman"
>
playerNumber
,通过中括号操作符找到testObj
中playerNumber 为 16 的值。var myDog = {
"name": "Coder",
"legs": 4,
"tails": 1,
"friends": ["Free Code Camp Campers"]
};
myDog.name = "Happy Coder";
JavaScript
> var ourDog = {
> "name": "Camper",
> "legs": 4,
> "tails": 1,
> "friends": ["everything!"]
> };
>
让我们更改它的名称为"Happy Camper"
,这有两种方式来更新对象的name
属性:
JavaScript
> ourDog.name = "Happy Camper";
> ourDog["name"] = "Happy Camper";
>
myDog
对象的name
属性,让它的名字从"Coder"
变成"Happy Coder"
。myDog.bark = "wang";
ourDog.bark = "bow-wow";
或者ourDog["bark"] = "bow-wow";
myDog
添加一个"bark"
属性,设置它的值为狗的声音,例如:"woof"
。delete myDog.tails;
delete ourDog.bark;
myDog
对象的"tails"
属性。function phoneticLookup(val) {
var lookup = {
alpha: "Adams",
bravo: "Boston",
charlie: "Chicago",
delta: "Denver",
echo: "Easy",
foxtrot: "Frank"
};
return lookup[val];
}
JavaScript
> var alpha = {
> 1:"Z",
> 2:"Y",
> 3:"X",
> 4:"W",
> ...
> 24:"C",
> 25:"B",
> 26:"A"
> };
> alpha[2]; // "Y"
> alpha[24]; // "C"
>
> var value = 2;
> alpha[value]; // "Y"
>
switch
语句转化为一个叫做lookup
的对象。=
,""
var myObj = {
gift: "pony",
pet: "kitten",
bed: "sleigh"
};
function checkObj(checkProp) {
if(myObj.hasOwnProperty(checkProp))
return myObj[checkProp];
else
return "Not Found";
}
.hasOwnProperty(propname)
方法来检查对象是否有该属性。如果有返回true
,反之返回false
。
JavaScript
> var myObj = {
> top: "hat",
> bottom: "pants"
> };
> myObj.hasOwnProperty("top"); // true
> myObj.hasOwnProperty("middle"); // false
>
checkObj
检查myObj
是否有checkProp
属性,如果属性存在,返回属性对应的值,如果不存在,返回"Not Found"
。checkProp
不加双引号。var myMusic = [
{
"artist": "Billy Joel",
"title": "Piano Man",
"release_year": 1973,
"formats": [
"CS",
"8T",
"LP" ],
"gold": true
},
{
"artist": "Billy Joel",
"title": "Piano Man",
"release_year": 1973,
"formats": [
"CS",
"8T",
"LP" ]
}
];
JSON
,它使用JavaScript对象的格式来存储数据。JSON是灵活的,因为它允许数据结构
是字符串
,数字
,布尔值
,字符串
和对象
的任意组合。JavaScript
> var ourMusic = [
> {
> "artist": "Daft Punk",
> "title": "Homework",
> "release_year": 1997,
> "formats": [
> "CD",
> "Cassette",
> "LP" ],
> "gold": true
> }
> ];
>
这是一个对象数组,并且对象有各种关于专辑的详细信息
。它也有一个嵌套的formats
的数组。附加专辑记录可以被添加到数组的最上层。
myMusic
的JSON对象。添加artist
和title
字符串,release_year
数字和formats
字符串数组。var myStorage = {
"car": {
"inside": {
"glove box": "maps",
"passenger seat": "crumbs"
},
"outside": {
"trunk": "jack"
}
}
};
var gloveBoxContents = myStorage.car.inside["glove box"];
JavaScript
> var ourStorage = {
> "desk": {
> "drawer": "stapler"
> },
> "cabinet": {
> "top drawer": {
> "folder1": "a file",
> "folder2": "secrets"
> },
> "bottom drawer": "soda"
> }
> }
> ourStorage.cabinet["top drawer"].folder2; // "secrets"
> ourStorage.desk.drawer; // "stapler"
>
myStorage
中嵌套属性glove box
的值。因为属性的名字带有空格,请使用中括号操作符来访问属性的值。var myPlants = [
{
type: "flowers",
list: [
"rose",
"tulip",
"dandelion"
]
},
{
type: "trees",
list: [
"fir",
"pine",
"birch"
]
}
];
var secondTree = myPlants[1].list[1];
JavaScript
> var ourPets = {
> "cats": [
> "Meowzer",
> "Fluffy",
> "Kit-Cat"
> ],
> "dogs": [
> "Spot",
> "Bowser",
> "Frankie"
> ]
> };
> ourPets.cats[1]; // "Fluffy"
> ourPets.dogs[0]; // "Spot"
>
myPlants
的第二棵树。0
开始,对象也不例外。// 初始化变量
var collection = {
2548: {
album: "Slippery When Wet",
artist: "Bon Jovi",
tracks: [
"Let It Rock",
"You Give Love a Bad Name"
]
},
2468: {
album: "1999",
artist: "Prince",
tracks: [
"1999",
"Little Red Corvette"
]
},
1245: {
artist: "Robert Palmer",
tracks: [ ]
},
5439: {
album: "ABBA Gold"
}
};
// 深拷贝 collection,用于测试
var collectionCopy = JSON.parse(JSON.stringify(collection));
// 请只修改这条注释以下的代码
function update(id, prop, value) {
if(value !== '' && prop != 'tracks')
collectionCopy[id][prop]=value;
if(value !== '' && prop == 'tracks')
collectionCopy[id][prop].push(value);
if(value === '')
delete collectionCopy[id][prop];
return collection;
}
id
标识,并具有多种属性。但并非所有的专辑都有完整的信息。id
、prop
、value
。 value !=''
而且prop != 'tracks'
,collectionCopy[id][prop]=value;
。value !=''
而且prop == 'tracks'
,collectionCopy[id][prop].push(value);
。value == ''
,delete collectionCopy[id][prop];
。var myArray = [];
for (var i = 1; i <= 5; i++) {
myArray.push(i);
}
for
循环”。var myArray = [];
for (var i = 1; i < 10; i += 2) {
myArray.push(i);
}
for
循环可以按照我们指定的顺序来迭代,通过更改我们的计数器,我们可以按照偶数顺序来迭代。var myArray = [];
for (var i = 9; i > 0; i -= 2) {
myArray.push(i);
}
for
循环也可以逆向迭代,只要我们定义好合适的条件。var myArr = [ 2, 3, 4, 5, 6];
var total = 0;
for (var i = 0; i <= ourArr.length; i++) {
total += myArr[i];
}
for
循环可以做到这一点。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]]);
- [X] 任务: 修改函数multiplyAll
,获得arr
内部数组的每个数字相乘的结果product
。
var myArray = [];
var i = 0;
while(i < 5) {
myArray.push(i);
i++;
}
while
循环,因为它规定,当(while
)条件为真,循环才会执行,反之不执行。
- [X] 任务: 通过一个while
循环,把从0
到4
的值添加到myArray
中。
function lookUp(firstName, prop){
var i = 0;
for (i=0;i<=3;i++){
if(contacts[i].firstName == firstName)
break;
}
if(i==4)
return "No such contact";
else if(contacts[i].hasOwnProperty(prop))
return contacts[i][prop];
else
return "No such property";
}
lookUp
有两个预定义参数:firstName
值和prop
属性 。firstName
相同的联系人。如果存在,那么还需要检查对应的联系人中是否存在prop
属性。prop
属性对应的值。firstName
值不存在,返回"No such contact"
。prop
属性不存在,返回"No such property"
。function myFunction() {
return Math.random();
}
Math.random()
用来生成一个在0(包括0)到1(不包括1)之间的随机小数,因此Math.random()
可能返回0但绝不会返回1。return
执行前调用,所以我们可以直接返回Math.random()
的值。myFunction
来生成一个随机数取代0
。function myFunction() {
return Math.floor(10*Math.random());
}
- 用
Math.random()
生成一个随机小数。- 把这个随机小数乘以
20
。- 用
Math.floor()
向下取整 获得它最近的整数。- 记住
Math.random()
永远不会返回1
。同时因为我们是在用Math.floor()
向下取整,所以最终我们获得的结果不可能有20
。这确保了我们获得了一个在0到19之间的整数。
function randomRange(myMin, myMax) {
return Math.floor(Math.random() * (myMax -myMin + 1)) + myMin;
}
Math.floor(Math.random() * (max - min + 1)) + min
var testString = "Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it.";
var expression = /and/gi;
var andCount = testString.match(expression).length;
Regular expressions
正则表达式被用来根据某种匹配模式来寻找strings中的某些单词。The dog chased the cat
中单词the
,我们可以使用下面的正则表达式: /the/gi
/
是这个正则表达式的头部the
是我们想要匹配的模式/
是这个正则表达式的尾部g
代表着global
(全局),意味着返回所有的匹配而不仅仅是第一个。i
代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。- [X] 任务: 用全局、忽略大小写的模式选取字符串 testString中所有的单词 and。
var testString = "There are 3 cats but 4 dogs.";
var expression = /\d+/g;
var digitCount = testString.match(expression).length;
\d
,意思是被用来获取一个字符串的数字。/\d/g
。+
),例如:/\d+/g
,它允许这个正则表达式匹配一个或更多数字。g
是’global’的简写,意思是允许这个正则表达式 找到所有的匹配而不是仅仅找到第一个匹配。\d
选择器来选取字符串中的所有数字。var testString = "How many spaces are there in this sentence?";
var expression = /\s+/g;
var spaceCount = testString.match(expression).length;
\s
来选择一个字符串中的空白。" "
(空格符)、\r
(回车符)、\n
(换行符)、\t
(制表符) 和 \f
(换页符)。/\s+/g
var testString = "How many non-space characters are there in this sentence?";
var expression = /\S/g;
var nonSpaceCount = testString.match(expression).length;
\s
匹配任何空白字符,\S
匹配任何非空白字符。/\S/g
来匹配字符串testString
中的所有非空白字符。<script>
function runSlots() {
var slotOne;
var slotTwo;
var slotThree;
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;
}
</style>
slotOne
、slotTwo
、slotThree
来存储着3个随机数。Math.floor(Math.random() * (3 - 1 + 1)) + 1;
if (slotOne === slotTwo && slotTwo === slotThree){
return slotOne;
} else {
return null;
}
null
。null
是JavaScript中的一种数据类型,意味着空。if statement
,用多个条件按顺序来检查它们是否相等。类似于:
javascript
> if (slotOne === slotTwo && slotTwo === slotThree){
> return slotOne;
> } else {
> }
>
"It's A Win"
追加到class logger
的html中。 $($(".slot")[0]).html(slotOne);
$($(".slot")[1]).html(slotTwo);
$($(".slot")[2]).html(slotThree);
$(".slot")
获得所有老虎机。$($(".slot")[0]).html(slotOne);
<script>
function runSlots() {
var slotOne;
var slotTwo;
var slotThree;
var images = ["//i.imgur.com/9H17QFk.png", "//i.imgur.com/9RmpXTy.png", "//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;
$($('.slot')[0]).html('1] + '">');
$($('.slot')[1]).html('1] + '">');
$($('.slot')[2]).html('1] + '">');
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();
});
});
script>
<div>
<div class = 'container inset'>
<div class = 'header inset'>
<img src='/images/freecodecamp_logo.svg' alt='learn to code JavaScript at Free Code Camp logo' class='img-responsive nav-logo'>
<h2>FCC Slot Machineh2>
div>
<div class = 'slots inset'>
<div class = 'slot inset'>
div>
<div class = 'slot inset'>
div>
<div class = 'slot inset'>
div>
div>
<br/>
<div class = 'outset'>
<button class = 'go inset'>
Go
button>
div>
<br/>
<div class = 'foot inset'>
<span class = 'logger'>span>
div>
div>
div>
<style>
.slot > img {
margin: 0!important;
height: 71px;
width: 50px;
}
.container {
background-color: #4a2b0f;
height: 400px;
width: 260px;
margin: 50px auto;
border-radius: 4px;
}
.header {
border: 2px solid #fff;
border-radius: 4px;
height: 55px;
margin: 14px auto;
background-color: #457f86
}
.header h2 {
height: 30px;
margin: auto;
}
.header h2 {
font-size: 14px;
margin: 0 0;
padding: 0;
color: #fff;
text-align: center;
}
.slots{
display: flex;
background-color: #457f86;
border-radius: 6px;
border: 2px solid #fff;
}
.slot{
flex: 1 0 auto;
background: white;
height: 75px;
width: 50px;
margin: 8px;
border: 2px solid #215f1e;
border-radius: 4px;
text-align: center;
}
.go {
width: 100%;
color: #fff;
background-color: #457f86;
border: 2px solid #fff;
border-radius: 2px;
box-sizing: none;
outline: none!important;
}
.foot {
height: 150px;
background-color: 457f86;
border: 2px solid #fff;
}
.logger {
color: white;
margin: 10px;
}
.outset {
-webkit-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);
-moz-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);
box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);
}
.inset {
-webkit-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);
-moz-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);
box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);
}
style>
images
,我们可以通过不同的索引来获取每个图片。$($('.slot')[0]).html('');
注:资料整理自FCC中文站