javascript学习笔记

注释

1. // This is an in-line comment.

2. /* This is a

multi-line comment */

七种data types(数据类型)

undefined(未定义),

null(空),

boolean(布尔型),

string(字符串),

symbol(符号),

number(数字),

object(对象)。

Variables(变量)

允许计算机以一种动态的形式来存储和操作数据,通过操作指向数据的指针而不是数据本身来避免了内存泄露。

Variable (变量)的名字可以由数字、字母、$ 或者 _组成,但是不能包含空格或者以数字为首。

当 JavaScript 中的变量被声明的时候,程序内部会给它一个初始值 undefined

当你对一个值为 undefined 的变量进行运算操作的时候,算出来的结果将会是 NaNNaN的意思是 "Not a Number"

当你用一个没有 定义 的变量来做字符串连接操作的时候,它会如实的输出"undefined"

驼峰命名法 来书写一个 Javascript 变量

驼峰命名法 中,变量名的第一个单词的首写字母小写,后面的单词的第一个字母大写。

举个栗子:

var someVariable;

var anotherVariableName;

var thisVariableNameIsTooLong;

i++;

等效于

i = i + 1;

i--;

等效于

i = i - 1;

%运算符来取余

5 % 2 = 1

myVar += 5;

myVar -= 5;

myVar *= 5;

myVar /= 5;

反斜杠 (\) 来转义引号

var sampleStr = "Alan said, \"Peter is learning JavaScript\".";

转义序列列表

CodeOutput
\'单引号
\"双引号
\\反斜杠符
\n换行符
\r回车符
\t制表符
\b退格符
\f换页符

字符串

通过在字符串变量或字符串后面写上 .length 来获得字符串变量 字符串 值的长度。

"Alan Peter".length; // 10

JavaScript中只有字符串类型,没有字符类型。通过[索引] 来获得对应的字符

var firstName = "Charles" 中,你可以使用firstName[0] 来获得第一个位置上的字符。

字符串 的值是 不可变的,这意味着一旦字符串被创建就不能被改变

并不 意味着 myStr 永远不能被改变,只是字符串字面量 string literal 的各个字符不能被改变。

改变 myStr 中的唯一方法是重新给它赋一个值,就像这样:

var myStr = "Bob";

myStr = "Job";

var firstName = "Charles" 中,你可以这样操作firstName[firstName.length - 1] 来得到字符串的最后的一个字符。

firstName[firstName.length - 3] 操作来获得 var firstName = "Charles" 字符串中的倒数第三个字符。

数组

可以在一个地方存储多个数据

var sandwich = ["peanut butter", "jelly", "bread"]

在数组中包含其他数组,就像这样: [["Bulls", 23], ["White Sox", 45]]。这被称为一个 多维数组

像操作字符串一样通过数组索引[index]来访问数组中的数据。

数组索引的使用与字符串索引一样,

不同的是,通过字符串的索引得到的是一个字符,通过数组索引得到的是一个条目。

与字符串类似,数组也是 基于零 的索引,因此数组的第一个元素的索引是 0

var array = [1,2,3];

array[0]; // 等于 1

var data = array[1]; // 等于 2

与字符串的数据不可变不同,数组的数据是可变的,并且可以自由地改变。

var ourArray = [3,2,1];

ourArray[0] = 1; // ourArray等于 [1,2,1]

多维数组看作成是一个 数组中的数组

