欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

《javascript 学习笔记》

程序员文章站 2022-09-26 13:40:23
注释 1. // This is an in-line comment. 2. /* This is a multi-line comment */ 七种data types(数据类型) undefined(未定义), null(空), boolean(布尔型), string(字符串), symb ......


注释

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 的变量进行运算操作的时候,算出来的结果将会是 NaN,NaN的意思是 "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\".";

 

转义序列列表

Code

Output

\'

单引号

\"

双引号

\\

反斜杠符

\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();

 

带有两个参数的函数, param1 和 param2:

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语句来做比较然后返回true或false已经成为大家的共识:

function isEqual(a,b) {
if (a === b) {
return true;
} else {
return false;
}
}

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

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"