Basic JavaScript-freecodecamp

1.JavaScript中的注释方式有以下两种:
使用 // 来告诉JavaScript来忽略当前行的代码
// This is an in-line comment.
你也可以使用多行注释来注释你的代码,以/开始,用/来结束,就像下面这样:
/* This is a
multi-line comment */

2.在计算机科学中, data(数据)就是一切,因为它对于计算机的意义重大。JavaScript提供七种不同的data types(数据类型),它们是undefined(未定义), null(空), boolean(布尔型), string(字符串), symbol(符号), number(数字), and object(对象)。
举个栗子, 计算机能够分辨不同的数字, 例如数字 12和 strings,"12"和"dog", 或"123 cats", 都是字母的集合。 计算机能够精确地操作数字, 但是对于字符串却无能为力。
Variables(变量)允许计算机以一种动态的形式来存储和操作数据,通过操作指向数据的指针而不是数据本身来避免了内存泄露,以上的七种数据类型都可以存储到一个变量(variable)中。
Variables 非常类似于你在数学中使用的x,y变量, 这意味着它们都是以一个简单命名的名字来代替我们赋值给它的数据。计算机中的variables(变量)与数学中的变量不同的是,计算机可以在不同的时间存储不同类型的变量。
通过在变量的前面使用关键字var,我们告诉 JavaScript 来创建或者 declare(声明)一个变量,就像这样:
var ourName;
上面代码的意思是创建一个名为ourName的variable(变量),在JavaScript中我们使用分号来结束一段声明。
Variable (变量)的名字可以由数字、字母、$ 或者 _组成,但是不能包含空格或者以数字为首。

3.在JavaScript中,你可以通过assignment(分配)操作符把一个值存储到变量中。
myVariable = 5;
把Number数字5赋给变量myVariable。
赋值过程是从右到左进行的。所有 = 操作符右边的值都会被赋到左边的变量。
myVar = 5;
myNum = myVar;
数值 5 被赋给变量 myVar 中, 然后变量 myVar 又赋给变量 myNum ,这样子 myNum 变量中的值也是 5 了。

4.i++;等效于i = i + 1;

5.JavaScript中只有字符串类型,没有字符类型。那么如何获取到字符串中的某个字符呢?
我们通过[索引] 来获得对应的字符。
大多数现代编程语言,如JavaScript,不同于人类从1开始计数。它们是从0开始计数,这被称为 基于零 的索引。
例如, 在单词 "Charles" 中索引0上的字符为 "C",所以在 var firstName = "Charles" 中,你可以使用 firstName[0] 来获得第一个位置上的字符。

6.可以把 多维 数组看作成是一个 数组中的数组。当使用[]去访问数组的时候,第一个[index]访问的是第N个子数组,第二个[index]访问的是第N个子数组的第N个元素。
例如

var arr = [
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [[10,11,12], 13, 14]
];
arr[0]; // 等于 [1,2,3]
arr[1][2]; // 等于 6
arr[3][0][1]; // 等于 11```

7.index  push()  unshift()  pop()  shift()

8.在一个函数内声明的变量,以及该函数的参数都是局部变量,意味着它们只在该函数内可见。
这是在函数 myTest内声明局部变量loc 的最佳例子:

function myTest() {
var loc = "foo";
console.log(loc);
}
myTest(); // "foo"
console.log(loc); // "undefined"```
在函数外,loc 是未定义的。

9.一个程序中有可能具有相同名称的 局部 变量 和 全局 变量。在这种情况下,局部 变量将会优先于 全局 变量。
下面为例:

