JS
JS -----> JavaScript:实现页面上的动态效果
一.JS的理论知识
1.JS的历史及ECMAScript
ECMAScript 一个标准 Es5/Es6
node,js 跑在服务器端的JS
2.JS的三大部分
(1)基础语法 (2)操作浏览器对象 BOM (3)操作文档上的标签 DOM
3.JS的引入方式
(1)script标签内写代码 (head和body都可以写)
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv-"content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<title>Title</title>
<script>
console.log(123)
</script>
</head>
<body>
<script>
console.log(456)
</script>
</body>
</html>
(2)额外引入JS文件
html文件代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv-"content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<title>Title</title>
<script src="JS.js"></script>
<script>
console.log(123)
</script>
</head>
JS文件代码:
console.log("刘某某");
4.JS的语言规范
(1)// 单行注释
(2)/* 多行注释 */
(3)IS中要以分号(;)为结束符 每个语句后面都要加
5.JS的语言基础
(1)变量声明
①JS的变量名可以使用_,数字,字母,$组成,不能以数字开头
②声明变量使用 var 变量名; 的格式来命名
例如:
var a="alex"
注意:变量名是区分大小写的
推荐使用驼峰式命名规则
保留字不能做变量名
补充:ES6新增了let命令,用于声明变量,用法类似于var,但是所声明的变量只在let命令所在的代码块内有效
例如:
for (let i=0;i<arr.length;i++)
ES6新增const用来声明常量,一旦声明,其值不能改变
二.JS的数据类型
var x; x是ungefined类型
var x = "alex";
var x = 123;
1.数值 Number
var a = 123;
var b = 12.34;
var c = 123e5; ====>12300000
var d = 123e-5; ====>0.00123
NAN:表示不是一个数字 (Not A Number)
常用方法:
parseInt("123"); ====>123
parseInt(12.24); =====>12
parseInt("aaa"); =====>NaN
parseFloat("123.456"); ====>123.456
2.字符串 String
var a = "hello";
var b = "world";
var c = a+b; consold.log(c) ====>"helloworld"
常用方法:
方法 |
使用方法 |
.length |
返回长度 |
.trim() |
移除空白 |
.trimLeft() |
移除左边的空白 |
.trimRight() |
移除右边的空白 |
.charAt(n) |
返回第几个字符 |
.concat(value,.....) |
拼接 |
.indexof(substring,start) |
子序列位置 |
.substring(from,to) |
根据索引获取子序列 |
.slice(start,end) |
切片 |
.toLowerCase() |
小写 |
.toUpperCase() |
大写 |
.split(delimiter,limit) |
分割 |
(1)substring(from,to) 如果后面的数小于前面的数,就翻转过来进行获取
var a = " Hello World ";
a.substring(5,2); ====> Hel
(2)slice(start,end) 顾头不顾尾(和python的切片用法一样)
var a = " Hello World ";
a.slice(5,-2); =====> lo Wor
如果切片的值大于字符串的长度,就返回空字符串;如果是列表的话,就返回空列表
(3)indexof(字符串,开始位置) 如果找不到就返回-1
var x = "abcb";
var y = "b";
x.indexof(y); ====> 1
x.indexof(y,2); ====> 3
(4)split(要以什么切割,返回的个数)
var a = " Hello";
a.split(" ",2); ====>["","Hello"]
a.split("",4); ====>[" "," ","H","e"]
反引号和格式化 (反引号可以写多行文本)
var name = "alex";
var age = 45;
var s = '我叫${name}'; =====> 我叫alex
3.布尔值 Boolean
var a = true;
var b = false;
""(空字符串) 0 null undefined NaN 都是false
null的值表示空,一般在需要指定或清空一个变量时才会使用,var name = null;
undefined表示当声明一个变量但未初始化,该变量的默认值是undefined (函数无明确的返回值时,返回的是undefined)
null表示变量的值是空 undefined表示只声明了变量,但还没有赋值
4.对象 Object
(1)允许自定义对象
(2)数组作用:使用单独的变量名来存储一系列的值
var a = [123,"ABC"] console.log(a[1]) ====>"ABC"
常用方法:
方法 |
使用方法 |
.length |
数组的大小 |
.push(元素) |
尾部追加元素 |
.pop() |
获取尾部的元素 |
.unshift(元素) |
头部插入元素 |
.shift() |
头部移除元素 |
.slice(start,end) |
切片 |
.reverse() |
反转 |
.join(seq) |
将数组元素连接成字符串 |
.concat(value,......) |
连接数组 |
.sort() |
排序(默认按ASCii码排) |
.forEach() |
将数组的每个元素传递给回调函数 |
.splice() |
删除元素,并向数组添加新元素 |
.map() |
返回一个数组元素调用函数处理后的值的新数组 |
(1)reverse() 数组的反转,直接操作原来的数组
var a = [11,22,33,44]
a.reverse() ====>[44,33,22,11]
(2)sort() 排序 默认按照ASCII码进行排序
var a = [11,2,3,1,4]
a.sort() ====> [1,11,2,3,4]
正常排序的代码
function sortNumber(a,b){
return a-b
}
var arrl = [11,2,3,1,4]
arrl.sort(sortNumber)
(3)splic(index,howmany,item1,item2,.....) 删除元素,并在删除元素的位置上添加元素
var a = [11,22,33,44]
a.splic(1,1,"aaa,"bbb") ====> 返回的是删除的元素 22
console.log(a) =====> [11,"aaa","bbb",33,44]
5.类型查询
typeof是一个一元运算符
typeof "abc" ====>atring
typeof null ====> object
typeof NaN =====> number
typeof 123 =====>number
typeof undefined =====>undefined
typeof true ======> boolean
6.运算符
(1)算数运算符: + - * / %(取余) ++(加1) --(减1)
(2)比较运算符:> >= < <= != == === !==
==:弱等于 会将两个数类型转换成一致,才进行判断
===:强等于 既判断数值相不相等,还会判断类型相不相等
!=:弱不等于 判断两个数值相不相等,类型不相等也会转换成一致的进行比较
!==:强不等于 既判断数值相不相等,还会判断类型相不相等
(3)逻辑运算符:&&(and) ||(or) !(not)
(4)赋值运算符:= += -= *= /=
7.流程控制
if-else:
var a = 10;
if (a>5){
console.log("true");
}else{
console.log("false");
}
if-else if-else: else if(相当于python中的elif)
var a =10;
if (a>5){
console.log("a>5");
}else if(a<5){
console.log("a<5");
}else{
console.log("a=5");
}
switch: case子句中通常都会加break语句,否则程序会继续执行后续的case中的语句
var day = new Date().getDate();
switch (day){
case 0:
console.log("Sunday");
break;
case 1:
console.log("Monday");
break;
default:
console.log("Friday");
}
for循环
例子1:循环0-9
for (var i = 0; i < 10;i++){
console.log(i);
}
例子2:循环列表
var a = [11,22,33,44]
for (var i = 0; i < a.length;i++){
console.log(a[i]);
}
while循环
var a = 0;
while (a<10){
console.log(a);
a++;
}
三元云算法
var a = 1;
var b = 2;
var c = a > b ? a : b;
python中的三元运算:
a = 1
b = 2
c = a if a>b else b
三.函数
1.函数的定义
(1)普通的函数:
<script>
function f(){
console.log("Hello World");
}
f()
</script>
(2)带参数的函数:
<script>
function f(a,b){
console.log(arguments); //内置的arguments的对象 可以拿到所有元素,通过索引值进行操作
console.log(arguments.length); //拿到元素的长度
console.log(a,b);
}
f(45,23)
</script>
(3)带返回值IDE函数:
<script>
function sum(a,b){
return a+b;
}
console.log(sum(4,5));
</script>
(4)匿名函数: 潜入别的方法中使用
<script>
var a = function(a,b){
return a + b;
};
console.log(a(4,3));
</script>
(5)自执行函数(立即执行函数):变量的私有化,不会影响全局,这个函数执行完之后就立即销毁,不会像其它函数一样可以继续调用
<script>
(function(a,b){
return a+b;
})(1,2);
</script>
window就是一个全局(窗口)
2.匿名函数
(1)forEach (function (传递的元素参数,索引,元素所属的数组对象))
<script>
var a = [11,22,33,44,55];
a.forEach(function (i,a) {
console.log(i,a);
})
</script>
(2)map (function(传递元素参数,索引,元素所属的数组对象))
<script>
var a =[11,22,33,44,55];
a.map(function (i) {
console.log(i+1);
});
</script>
函数的个别问题:
(1)函数不传参,返回NaN
<script>
function f(a,b) {
console.log(a+b);
}
f()
</script>
(2)不管写多少个返回值,默认返回最后一个,如果要返回多个值,要将其放在数组或对象中
<script>
function bar(){
return 10,20,30
}
console.log(bar())
</script>
(3)传多个参数,从头开始数,只用需要的几个
<script>
function foo(a,b){
return a+b
}
console.log(foo(10,20,300));
</script>
(4)内置的arguments对象
<script>
function mysum(a,b){
var ret = 0;
for (var i = 0;i<arguments.length;i++){
ret += arguments[i];
}
console.log(ret);
}
mysum(10,20,30);
</script>
console.log(arguments) ====>打印出来的是一个列表,里面是穿的参数
3.箭头函数 (=>) 在ES6中使用 箭头函数是匿名函数的简写,箭头函数的this是固定
<script>
var a = [11,22,33,44,55];
a.forEach((i)=>{
console.log(i);
})
</script>
循环打印出a里面的内容
4.函数的全局变量和局部变量
在函数内部可以调用函数外部的变量,但是在函数外部不能找函数内部的变量
例子一
function f(){ var x1 = 100;} x1 会报错,因为外不能调用函数内部的变量
例子二
var x2 = 100; function f2(){ console.log(x2);} 打印出来是100 因为内部可以调用函数外部的变量
5.词法分析
在函数调用的前一瞬间,会先形成一个激活对象AO,并会分析一下3个方面:
(1)函数参数:如果有,则将此参数赋值给AO,且值为undefined;如果没有,则不做任何操作
(2)函数局部变量:如果AO上有同名的值,则不作任何操作;如果没有,则将此变量赋值给AO,并且值为undefined
(3)函数声明:如果AO上有,则会将AO上的对象覆盖;如果没有,则不作任何操作
函数内部无论是使用参数还是使用局部变量都到AO上找
例子1:
var age = 18;
function foo(){
console.log(age);
var age = 22;
console.log(age);
}
foo();
在调用函数的前一瞬间,对整个函数进行词法分析:
(1)首先该函数没有参数,没有函数声明,但是有局部变量,但是此时没有与AO同名的值,所以AO.age = undefined,此时词法分析结束
(2)第一个console.log(age)去AO里面找值,此时AO.age = undefined;所以打印出来的是undefined
(3)执行到var age = 22;的时候,将age =22的值赋值给AO.age,所以打印出来的是22
例子2:
var age = 18;
function foo(){
console.log(age);
var age = 22;
console.log(age);
function age(){
console.log("呵呵");
}
console.log(age);
}
foo(); // 执行后的结果是?
在调用函数的前一瞬间,进行词法分析
(1)首先该函数没有参数,有函数的局部变量,但是没有与AO同名的值,此时AO.age = unndefined;
(2)该函数中有函数声明,会将AO上的对象给覆盖,所以AO.age = 那个函数声明,此时词法分析结束
(3)执行第一个console.log(age);的时候去AO里面找,所以打印出来的是函数声明
(4)执行到var age = 22;的时候,将22赋值给AO.age,所以打印出来的是22
(5)执行到最后一个console.log(age)的时候,去AO里面找,此时AO.age = 22,所以打印出来的也是22
6.内置对象和方法
JS中所有事物都是对象:字符串,数字,数组等都是对象
(1)自定义对象
JS的对象的本质上是键值对的集合(Hash结构),但是只能用字符串作为键
①自定义对象的两种方式: a["name"] a.name
方式一:
<script>
var a = {"name":"alex","age":18};
console.log(a.name);
console.log(a.age);
</script>
方式二:
<script>
var person = new Object();
person.name = "alex";
person.age = 18;
</script>
遍历对象中的内容
<script>
var a = {"name":"alex","age":18};
for (var i in a){
console.log(i,a[i]);
}
</script>
②创建对象
<script>
var person = new Object();
person.name = "alex";
person.age = 18;
</script>
7.继承
(1)父类的构造方法
var Person = function(dream){
this.dream = dream;
};
(2)父类方法
Person.prototype.makeDream = function(){
console.log("做白日梦");
};
(3)子类构造方法
var Yellow = function(dream){
Person.call(this,dream)
};
(4)继承父类方法
Yellow.prototype = Object.create(Person.prototype);
(5)修复constructor
Yellow.prototype.constructor = Yellow;
(6)子类方法(自己独有的)
Yellow.prototype.sing = function(){
console.log("龙的传人")
};
(7)实例化对象,调用方法
var p1 = new Person("咸鱼翻身");
console.log(p1.dream);
p1.makeDream();
var p2 = new Yellow("没有蛀牙");
console.log(p2.dream);
p2.makeDream();
p2.sing();
8.Date对象
(1)不指定参数
var d1 = new Date();
console.log(d1.toLocaleString());
(2)参数为日期字符串
var d2 = new Date("2004/3/20 11:12");
console.log(d2.toLocaleString());
var d3 = new Date("04/03/20 11:12");
console.log(d3.toLocaleString());
(3)参数为毫秒数
var d3 = new Date(5000);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());
(4)参数为年月日小时分钟秒毫秒
var d4 = new Date(2004,2,20,11,12,0,300);
console.log(d4.toLocaleString()); //毫秒并不直接显示
Date对象的方法:
var d = new Date(); //getDate() 获取日 //getDay () 获取星期 //getMonth () 获取月(0-11) //getFullYear () 获取完整年份 //getYear () 获取年 //getHours () 获取小时 //getMinutes () 获取分钟 //getSeconds () 获取秒 //getMilliseconds () 获取毫秒 //getTime () 返回累计毫秒数(从1970/1/1午夜)
9.Json对象
var str1 = '{"name":"alex";"age":18}'
var obj1 = {"name":"alex","age":18}
JSON字符串转换成对象 反序列化
var obj = JSON.parse(str1);
JSON对象转换成字符串 序列化
var str = JSON.stringify(obj1);
10.RegExp对象
(1)两种创建正则表达式的方式 \d需要在浏览器里面转义:\\d
第一种:
<script>
var r = new RegExp('^1[3-9][0-9]{9}$');
console.log(r.test("18812341234"));
</script>
第二种:
<script>
console.log(/^1[3-9][0-9]{9}$/.test("18812341234"));
</script>
三个注意事项:
①test()不传值相当于传了一个undefined,undefined会被当成字符串形式的"undefined"来处理
②正则表达式中间不要加空格
③注意全局匹配模式g的lastIndex属性
例子一:
<script>
var r = new RegExp('^[a-zA-Z][a-zA-Z0-9]{5,11}$');
console.log(r.test("yingying")); true
console.log(r.test()); true
console.log(r.test(undefined)); true
console.log(r.test("undefined")); true
var r1 = new RegExp('^[0-9]$');
console.log(r1.test()); false
console.log(r1.test(undefined)); false
console.log(r1.test("undefined")); false
</script>
例子二: i是忽略大小写的匹配模式 g表示全局匹配模式
<script>
var s = "ying YING";
console.log(s.replace("i","哈哈"));
console.log(s.replace(/i/,"嘿嘿"));
console.log(s.replace(/y/i,"呵呵"));
console.log(s.replace(/Y/i,"啦啦"));
console.log(s.replace(/y/gi,"哼哼"));
</script>
例子三:正则表达式加上g就会记录一个lastIndex属性,用来记录下一次从哪里开始匹配
<script>
var r = /alex/g;
console.log(r.test("alex")); true
console.log(r.test("alex")); false
console.log(r.test("alex")); true
console.log(r.lastIndex); 4
console.log(r.test("alex")); false
console.log(r.lastIndex); 0
</script>
11.Math对象
abs(x) 返回数的绝对值。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
例子:任意随机小数
<script>
function myRandom(a,b){
return Math.random()*(b-a)+a
}console.log(myRandom(4,7))
</script>