概念

JS的作用:JavaScript, 是一门能够运行在浏览器上的脚本语言. 简称JS。简单来说可以处理前端的一些简单的业务逻辑和用户行为、网页事件的触发和监听。
那么既然JS是可以运行在浏览器上的脚本. 并且, 我们知道本质上, 浏览器是执行HTML程序的. 那么如何在HTML中引入JS呢?

  • 方案一
    直接在html的页面 script 标签中编写js代码
    image.png
  • 方案二
    将js代码写在js文件中,然后通过script标签的src属性进行引用
    image.png

数据的基本类型

JS虽然是一个脚本语言. 麻雀虽小, 五脏俱全. 在js中也是可以像其他编程语言一样. 声明变量, 条件判断, 流程控制等等. 我们先看一下JS中的数据类型
在js中主要有这么几种数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 这是数字  
let a =10
//这是字符串
let b ="青樽对月的小屋"
// 这是布尔值
let c =true
// 这是空值
let d = null
// 这是undefined
let e
console.log(a)
console.log(b)
console.log(c)
console.log(d)
console.log(e)

image.png
在js中声明变量用var来声明,当然现在也可以用let,效果一样的,并推荐使用let

在js中使用// 来表示单行注释. 使用/* */表示多行注释.

1
2
3
4
let 变量名; // 创建变量, 此时该变量除了被赋值啥也干不了. 
let 变量名 = 值; // 创建一个变量, 并且有值.
let 变量名 = 值1, 变量名2 = 值2, 变量名3 = 值3.....; // 一次创建多个变量.并都有值
let 变量名1, 变量名2, 变量名3 = 值3; // 创建多个变量. 并且只有变量3有值

数据类型转换

数据类型转换共有两种,一种是显式类型,一种是隐式类型(就是直接在运算过程中自动转化,比如数字11+字符串“100”,两者数据类型不同但运算过程中会转换成相同数据类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// string -> number  :  parseInt(字符串)
var a = "10086";
a = parseInt(a); // 变成整数
console.log(a + 10); // 10096

// number -> string : 数字.toString() 或者 数字 + ""
var a = 100;
var b = a.toString();
var c = a + "";
console.log(b);
console.log(c);

// number -> string: 数字转化成16进制的字符串
var m = 122;
var n = m.toString(16);
console.log(n);

// 进制转换:十六进制的AB的十进制是多少
var d = parseInt("AB", 16); // 171

// 自动转换:弱类型中的变量会根据当前代码的需要,进行类型的自动隐式转化
var box1 = 1 + true;
// true 转换成数值,是1, false转换成数值,是0
console.log(box1); // 2

var box2 = 1 + "200";
console.log(box2);
// ‘1200’ 原因是,程序中+的含义有2种,第一: 两边数值相加, 第二: 两边字符串拼接.但是在js中运算符的优先级中, 字符串拼接的优先级要高于整数
// 值的加减乘除,所以解析器优先使用了+号作为了字符串的拼接符号了,因为程序就需要+号两边都是字符串才能完成运算操作,因此1变成字符串了。最终的结果就是 "1" +"200"

var box3 = 1 - "200";
console.log(box3); // -199;因为-号中表示的就是左边的数值减去右边的数值,因此程序就会要求"200"是数值,因此内部偷偷的转换了一下

字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// split   正则分割,经常用于把字符串转换成数组
var str = "广东-深圳-南山";
var ret = str.split("-");
console.log( ret );

// substr 截取
var str = "hello world";
var ret = str.substr(0,3);
console.log(ret); // hel

// trim 移除字符串首尾空白
var password = " ge llo ";
var ret = password.trim();
console.log(ret) // ge llo
console.log(password.length); // 13
console.log(ret.length); // 6

// 切片,当前方法支持使用负数代表倒数下标(从0开始)
// slice(开始下标) 从开始位置切到最后
// slice(开始下标,结束下标) 从开始下标切到指定位置之前
var str = "helloworld";
var ret = str.slice(3,6); // 开区间,不包含结束下标的内容
console.log(ret); // low
var ret = str.slice(5);
console.log(ret); // world
var ret = str.slice(2,-1);
console.log(ret); // lloworl

s.substring(start, end) //字符串切割, 从start切割到end
s.length //字符串长度
s.charAt(i) //第i索引位置的字符 s[i]
s.indexOf('xxx') //返回xxx的索引位置, 如果没有xxx. 则返回-1
s.lastIndexOf("xxx") //返回xxx的最后一次出现的索引位置,如果没有xxx. 则返回-1
s.toUpperCase() //转换成大写字母
s.startsWith("xxx") //判断是否以xxx开头
s.charCodeAt(i) //某个位置的字符的ascii
String.fromCharCode(ascii) //给出ascii 还原成正常字符

字符串正则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// match  正则匹配
// js中也存在正则,正则的使用符号和python里面是一样的
//语法:/正则表达式主体/修饰符(可选)
//修饰符:
//i:执行对大小写不敏感的匹配。
//g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。

var str = "我的电话是: 13312345678,你的电话: 13512345678";
var ret = str.match(/\d{11}/g); // 匹配,提取数据
console.log(ret);

// replace 正则替换
var str = "我的电话是: 13512345678";
var ret = str.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2"); // 正则的捕获模式 $1$2表示的正则中第一个和第二个小括号捕获的内容
console.log(ret);

// search 正则查找,如果查找不到,则返回-1
var str = "hello";
var ret = str.search(/l/);
console.log(ret);

运算符(逻辑和三目运算符)

1
2
3
4
5
6
7
8
9
10
11
12
//逻辑运算符
&& //并且 and 两边的运算结果为true,最终结果才是true
|| // 或者 or 两边的运算结果为false,最终结果才是false
! //非 not 运算符的结果如果是true,则最终结果是false ,反之亦然.


//条件运算符[三目运算符]
//条件?true:false
//例如:
var age = 12;
var ret = age>=18?"成年":"未成年";
console.log(ret);

流程控制语句

  • 顺序结构(从上向下顺序执行)
  • 分支结构
  • 循环结构

之前我们学习的方式就是顺序执行,即代码的执行从上到下,一行行分别执行。

例如:

1
2
3
4
console.log("星期一");
console.log("星期二");
console.log("星期三");

分支结构

  • if 分支语句
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    if(条件){
    // 条件为true时,执行的代码
    }

    if(条件){
    // 条件为true时,执行的代码
    }else{
    // 条件为false时,执行的代码
    }

    if(条件1){
    // 条件1为true时,执行的代码
    }else if(条件2){
    // 条件2为true时,执行的代码

    }....

    }else{
    // 上述条件都不成立的时候,执行的代码
    }
  • switch语句
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    switch(条件){
    case 结果1:
    满足条件执行的结果是结果1时,执行这里的代码..
    break;
    case 结果2:
    满足条件执行的结果是结果2时,执行这里的代码..
    break;
    .....
    default:
    条件和上述所有结果都不相等时,则执行这里的代码
    }

    switch('a'):
    case 1: //只会会执行case 1下面的xxx代码
    xxx
    break;
    case 2:
    xxx
    break;
    default:
    xxx
    break