var someVar = "Hat";
function myFun() {
  var someVar = "Head";
  return someVar;
}```
函数 myFun 将会返回 "Head",因为 局部变量 优先级更高。

10.在计算机科学中 队列(queue)是一个抽象的数据结构,队列中的条目都是有秩序的。新的条目会被加到 队列 的末尾,旧的条目会从 队列 的头部被移出。
>写一个函数 queue ,用一个数组arr和一个数字item作为参数。数字item添加到数组的结尾,然后移出数组的第一个元素,最后队列函数应该返回被删除的元素。

function queue(arr, item) {
// Your code here
arr.push(item);
var aArr = arr.shift();
return aArr; // Change this line
}
// Test Setup
var testArr = [1,2,3,4,5];
// Display Code
console.log("Before: " + JSON.stringify(testArr));
console.log(queue(testArr, 3)); // Modify this line to test
console.log("After: " + JSON.stringify(testArr));```

11、 运算符 ==

在高尔夫golf游戏中,每个洞都有自己的标准杆数par,代表着距离。根据你把球打进洞所挥杆的次数strokes,可以计算出你的高尔夫水平。
函数将会传送2个参数,分别是标准杆数par 和 挥杆次数strokes ,根据下面的表格返回正确的水平段位。
par 和 strokes 必须是数字而且是正数。


Paste_Image.png

无法通过,一直显示为"Hole-in-one!"

function golfScore(par, strokes) {
  // Only change code below this line
   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!";
  } 
  
  // Only change code above this line
}

// Change these values to test
golfScore(5, 4);

相等操作符,正解如下:

function golfScore(par, strokes) {
  // Only change code below this line
   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!";
  } 
  
  // Only change code above this line
}

// Change these values to test
golfScore(5, 4);

12.把串联的 if/if else 语句改成 switch 语句。

 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";
  }```
##不能通过,什么问题??  

switch(val){
case val === "bob":
answer = "Marley";
break;
case val === 42:
answer = "The Answer";
break;
case val === 1:
answer = "There is no #1";
break;
case val === 99:
answer = "Missed me by this much!";
break;
case val === 7:
answer = "Ate Nine";
break;
default:
answer = "empty string";
}

// Only change code above this line
return answer;
}

// Change this value to test
myTest(7);```

case 后直接跟条件即可。正解如下:

function myTest(val) {
  var answer = "";
  // Only change code below this line
  
  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";
      break;
    
  }
  
  // Only change code above this line  
   return answer; 
}

// Change this value to test
myTest(7);```

#13.?? 逻辑上可行呀   
>【Counting Cards】你需要写一个函数,实现21点算法,它根据参数 card的值来递增或递减变量count,函数返回一个由当前count和 "Bet"(count>0)或"Hold"(count<=0) 拼接的字符串。注意count和"Bet" 或 "Hold"应该用空格分开。
例如:
"-3 Hold"
"5 Bet"
提示:既然card的值为7、8、9时,count值不变,那我们就可以忽略这种情况。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/316258-eb008e96936d3efa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

var count = 0;

function cc(card) {
// Only change code below this line
if(card=2 || card=3 || card=4 || card=5 || card=6){
return count++;
}else if(card=10 || card='J' || card='Q' || card='K' || card='A'){
return count--;
}

if(count>0){
return "count Bet";
}else{
return "count Hold";
}

// Only change code above this line
}

// Add/remove calls to test your function.
// 提示: Only the last will display
cc(2); cc(3); cc(7); cc('K'); cc('A');```

正解如下:

var count = 0;

function cc(card) {
  // Only change code below this line
  var values = {
    2:1,3:1,4:1,5:1,6:1,
    7:0,8:0,9:0,
    10:-1,'J':-1,'Q':-1,'K':-1,'A':-1
  }
  count += values[card];
  return count + ' ' + (count > 0 ? "Bet" : "Hold");
  
  // Only change code above this line
}

