基础
# 输入和输出:
- prompt("请输入您的银行卡密码:"); 引导信息;
- alert('你真好看'); 弹出框;
- console.log("控制台输出的信息");
- document.write("
页面中输出123
"); 可以识别html标签;
# 变量的命名规范:
- 变量以字母、数字、下划线、$符号组成;
- 变量名字不能用数字作为开头、不能使用关键字或保留字;
- 变量名字是区分大小写的;
# 数据类型:
- 简单数类型:numder(NaN)数字类型、string(字符串类型)、Boolean(布尔类型)、undefined、Null、
- 复杂数据类型:Object(对象)
- NaN:即非数值(Not a Numder) 是一种特殊的number类型值;任何和NaN运算的结果都为NaN;和自己也不相等;
# 数据类型的相互转换:
# 其他类型转数字类型:
typeof 用来检测数据类型;
Number(); 较为严格;
- 一定可以转出数字类型;
- 字符串转数字:字符串中有一个不是数字字符则为NaN;
- Boolean(布尔类型):NaN;
- undefined: NaN;
- Null:0;
parseInt(); 转整数:
- 字符串转整数:只要在字符串中,数字前面没有非数字字符,那么都可以将非数字前面的所有数转出整数, 否则为NaN;
- Boolean(布尔类型):NaN;
- undefined: NaN;
- NaN: NaN;
- Null:NaN;
parseFloat(); 转浮点数;
# 操作符:
分支语句:
- 判断的是布尔类型(隐式转换);
if (/* 条件表达式 */) {
// 执行语句
}
if (/* 条件表达式 */){
// 成立执行语句
} else {
// 否则执行语句
}
if (/* 条件1 */){
// 成立执行语句
} else if (/* 条件2 */){
// 成立执行语句
} else if (/* 条件3 */){
// 成立执行语句
} else {
// 最后默认执行语句
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 三元表达式:
三元表达的可以说是if.....else语法的一种简化写法;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var a = 10; var b = 20; //三元表达式: var c = a = b ? a : b; console.log(c); //10 </script> </body> </html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# switch语句:
- 判断结果和常量1进行比较,若成立则执行里面的代码;所不成立则继续和常量2比较,若成立则执行里面的代码....
- switch语句的判断是严格模式(全等比较);
- break可以省略,若是省略则代码会继续向下执行;
switch (expression) {
case 常量1:
语句;
break;
case 常量2:
语句;
break;
case 常量3:
语句;
break;
…
case 常量n:
语句;
break;
default:
语句;
break;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 清空数组:
- 重点: arr.length = 0;可以用于清空数组;
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 1, 1, 1];
console.log(arr.length);
// 清空数组
arr.length = 0;
console.log(arr);
// 字面量的方式创建数组有一个情况:只有一个数据
var arr_1 = [90];
console.log(arr_1);
//构造函数的方式创建数组,如果只有一个数据,则表示长度为90的空数组;
var arr_2 = new Array(90); // 长度为90的空数组;
console.log(arr_2);
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 求数组中的最大值:
- 定义一个变量(假设为最大值)用于做比较;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 28, 3, 4, 10, 6, 7, 8, 9];
// 声明一个变量假设第一个为最大值;
var max = arr[0];
for (var i = 1; i <= arr.length - 1; i++) {
// 每次循环都让max做比较;
// 如果假设的最大值(max)小于某个数,则把它从新赋值给max;
// 如果判断不成立则继续下一次循环直到和所有的数字比较完毕;
// 不能写成arr[0]<arr[i];因为会被替换掉;要把arr[0]赋值给变量;
// 变量max只是改变了指向,arr[0]的值没有被替换;
if (max < arr[i]) {
max = arr[i]
}
}
console.log(max);
</script>
</body>
</html>
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
# 求数组中的最小值:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = [12, 18, 14, 4, 5, 6, 7, 8, 9, 1];
var min = arr[0];
var a;
for (var i = 0; i <= arr.length-1; i++) {
if (min > arr[i]) {
min = arr[i];
}
}
console.log(min);
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 求数组的平均值:
- 注意:此时的sum不能只声明不赋值;
- 平均值的结果不能放在循环里面,因为每次都会除一次。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = [1, 1, 1];
//注意此时的sum不能只声明不赋值;
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
//jun = sum / arr.length;===不正确!!!
}
// 平均值的结果不能放在循环里面,因为每次都会除一次。!!!
// 之所以打印的结果是正确的,是因为最后一次是用和相除得到的结果;
// 所以要放在循环外面,
//定义一个变量用于接收平均值;
var jun = sum / arr.length;
console.log(jun);
</script>
</body>
</html>
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
# 求数组中相同元素的次数:
<script>
var arr = ["c", "a", "z", "a", 'c',"x", "a"];
//定义:一个空对象用于存放键和值;
var obj = {};
//循环遍历数组;
for (var i = 0; i < arr.length; i++) {
// 把当前循环的元素赋值给变量用于判断;
var item = arr[i];
/*判断对象中是否有当前元素(键);
* 若没有则存到对象中并赋值为1,
* 若有则在原来的基础上(值)上加1;
* */
if (obj[item]) {
obj[item] = obj[item] + 1;
} else {
obj[item] = 1;
}
}
console.log(obj);
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 求数组最大值的下标:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
var arr = [12, 18, 14, 0, 5, 6, 7, 8, 9, 1];
// 声明一个变量用于存放下标;
var a;
//假设Max是最大值,则对应的i便是最大值的下标;
var max = arr[0];
for (var i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
/* 只要进入这个判断就说明当前
的这个i是这个max的下标;
那就把i赋值给a;
*/
a = i;
}
}
console.log(max, a);
</script>
</body>
</html>
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
# 根据用户的输入,求一组数中的和:
- 重点:字符串的分割;数字类型的转换;
- 需注意:分割后得到的是数组;但此时还是字符串;需要转换;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 定义变量获取用户的输入;
var asus = prompt('请输入一组数字例:1,2,3');
// 分割:因为我们得到的是字符串;
// 分割后得到的是数组;但此时还是字符串;需要转换
var arr = asus.split(',')
// 遍历数组;
// 定义变量用于求和;初始和为0;
var sum = 0;
for (var i = 0; i < arr.length; i++) {
// 获取每个字符串,并转换
var nam = parseFloat(arr[i]);
sum += nam;
}
alert('和为:' + sum);
</script>
</body>
</html>
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
# 冒泡排序:
- 第一步:找规律:
- 第二部:理解每个数字的比较的过程;
- 第三步:要熟练运用第三方变量的交换理念;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 需求: 一组数据实现从小到大或从大到少排列;
var arr = [2, 4, 16, 6, 21, 8, 9, 0];
//分析:
/* 因为每个数字都要进行一次的比较;
而比较过的数字在下一轮不需要进行比较了;
所以一共比较arr.length - 1轮次;
而每个数字则比较arr.length-i次;
*/
// 外循环控制比较的轮次;
for (var i = 0; i < arr.length - 1; i++) {
// 内循环控制每个数字比较的次数;
for (var j = 0; j < arr.length - 1 - i; j++) {
// 如果成立则进入判断;若不成立则进入下一次循环;
if (arr[j] > arr[j + 1]) {
// 第三方变量用于存放待交换的数据;
// 原理就是arr[j+1]的数据暂时赋值给a,
// 然后arr[j]的数据赋值给arr[j+1],
// 此时的结果是arr[j+1]和arr[j]的结果相同,
// 然后把暂时存在a里面的数据从新赋值给arr[j];
// 此时便实现了交换;
var a = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = a;
}
}
}
console.log(arr);
</script>
</body>
</html>
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
# 知识点小节:
- 函数的调用若要拿到值则要有返回值;
- 返回值可以修改;若后面有值,则返回,若没有值;默认是undefined;
- 函数的调用或方法的调用若不给返回值则打印undefined;
- return中止函数的执行;在函数的执行过程中若遇到return则立即跳出函数体;
# 形参和实参:
若函数定义了形参并且参与了运算,那么函数的调用就要传入实参;否则打印NaN;
形参没有赋值和变量一样为undefined;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> //第一种情况 function f1(a) { var b=8+a; console.log(b) } f1();//NaN //第二种情况: function f1(a) { // var b=8+a; console.log(a); } f1();//undefined </script> </body> </html>
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
# arguments伪数组:
- arguments伪数组:可以获取所有实参的对象,函数内部的变量(不是我们声明的,也不需要我们声明);
- 有下标,有长度,可遍历;
- 应用场景:当我们不知道我们的参数个数的时候;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
function f1() {
console.log(arguments.length);
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
// var sum = 0; 不能写在这里,因为每次循环都会被重新赋值给覆盖掉;
sum += arguments[i];
}
console.log(sum);
return sum;
}
f1(1, 2, 3, 4, 5, 6, 7, 8, 9)
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 匿名函数:
匿名函数:没有名字的函数,但是在js的语法中,是不允许匿名函数单独存在的,要配合其它语法使用;
匿名函数的自调用,加载页面后,自动执行一个函数;
也可以称为:沙箱;
- 防止全局变量被污染;
- 沙箱不能主动去影响外部的世界;为保证沙箱的封闭;
- 需要传入实参:window;
- 定义形参接收window;
- 形参可以该名字,全局变量window不能改名字;
// 定义之后,立刻调用,输出10
(function(){
console.log(10);
})();
2
3
4
# 回调函数:
函数也是数据类型,也可以作为别的函数的参数;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> // fn 只不过在函数内部是一个形参,内部变量; function f1(a, fn) { console.log(a); //10; // 函数的调用,在函数名的后面加括号; // 这样,把函数作为实参传入,传入的函数对外面函数的调用叫回调函数; fn(); } function f2() { console.log('f2函数执行了'); //f2函数执行了 } f1(10, f2); // 输出 10 和 'f2函数执行了' f2是f1的回调函数; </script> </body> </html>
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
# 作用域:
全局变量:在全局作用域下用var声明的变量是全局变量;全局变量任何地方都可以访问的;
隐式全局变量:不使用var声明的变量;
- 全局变量不能删除;
- 隐式全局变量可以删除;
局部变量:在局部作用域下声明的变量是局部变量;
全局作用域:全局变量的生效范围区域;
局部作用域:局部变量的生效范围区域;
局部变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁; 在es5之前没有块级作用域的的概念,只有函数作用域**,
1
2
# 作用域链:
只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。 将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。
1
2
3
# 预解析:
在代码执行的过程中,js引擎会进行预解析;
预解析时,变量声明在前,函数声明在后;
- 在函数名和var变量名冲突的时候,预解析会舍弃var声明的变量;
- 原因:后来者居上;
- 在函数的名字和变量的名字相同的时候,若a函数的调用顺序在变量下面则会报错;
只能预解析用var声明的变量,没有用var声明的变量(隐式全局变量)不会被解析;
预解析会把用var声明的变量,提到当前作用域的最顶端(只是声明提前);
预解析会把函数声明,提到当前作用域的最顶端(只是声明提前);
// 观察下面的代码,说出执行结果 var num = 10; fun(); console.log(num); function fun() { console.log(num); var num = 20; } //结果: undefined 10 function fun() { console.log(num); } var num = 10; fun(); console.log(num); //结果: 10 10 var num = 10; fun(); console.log(num); function fun() { console.log(num); num = 20; } //结果: 10 20 function f1() { console.log(num) } // var num=20;//20 f1(); var num=20;//undefined /* *分析: *第一步预解析; * 函数调用的时候,var 虽然是全局变量, * 但是f1执行的时候,num=20还未执行, * 所以为undefined; * */
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
# 创建对象及添加属性的方式:
字面量的方式创建对象;
//注意:属性与属性之间或属性与方法之间又 , 隔开; // 字面量的方式创建对象的同时添加属性和方法; var obj = { name: '小明', say: function() { console.log('我叫' + obj.name); //我叫小明 //若没有返回值则打印undefined; return '我叫' + obj.name; } }; console.log(obj.say()); //我叫小明 // 字面量的方式创建对象,并以 . 的方式添加属性和方法; //注意:属性与属性之间或属性与方法之间又 ; 隔开; var obj = {}; obj.name = '小明'; obj.say = function() { console.log('我叫' + obj.name); //我叫小明 return '我叫' + obj.name; } console.log(obj.say()); //我叫小明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22通过内置的构造函数创建对象;
// 通过内置的构造函数创建对象,并以 . 的方式添加属性和方法; // 注意:Object的首字母要大写;属性值要加引号!! var obj = new Object(); obj.name = '小明'; obj.say = function() { console.log('我叫' + obj.name); //我叫小明 return '我叫' + obj.name; } console.log(obj.say()); //我叫小明 // 通过内置的构造函数创建对象,并以键值对的方式添加属性和方法; var obj = new Object(); obj['name'] = '小明'; obj['say'] = function() { console.log('我叫' + obj.name); //我叫小明 return '我叫' + obj.name; }; console.log(obj.say()); //我叫小明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 遍历对象:
对象是一些属性和方法的集合;
可以遍历任意形式的对象;
对象的遍历是以键值对的方式进行的;
此种方法不仅可以遍历对象,还可以遍历数组,此时key代表下标(从0开始);
var obj = {}; // 以键值对的方式添加属性和方法; // 语法: 对象['名字'] = "值"; // 属性和属性之间以, 隔开; obj.key = '小红', obj['name'] = "小明", obj['say'] = function() { console.log(23); } // key代表键(name say)是字符串类型,可以自定义字母, for (var key in obj) { console.log(key, typeof key, obj[key]); //say string 小红; // 若没有 obj.key = '小红',则打印 say string undefined; console.log(key, typeof key, obj.key); //say string 小红; } //遍历数组; var arr=[1,2,3,4,'a','ss','d','f'] for (var key in arr) { console.log(key,arr[key]); };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 往内置对象Math上添加范围随机数:
<script>
// 需求:获取n-m之间的随机数、n<m;
// 封装函数;传入形参;设置返回值;
function f1(n, m) {
// 定义变量,通过Math方法来获取随机数;
// Math方法获取随机数;
// var random_num = Math.random();
// 先获取0~(m - n + 1)之间范围的数;
// random_num = Math.random() * (m - n + 1);
// 因为得到是小数所以要下取整(包含零、包含n)之所以能取到n是因为+1;
// random_num = Math.floor(Math.random() * (m - n + 1));
// +n 获取m-n之间的数;
// var scope = random_num + n;
// 简写;scope==范围
var scope = Math.floor(Math.random() * (m - n + 1)) + n;
// 设置返回值;
return scope;
}
// 往内置对象Math上添加方法;
Math.f1 = function(n, m) {
var scope = Math.floor(Math.random() * (m - n + 1)) + n;
// 设置返回值;
// 传入的实参之所以可以随意调换位置,是因为后面加了一个很大的数n,加为正值了;
return scope;
}
// 调用方法并传入实参;
console.log(Math.f1(80, 50));
</script>
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
# 内置对象:
# Math:数学对象;
- 方法;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
//方法直接调用即可;
Math.random();//随机数、范围[0-1);
Math.ceil();//上取整;
Math.floor();//下取整;
Math.abs(x);//返回值是x的绝对值;
Math.round(x);//把x四舍五入取整;
Math.max(x,y...);//求多个数字中的最大值;
Math.min(x,y...);//求多个数字中的最小值;
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Date:日期/时间对象;
// 创建一个日期对象;
var date = new Date(); //直接输出:当前标准时间;
date.getFullYear();//年份
date.getMonth();//月份 从0开始的;0-11
date.getDate();//日
date.getHours();//小时; 0-23;
date.getMinutes();//分钟;0-59;
date.getSeconds();//秒数;0-59;
date.getMilliseconds();//毫秒0-999;
// 给一个日期格式字符串;
var date = new Date('2019-01-01');
// 分别传入年月日时分秒。注意传入的月份是从0开始算的
var date = new Date(2019,0,1,12,33,12);
//例:特点获得唯一的数字;
// 获取毫秒数 时间戳
var date = new Date();
// 从1970 1 1 到现在的毫秒数
//获取毫秒数的四种方法;
console.log(date.valueOf());
console.log(date.getTime());
console.log(1 * date);
console.log(Date.now());
// 要求:绝对的是唯一的数值;
Math.random() * date.valueOf();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25