1、switch比if else更为简洁

2、执行效率更高。switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。

3、到底使用哪一个选择语句,代码环境有关,如果是范围取值,则使用if else语句更为快捷;如果是确定取值,则使用switch是更优方案。

循环语句

  • while循环
1
2
3
4
while(循环的条件){
// 循环条件为true的时候,会执行这里的代码
}

循环案例:

1
2
3
4
5
var count = 0
while (count<10){
console.log(count);
count++;
}
  • for循环
1
2
3
4
5
6
7
8
9

// 循环三要素
for(1.声明循环的开始; 2.条件; 4. 循环的计数){
// 3. 循环条件为true的时候,会执行这里的代码
}

for(循环的成员下标 in 被循环的数据){
// 当被循环的数据一直没有执行到最后下标,都会不断执行这里的代码
}

循环案例:

1
2
3
4
5
6
7
8
9
10
11
// 方式1
for (var i = 0;i<10;i++){
console.log(i)
}

// 方式2
var arr = [111,222,333]
for (var i in arr){
console.log(i,arr[i])
}

  • 退出循环(break和continue)
1
2
3
4
5
6
7
for (var i = 0;i<100;i++){
if (i===88){
continue // 退出当次循环
// break // 退出当前整个循环
}
console.log(i)
}

数组对象

  • 数组方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var arr = ["A","B","C","D"];
// 内置属性
console.log( arr.length );
// 获取指定下标的成员
console.log( arr[3] ); // D
console.log( arr[arr.length-1] ); // 最后一个成员

// (1) pop() 出栈,删除最后一个成员作为返回值
var arr = [1,2,3,4,5];
var ret = arr.pop();
console.log(arr); // [1, 2, 3, 4]
console.log(ret); // 5


// (2) push() 入栈,给数组后面追加成员
var arr = [1,2,3,4,5];
arr.push("a");
console.log(arr); // [1, 2, 3, 4, 5, "a"]


// (3) shift是将数组的第一个元素删除
var arr = [1,2,3,4,5];
arr.shift()
console.log(arr); // [2, 3, 4, 5]

// (4) unshift是将value值插入到数组的开始
var arr = [1,2,3,4,5];
arr.unshift("bobo")
console.log(arr); // ["bobo",1,2, 3, 4, 5]


// (5) reverse() 反转排列
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1]

// (6) slice(开始下标,结束下标) 切片,开区间
var arr = [1,2,3,4,5];
console.log(arr.slice(1,3));


// (7) concat() 把2个或者多个数组合并
var arr1 = [1,2,3];
var arr2 = [4,5,7];
var ret = arr1.concat(arr2);
console.log( ret );


// (8) join() 把数组的每一个成员按照指定的符号进行拼接成字符串
var str = "广东-深圳-南山";
var arr = str.split("-");
console.log( arr ); // ["广东", "深圳", "南山"];

var arr1 = ["广东", "深圳", "南山"];
var str1 = arr1.join("-");
console.log( str1 ); // 广东-深圳-南山

  • 遍历数组
1
2
3
4
var arr = [12,23,34]
for (var i in arr){
console.log(i,arr[i])
}