// Add/remove calls to test your function.
// 提示: Only the last will display
cc(2); cc(3); cc(7); cc('K'); cc('A');```

14.有两种方式访问对象属性,一个是点操作符(.),一个是中括号操作符([])。
当你知道属性的名称的时候,使用点操作符。

##15.playerNumber
使用变量playerNumber,通过中括号操作符找到testObj中的16。

/ Setup
var testObj = {
12: "Namath",
16: "Montana",
19: "Unitas"
};

// Only change code below this line;

var playerNumber; // Change this Line
var player = testObj[16]; // Change this Line


#正解如下:

// Setup
var testObj = {
12: "Namath",
16: "Montana",
19: "Unitas"
};

// Only change code below this line;

var playerNumber=16; // Change this Line
var player = testObj[playerNumber]; // Change this Line


16.1 有两种方式访问对象属性,一个是点操作符(.),一个是中括号操作符([])。
当你知道属性的名称的时候,使用点操作符。这是一个使用点操作符读取对象属性的例子:

var myObj = {
prop1: "val1",
prop2: "val2"
};
var prop1val = myObj.prop1; // val1
var prop2val = myObj.prop2; // val2```

把switch语句转化为一个叫做lookup的对象。


16.2第二种访问对象的方式就是中括号操作符([]),如果你想访问的属性的名称有一个空格,这时你只能使用中括号操作符([])。这是一个使用中括号操作符([])读取对象属性的例子:

var myObj = {
"Space Name": "Kirk",
"More Space": "Spock"
};
myObj["Space Name"]; // Kirk
myObj['More Space']; // Spock```
提示:属性名称中如果有空格,必须把属性名称用单引号或双引号包裹起来。

16.3

中括号操作符的另一个使用方式是用变量来访问一个属性。当你需要遍历对象的属性列表或查表时,这种方式极为有用。
这有一个使用变量来访问属性的例子:

var someProp = "propName";
var myObj = {
  propName: "Some Value"
}
myObj[someProp]; // "Some Value"```
还有更多:

var myDog = "Hunter";
var dogs = {
Fido: "Mutt",
Hunter: "Doberman",
Snoopie: "Beagle"
}
var breed = dogs[myDog]; // "Hunter"
console.log(breed)// "Doberman"```
提示:当我们通过变量名访问属性的时候,不需要给变量名包裹引号。因为实际上我们使用的是变量的值,而不是变量的名称。

16.4

把switch语句转化为一个叫做lookup的对象。

// Setup
function phoneticLookup(val) {
  var result = "";
  // Only change code below this line
  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";
  }
  // Only change code above this line
  return result;
}
// Change this value to test
phoneticLookup("charlie");

有问题,怎么改?

// Setup
function phoneticLookup(val) {
  var result = "";

  // Only change code below this line
  var lookup={
    alpha : "Adams",
    bravo:"Boston",
    charlie:"Chicago",
    delta: "Denver",
    echo:"Easy",
    foxtrot:"Frank"
    

  // Only change code above this line
  return result;
}

// Change this value to test
phoneticLookup("charlie");

正解如下:

// Setup
function phoneticLookup(val) {
  var result = "";

  // Only change code below this line
  var lookup={
    alpha : "Adams",
    bravo:"Boston",
    charlie:"Chicago",
    delta: "Denver",
    echo:"Easy",
    foxtrot:"Frank"
    };
  result = lookup[val];

  // Only change code above this line
  return result;
}

// Change this value to test
phoneticLookup("charlie");```

#17. 已解决
>修改函数checkObj检查myObj是否有checkProp属性,如果属性存在,返回属性对应的值,如果不存在,返回 "Not Found"。
注意:如果你需要通过变量来访问对象的属性值,请用中括号操作符,点操作符不支持变量。

// Setup
var myObj = {
gift: "pony",
pet: "kitten",
bed: "sleigh"
};

function checkObj(checkProp) {
// Your Code Here
if(myObj.hasOwnProperty("checkProp")){
return checkObj["checkProp"];// return what???
}else{
return "Not Found";
}

}

// Test your code by modifying these values
checkObj("gift");```

正解如下:

// Setup
var myObj = {
  gift: "pony",
  pet: "kitten",
  bed: "sleigh"
};

function checkObj(checkProp) {
  // Your Code Here
  
  return myObj.hasOwnProperty(checkProp) ? myObj[checkProp] : "Not Found";
}

// Test your code by modifying these values
checkObj("gift");

18.JavaScript Object Notation 简称 JSON,它使用JavaScript对象的格式来存储数据。JSON是灵活的,因为它允许 数据结构 是 字符串,数字,布尔值,字符串,和 对象 的任意组合。

什么是 JSON ?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言 *
JSON 具有自我描述性,更易理解

  • JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

19.通过串联起来的点操作符或中括号操作符来访问JSON对象的嵌套属性。
下面是一个嵌套的JSON对象:

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"```

##20.
>使用点操作符和中括号操作符来检索变量 myPlants 的第二棵树。

// Setup
var myPlants = [
{
type: "flowers",
list: [
"rose",
"tulip",
"dandelion"
]
},
{
type: "trees",
list: [
"fir",
"pine",
"birch"
]
}
];

// Only change code below this line

var secondTree = myPlants[1].list[1] ; // Change this line```

写一个函数,它有个三个参数,id、prop、 value。
如果 value !='' 而且prop != 'tracks' ,collectionCopy[id][prop]=value;。
如果 value !='' 而且prop == 'tracks' ,collectionCopy[id][prop].push(value);。
如果 value == '' ,delete collectionCopy[id][prop];。
记住:函数返回的永远是整个对象。

??题目什么意思,不太明白

// Setup
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"
    }
};
// Keep a copy of the collection for tests
var collectionCopy = JSON.parse(JSON.stringify(collection));