当使用[]去访问数组的时候,第一个[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

.push() 接受一个或多个参数,并把它“推”入到数组的末尾。

var arr = [1,2,3];

arr.push(4); // 现在arr的值为 [1,2,3,4]

.pop() 函数用来“抛出”一个数组末尾的值。我们可以把这个“抛出”的值赋给一个变量存储起来。

var oneDown = [1, 4, 6].pop();  //现在 oneDown 的值为 6 ,数组变成了 [1, 4]

.shift() 它的工作原理就像 .pop(),但它移除的是第一个元素

unshift(移入)一个元素到数组的头部

用起来就像 .push() 函数一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素。

var myArray = [["John", 23], ["dog", 3]];

myArray.unshift(["Paul", 35]);

函数(function)

我们可以把代码的重复部分抽取出来,放到一个函数(functions)中。

function functionName() {

console.log("Hello World");

}

通过函数名称functionName加上后面的小括号来调用这个函数(function),就像这样:

functionName();

带有两个参数的函数, param1param2

function testFun(param1, param2) {

console.log(param1, param2);

}

接着我们调用 testFun

testFun("Hello", "World");

作用域 涉及到变量的作用范围。在函数外定义的变量具有 全局 作用域。这意味着,具有全局作用域的变量可以在代码的任何地方被调用。

函数内声明的变量,以及该函数的参数都是局部变量,意味着它们只在该函数内可见。

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

下面为例:

var someVar = "Hat";

function myFun() {

var someVar = "Head";

return someVar;

}

函数 myFun 将会返回 "Head",因为 局部变量 优先级更高。

return 语句把数据从一个函数中传出来,

代码执行到return语句时,函数返回一个结果就结束运行了,return后面的语句不会执行。

function plusThree(num) {

return num + 3;

}

var answer = plusThree(5); // 8

队列(queue)是一个抽象的数据结构,队列中的条目都是有秩序的。新的条目会被加到 队列 的末尾,旧的条目会从 队列 的头部被移出。

写一个函数 queue ,用一个数组arr和一个数字item作为参数。数字item添加到数组的结尾,然后移出数组的第一个元素,最后队列函数应该返回被删除的元素。

function queue(arr, item) {

arr.push(item);

var del=arr.shift();

return del;

}

布尔(Boolean)布尔 值要么是true 要么是false

If 语句

function test (myCondition) {

if (myCondition) {

return "It was true";

}

return "It was false";

}

test(true); // returns "It was true"

test(false); // returns "It was false"

相互比较的操作

相等运算符:==

相等运算符比较两个值,如果它们是同等,返回 true,如果它们不等,返回false

1 == 1 // true

1 == 2 // false

1 == '1' // true

"3" == 3 // true

全等(===)是相对于相等操作符(==)的一种操作符。与相等操作符不同的是全等比较严格,它会同时比较元素的值和 数据类型

3 === 3 // true

3 === '3' // false

不相等运算符(!=)与相等运算符是相反的。

不相等运算符中,如果“不为真”并且返回 false 的地方,在相等运算符中会返回true反之亦然

与相等运算符类似,不相等运算符在比较的时候也会转换值的数据类型。

1 != 2 // true

1 != "1" // false

1 != '1' // false

1 != true // false

0 != false // false

不全等运算符(!==)与全等运算符是相反的。

这意味着“不全等”并返回 false 的地方,用全等运算会返回true反之亦然

全等运算符不会转换值的数据类型。

3 !== 3 // false

3 !== '3' // true

4 !== 3 // true

大于运算符(>

5 > 3 // true

7 > '3' // true

2 > 3 // false

'1' > 9 // false

大于等于 运算符(>=

6 >= 6 // true

7 >= '3' // true

2 >= 3 // false

'7' >= 9 // false

小于 运算符(<)比较两个数字的大小

2 < 5 // true

'3' < 7 // true

5 < 5 // false

3 < 2 // false

'8' < 4 // false

小于等于 运算符(<=

4 <= 5 // true

'7' <= 7 // true

5 <= 5 // true

3 <= 2 // false

'8' <= 4 // false

逻辑与 运算符(&&

需要在一次判断中做多个操作。当且仅当运算符的左边和右边都是 true

if (num > 5 && num < 10) {

return "Yes";

}

return "No";

逻辑或 运算符 (||)

如果任何一个操作数是true逻辑或 运算符 (||) 返回true。反之,返回 false

if (num > 10 || num < 5) {

return "No";

}

return "Yes";

if/else语句

if (num > 10) {

return "Bigger than 10";

} else {

return "10 or Less";

}

if (num > 15) {

return "Bigger than 15";

} else if (num < 5) {

return "Smaller than 5";

} else {

return "Between 5 and 15";

}

switch语句

function myTest(val) {

  var answer = "";

  switch(val){

    case 1:

      answer = "alpha";

      break;

    case 2:

      answer = "beta";

      break;

    case 3:

      answer = "gamma";

      break;

    default:

      answer = "stuff";

  }

  return answer;

}

myTest(1); //返回“alpha”

如果你有多个输入值和输出值一样,可以试试下面的switch语句

switch(val) {

  case 1:

  case 2:

  case 3:

    result = "1, 2, or 3";

    break;

  case 4:

    result = "4 alone";

}

所有的比较操作符返回的都是一个boolean值,要么是 true 要么是false

使用 if/else语句来做比较然后返回truefalse已经成为大家的共识:

function isEqual(a,b) {

if (a === b) {

return true;

} else {

return false;

}

}

因为=== 总是返回 truefalse,所以我们可以直接返回比较的结果:

function isEqual(a,b) {

return a === b;

}

对象 object

对象和数组很相似,数组是通过索引来访问和修改数据,对象是通过属性来访问和修改数据的。

对象适合用来存储结构化数据,就和真实世界的对象一模一样,比如一只猫。

var cat = {

"name": "Whiskers",

"legs": 4,

"tails": 1,

"enemies": ["Water", "Dogs"],

"More Space": "Spock"

};

访问对象属性,一个是点操作符(.),一个是中括号操作符([])。

var prop1val = myObj.prop1; // val1

如果你想访问的属性的名称有一个空格,这时你只能使用中括号操作符([])。

提示:属性名称中如果有空格,必须把属性名称用单引号或双引号包裹起来。

myObj['More Space']; // Spock

使用变量来访问属性

var someProp = "propName";

var myObj = {

propName: "Some Value"

}

myObj[someProp]; // "Some Value

像更改属性一样给对象添加属性

看看我们是如何给ourDog添加 "bark"属性:

ourDog.bark = "bow-wow";  或者  ourDog["bark"] = "bow-wow";

删除对象的属性

delete ourDog.bark;

.hasOwnProperty(propname)方法来检查对象是否有该属性。如果有返回true,反之返回 false

var myObj = {

top: "hat",

bottom: "pants"

};

myObj.hasOwnProperty("top");    // true

myObj.hasOwnProperty("middle");   // false

JavaScript Object Notation 简称 JSON

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

这里是一个JSON对象的示例 这是一个对象数组

var ourMusic = [

  {

    "artist": "Daft Punk",

    "title": "Homework",

    "release_year": 1997,

    "formats": [

    "CD",

    "Cassette",

    "LP" ],

    "gold": true

  }

];

通过串联起来的点操作符或中括号操作符来访问JSON对象的嵌套属性

JSON对象可以嵌套对象和数组。

下面是一个嵌套的JSON对象:

var myStorage = {

  "car": {

    "inside": {

    "glove box": "maps",

    "passenger seat": "crumbs"

    },

    "outside": {

      "trunk": "jack"

    }

  }

};

var gloveBoxContents = myStorage.car.inside["glove box"]; // Change this line

下面是如何访问嵌套数组:

var ourPets = {

  "cats": [

    "Meowzer",

    "Fluffy",

    "Kit-Cat"

  ],

  "dogs": [

    "Spot",

    "Bowser",

    "Frankie"

  ]

};

ourPets.cats[1]; // "Fluffy"

ourPets.dogs[0]; // "Spot"

for循环

for ([初始化]; [条件判断]; [计数器])

var ourArray = [];

for (var i = 0; i < 5; i++) {

  ourArray.push(i);

}

最终 ourArray 的值为 [0,1,2,3,4].

while循环

var ourArray = [];

var i = 0;

while(i < 5) {

ourArray.push(i);

i++;

}

Math.random()用来生成一个在0(包括0)到1(不包括1)之间的随机小数,因此Math.random()可能返回0但绝不会返回1。

Math.floor() 向下取整 获得它最近的整数。

随机数是在两个指定的数之间: Math.floor(Math.random() * (max - min + 1)) + min

Regular expressions 正则表达式

被用来根据某种匹配模式来寻找strings中的某些单词。

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;  //2

/ 是这个正则表达式的头部  and 是想要匹配的模式  / 是这个正则表达式的尾部

g 代表着 global(全局),意味着返回所有的匹配而不仅仅是第一个。

i 代表着忽略大小写,意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。

特殊选择器中的一种就是数字选择器\d,意思是被用来获取一个字符串的数字。

在JavaScript中, 数字选择器类似于: /\d/g

在选择器后面添加一个加号标记(+),例如:/\d+/g,它允许这个正则表达式匹配一个或更多数字。

var testString = "There are 3 cats but 4 dogs.";

var expression = /\d+/g;

var digitCount = testString.match(expression);  //["3", "4"]

\s 来选择一个字符串中的空白。

空白字符有 " " (空格符)、\r (回车符)、\n (换行符)、\t (制表符) 和 \f (换页符)。

空白正则表达式类似于:/\s+/g

var testString = "How many spaces are there in this sentence?";

var expression = /\s+/g;

var spaceCount = testString.match(expression).length;  //7

你可以用正则表达式选择器的大写版本 来转化任何匹配。

举个例子:\s 匹配任何空白字符,\S 匹配任何非空白字符。

var testString = "How many non-space characters are there in this sentence?";

var expression = /\S/g;

var nonSpaceCount = testString.match(expression).length;  //49

使用构造函数来创建对象。

构造函数 通常使用大写字母开头,以便把自己和其他普通函数区别开。

var Car = function() {

this.wheels = 4;

this.engines = 1;

this.seats = 1;

};

在 构造函数 中, this 指向被此 构造函数 创建出来的 对象 。

使用 new 关键字 来对它进行调用,如下:

var myCar = new Car();

记住:要使用 new 关键字 去调用构造函数。因为只有这样,Javascript才知道这是要去构造一个新 对象 ,并且把构造函数中的 this 指向这个新对象。

构造函数 中添加 参数

var Car = function(wheels, seats, engines) {

this.wheels = wheels;

this.seats = seats;

this.engines = engines;

};

var myCar = new Car(6, 3, 1);

对象拥有自己的特征,称为 属性,对象还有自己的函数,称为 方法

使用了 this 指向当前(将要被创建的)对象中的 公有属性

我们也可以创建 私有属性私有方法 ,它们两个在对象外部是不可访问的。

使用我们熟悉的var 关键字去创建变量,来替代我们使用 this 创建 属性

var Bike = function() {

  var gear;  //私有属性

  this.getGear = function(){

    return gear;

  };

  this.setGear = function(change){

    gear=change;

  };

};

数组 & 字符串 操作

map 方法可以方便的迭代数组

map 方法会迭代数组中的每一个元素,并根据回调函数来处理每一个元素,最后返回一个新数组。注意,这个方法不会改变原始数组。

回调函数只有一个参数,即数组中元素的值 (val 参数) ,但其实,你的回调函数也可以支持多个参数,譬如:元素的索引index、原始数组arr

//使用 map 方法来为 oldArray 中的每一项增加3,并且在newArray 中保存它们。 oldArray 不应该被改变。

var oldArray = [1,2,3,4,5];

var newArray = oldArray.map(function(val){

  return val+=3;

});  //[4,5,6,7,8]

reduce 用来迭代一个数组,并且把它累积到一个值中。

使用 reduce 方法时,你要传入一个回调函数,这个回调函数的参数是一个 累加器 (比如例子中的 previousVal) 和当前值 (currentVal)。

reduce 方法有一个可选的第二参数,它可以被用来设置累加器的初始值。如果没有在这定义初始值,那么初始值将变成数组中的第一项,而 currentVal 将从数组的第二项开始。

//使用了 reduce 来让数组中的所有值相加:

var array = [4,5,6,7,8];

var singleVal = 0;

singleVal = array.reduce(function(previousVal, currentVal){

return previousVal + currentVal;

},0);    //30

filter 方法用来迭代一个数组,并且按给出的条件过滤出符合的元素。

filter 方法传入一个回调函数,这个回调函数会携带一个参数,参数为当前迭代的项(我们叫它 val )。

回调函数返回 true 的项会保留在数组中,返回 false 的项会被过滤出数组。

//使用 filter 来创建一个新数组,新数组的值是 oldArray中值小于6的元素。不许改变原数组 oldArray

var oldArray = [1,2,3,4,5,6,7,8,9,10];

var newArray = oldArray.filter(function(val){

  return val<6;

});

sort 方法,按字母顺序或数字顺序对数组中的元素进行排序。

sort方法将改变原数组,返回被排序后的数组。

sort 可以把比较函数作为参数传入。比较函数有返回值,当 a 小于 b,返回一个负数;当 a 大于 b ,返回一个正数;相等时返回0。

如果没有传入比较函数,它将把值全部转成字符串,并按照字母顺序进行排序。

//使用 sort 按照从大到小的顺序排序 array

var array = [1, 12, 21, 2];

array.sort(function(a,b){

  return b-a;

});    //[21,12,2,1]

reverse 方法来翻转数组。

var myArray = [1, 2, 3];

myArray.reverse();

结果myArray 变成了 [3, 2, 1]

concat 方法可以用来把两个数组的内容合并到一个数组中。

//将 concatMe 拼接到 oldArray 后面,并且赋值给 newArray

var oldArray = [1,2,3];

var newArray = [];

var concatMe = [4,5,6];

newArray = oldArray.concat(concatMe);

split 方法按指定分隔符将字符串分割为数组。

split 方法传递一个参数,这个参数将会作为一个分隔符。

var string = "Split me into an array";

var array = [];

array = string.split(" ");  //["Split", "me", "into", "an", "array"]

join 方法把数组转换成字符串

里面的每一个元素可以用你指定的连接符来连接起来,这个连接符就是你要传入的参数。

参数可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

arrayObject.join(separator) separator 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

var joinMe = ["Split","me","into","an","array"];

var joinedString = '';

joinedString = joinMe.join(" ");  //"Split me into an array"