FCC 基础JavaScript 练习6
1.对象和数组很相似,数组是通过索引来访问和修改数据,对象是通过属性来访问和修改数据的,
对象适合用来存储结构化数据,就和真实世界的对象一模一样,比如一只猫.
任务
创建一个叫做myDog
的对象,它里面有这些属性: 名称"name"
、 腿"legs"
, 尾巴"tails"
、朋友"friends"
。
你可以设置对象属性为任何你想要的值,只要 "name"
是字符串、 "legs"
和 "tails"
是数字、"friends"
是数组,
// 请只修改这条注释以下的代码
var myDog = { //对象是
"name": "Kitty", //属性有"name","legs" ,"tails","friends",属性名之间用逗号分开
"legs": 4,
"tails": 1,
"friends": ["mikey","bob",["tom","joy"]]
};
2.有两种方式访问对象属性,一个是点操作符(.
),一个是中括号操作符([]
),当你知道属性的名称的时候,使用点操作符
任务
通过点操作符读取对象testObj
,把hat
的属性值赋给变量hatValue
,把shirt
的属性值赋给shirtValue,
// 初始化变量
var testObj = {
"hat": "ballcap",
"shirt": "jersey",
"shoes": "cleats"
};
// 请只修改这条注释以下的代码
var hatValue = testObj.hat; // 请修改这一行//把对象testObj的属性hat的值赋给变量 hatValue
var shirtValue = testObj.shirt; // 请修改这一行//属性名没有空格,不需要加引号,用点号操作符,反之加引号和用中括号操作符
3.如果你想访问的属性的名称有一个空格,这时你只能使用中括号操作符([]
),
提示:属性名称中如果有空格,必须把属性名称用单引号或双引号包裹起来
任务
用中括号操作符读取对象testObj
的属性"an entree"
值和属性"the drink"
值,
// 初始化变量
var testObj = {
"an entree": "hamburger",
"my side": "veggies",
"the drink": "water"
};
// 请只修改这条注释以下的代码
var entreeValue = testObj['an entree']; // 请修改这一行
var drinkValue = testObj["the drink"]; // 请修改这一行
4.中括号操作符的另一个使用方式是用变量来访问一个属性,
当你需要遍历对象的属性列表或查表时,这种方式极为有用,
提示:当我们通过变量名访问属性的时候,不需要给变量名包裹引号。因为实际上我们使用的是变量的值,而不是变量的名称
任务
使用变量 playerNumber
,通过中括号操作符找到 testObj
中 playerNumber
为 16
的值
// 初始化变量
var testObj = {
12: "Namath",
16: "Montana",
19: "Unitas"
};
// 请只修改这条注释以下的代码
var playerNumber=16; // 修改这一行
var player = testObj[playerNumber]; // 修改这一行
5.当你创建了一个对象后,你可以用点操作符或中括号操作符来更新对象的属性,
任务
更新 myDog
对象的name
属性,让它的名字从 "Coder" 变成 "Happy Coder"
// 初始化变量
var myDog = {
"name": "Coder",
"legs": 4,
"tails": 1,
"friends": ["Free Code Camp Campers"]
};
// 请把你的代码写在这条注释以下
myDog.name="Happy Coder";//有点类似于数组更改的方式
6.可以像更改属性一样给对象添加属性
任务
给myDog
添加一个"bark"
属性,设置它的值为狗的声音,例如:"woof"
// 初始化变量
var myDog = {
"name": "Happy Coder",
"legs": 4,
"tails": 1,
"friends": ["Free Code Camp Campers"]
};
// 请把你的代码写在这条注释以下
myDog.bark="woof";
7.同样可以删除对象的属性,例如:
delete ourDog.bark;
任务
删除myDog
对象的"tails"
属性
// 初始化变量
var myDog = {
"name": "Happy Coder",
"legs": 4,
"tails": 1,
"friends": ["Free Code Camp Campers"],
"bark": "woof"
};
// 请把你的代码写在这条注释以下
delete myDog.tails;
8.任务
把switch语句转化为一个叫做lookup的对象
/////////////////////////////////////////////////////////////////
// 定义 phoneticLookup
function phoneticLookup(val) {
var result = "";
// 请只修改这条注释以下的代码
switch(val) {
case "alpha":
result = "Adams";
break;
case "bravo":
result = "Boston";
break;
case "charlie":
result = "Chicago";
break;
case "delta":
result = "Denver";
break;
case "echo":
result = "Easy";
break;
case "foxtrot":
result = "Frank";
}
// 请只修改这条注释以上的代码
return result;
}
/////////////////////////////////////////////////////////////////
// 定义 phoneticLookup
function phoneticLookup(val) {
var result = "";
// 请只修改这条注释以下的代码
var lookup={
"alpha":"Adams",
'bravo':'Boston',
'charlie':'Chicago',
'delta':"Denver",
'echo':"Easy",
'foxtrot':"Frank"
};
// 请只修改这条注释以上的代码
result = lookup[val];
return result;
}
// 你可以修改这一行来测试你的代码
phoneticLookup("charlie");
9.我们可以用.hasOwnProperty(属性名) //属性名是字符串要加引号//
方法来检查对象是否有该属性,如果有返回true
,反之返回 false,
// 初始化变量
var myObj = {
gift: "pony",
pet: "kitten",
bed: "sleigh"
};
function checkObj(checkProp) {
// 请把你的代码写在这条注释以下
var tr = myObj.hasOwnProperty(checkProp); //检查对象是否存在,将结果赋值给tr
if(tr===true){ //判断tr是否true ?(存在)
return myObj[checkProp]; // //存在则返回属性对应的值
}else{
return "Not Found"; //不存在,则返回“Not Found”
} }
// 你可以修改这一行来测试你的代码
checkObj("gift");
10.JavaScript Object Notation 简称 JSON
,它使用JavaScript对象的格式来存储数据,
JSON是灵活的,因为它允许 数据结构 是 字符串,数字,布尔值,字符串,和 对象 的任意组合
提示
数组中有多个 JSON 对象的时候,对象与对象之间要用逗号隔开
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" ]},// 请在这里添加专辑
];
11.
任务
检索JSON对象 myStorage
中嵌套属性 glove box
的值,
因为属性的名字带有空格,请使用中括号操作符来访问属性的值
var myStorage = {
"car": {
"inside": {
"glove box": "maps",
"passenger seat": "crumbs"
},
"outside": {
"trunk": "jack"
}
}
};
// 请只修改这条注释以下的代码
var gloveBoxContents =myStorage.car.inside["glove box"] ; // 请修改这一行
12.
任务
使用点操作符和中括号操作符来检索变量 myPlants
的第二棵树
// 初始化变量
var myPlants = [
{
type: "flowers",
list: [
"rose",
"tulip",
"dandelion"
]
},
{
type: "trees",
list: [
"fir",
"pine",
"birch"
]
}
];
// 请只修改这条注释以下的代码
var secondTree =myPlants[1].list[1]; // 请修改这一行
13.
右边有一个JSON对象,代表着你的专辑集。每一张专辑由一个唯一的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 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;
}
else if(value !==''&&prop =='tracks'){
collectionCopy[id][prop].push(value);
}
else if(value ===''){
delete collectionCopy[id][prop];
}
return collection;
}
// 你可以修改这一行来测试你的代码
update(5439, "artist", "ABBA");
14.
一个条件语句只能执行一次代码,而一个循环语句可以多次执行代码,
JavaScript 中最常见的循环就是“for循环
”,
for循环中的三个表达式用分号隔开:
for ([初始化]; [条件判断]; [计数器])
初始化
语句只会在执行循环开始之前执行一次。它通常用于定义和设置你的循环变量,
条件判断
语句会在每一轮循环的开始执行,只要条件判断为 true
就会继续执行循环。当条件为 false
的时候,
循环将停止执行,这意味着,如果条件在一开始就为 false
,这个循环将不会执行,
计数器
是在每一轮循环结束时执行,通常用于递增或递减,
任务
使用 for
循环把从 1 到 5 添加进 myArray
中。
for循环就是if条件语句的进化版
// 请把你的代码写在这条注释以下
var myArray=[];
for (var i=1;i<6;i++){
myArray.push(i);
}
15.
任务
写一个 for
循环,把从1到9的奇数添加到 myArray
// 初始化变量
var myArray = [];
// 请把你的代码写在这条注释以下
for(i=1;i<10;i+=2){
myArray.push(i);
}
16.for循环也可以逆向迭代,只要我们定义好合适的条件,
为了能够从后往前两两倒数,我们需要改变我们的 初始化
,条件判断
和 计数器
任务
使用一个 for
循环,把9到1的奇数添加进 myArray
// 初始化变量
var myArray = [];
// 请把你的代码写在这条注释以下
for(i=9;i>0;i-=2){
myArray.push(i);
}
17迭代输出一个数组的每个元素是 JavaScript 中的常见需求, for
循环可以做到这一点,
记住数组的索引从零开始的,这意味着数组的最后一个元素的下标是:数组的长度 - 1,
任务
声明并初始化一个变量 total
为 0
。使用 for
循环,使得 total
的值为 myArr
的数组中的每个元素的值的总和
// 初始化变量
var myArr = [ 2, 3, 4, 5, 6];
// 请把你的代码写在这条注释以下
var total=0;
for(var i=0;i<myArr.length;i++){
total+=myArr[i];
}
18.如果你有一个二维数组,可以使用相同的逻辑,先遍历外面的数组,再遍历里面的子数组,
一次输出 arr
中的每个子元素。提示,对于内部循环,我们可以通过 arr[i]
的 .length
来获得子数组的长度,
因为 arr[i]
的本身就是一个数组
任务
修改函数 multiplyAll
,获得 arr
内部数组的每个数字相乘的结果 product,
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]]);
19.另一种类型的 JavaScript 循环被称为while循环
,
因为它规定,当(while)条件为真,循环才会执行,反之不执行,
任务
通过一个 while
循环,把从 0 到 4 的值添加到 myArray
中
// 初始化变量
var myArray = [];
// 请把你的代码写在这条注释以下
var i=0;
while(i<5){
myArray.push(i);
i++;
}
20.
函数 lookUp
有两个预定义参数:firstName
值和prop
属性 ,
函数将会检查通讯录中是否存在一个与传入的 firstName
相同的联系人,
如果存在,那么还需要检查对应的联系人中是否存在 prop
属性,
如果它们都存在,函数返回prop
属性对应的值。
如果firstName
值不存在,返回 "No such contact"
如果prop
属性不存在,返回 "No such property",
//初始化变量
var contacts = [
{
"firstName": "Akira",
"lastName": "Laine",
"number": "0543236543",
"likes": ["Pizza", "Coding", "Brownie Points"]
},
{
"firstName": "Harry",
"lastName": "Potter",
"number": "0994372684",
"likes": ["Hogwarts", "Magic", "Hagrid"]
},
{
"firstName": "Sherlock",
"lastName": "Holmes",
"number": "0487345643",
"likes": ["Intriguing Cases", "Violin"]
},
{
"firstName": "Kristian",
"lastName": "Vos",
"number": "unknown",
"likes": ["Javascript", "Gaming", "Foxes"]
}
];
function lookUp(firstName, prop){
// 请把你的代码写在这条注释以下
for (var i in contacts)
{if (contacts[i].firstName === firstName && prop in contacts[i])
return contacts[i][prop];}
for ( i in contacts)
{ if (prop in contacts[i] ===false)
return "No such property";
}
for ( i in contacts)
{ if (contacts[i].firstName !== firstName)
return "No such contact";}
// 请把你的代码写在这条注释以上
}
// 你可以修改这一行来测试你的代码
lookUp("Akira", "likes");