// Only change code below this line
function update(id, prop, value) {
  if(value != '' && prop != 'tracks' ){
   return collectionCopy[id][prop]=value;
  }else if(value !=''&&){
    
  }

  return collection;
}

// Alter values below to test your code
update(5439, "artist", "ABBA");```

#22.??完全没思路
>我们有一个对象数组,里面存储着通讯录。
函数 lookUp 有两个预定义参数:firstName值和prop属性 。
函数将会检查通讯录是否存在一个联系人的firstName属性等于firstName值,还会检查对应联系人是否存在 prop属性。
如果它们都存在,函数返回prop属性对应的值。
如果firstName 值不存在,返回 "No such contact"。
如果prop 属性不存在,返回 "No such property"。

//Setup
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){
// Only change code below this line
for(var i=0;i<contacts.length;i++){
if(contacts[i].hasOwnProperty("firstName") && contacts[i].hasOwnProperty("prop") ){
return prop;
}
if(contacts[i].hasOwnProperty("firstName") === false){
return "No such contact";
}

if(contacts[i].hasOwnProperty("prop")===false){
return "No such property";
}
}
// Only change code above this line
}
// Change these values to test your function
lookUp("Akira", "likes");```

正解如下:

//Setup
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){
// Only change code below this line
for(var i=0;i<contacts.length;i++){
    if(contacts[i].firstName == firstName){
        if(contacts[i].hasOwnProperty(prop)){
             return contacts[i][prop];
             } 
              return "No such property";       
         }
    } 
     return "No such contact";
  
  
// Only change code above this line
}

// Change these values to test your function
lookUp("Akira", "likes");

23.我们之前生成的随机数是在0到某个数之间,现在我们要生成的随机数是在两个指定的数之间。
我们需要定义一个最小值和一个最大值。
下面是我们将要使用的方法,仔细看看并尝试理解这行代码到底在干嘛:
Math.floor(Math.random() * (max - min + 1)) + min

24.Regular expressions 正则表达式被用来根据某种匹配模式来寻找strings中的某些单词。
举例:如果我们想要找到字符串The dog chased the cat中单词 the,我们可以使用下面的正则表达式: /the/gi
我们可以把这个正则表达式分成几段:
/ 是这个正则表达式的头部
the 是我们想要匹配的模式
/ 是这个正则表达式的尾部
g 代表着 global(全局),意味着返回所有的匹配而不仅仅是第一个。
i 代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容