JavaScript
1、什么是JavaScript
JavaScript是一门世界上最流行的脚本语言。
一个合格的后端人员,必须要精通JavaScript
2、快速入门
2.1、引入JavaScript
1.内部标签
<script>
//
</script>
2、外部引入
2.2、基本语法
严格区分大小写
在控制台输入console.log(); 在浏览器的控制台打印变量
2.3、数据类型
number
js不区分小数和整数,Number
NaN: not a number 不是一个数字
Infinity 无限大
比较运算符(重要)
=
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结果为true)
须知:
- NaN===NaN, 这个与所有的都不相等
- 只能通过isNaN(NaN)来判断这个数是否是NaN
浮点数问题:
console.log((1/3)===(1-2/3))//flase
尽量避免使用浮点数进行运算,因为存在精度问题
对象
对象是大括号,数组是中括号[]
每个属性之间用逗号隔开,最后一个不需要添加
<script>
//Person person = new Person();
var person = {
name: "yt",
age: 19,
flag: [1,2,'abc',"...."]
}
</script>
2.4、严格检查模式
使用‘use strict’ ;严格检查模式,预防JavaScript的随意性导致产生的一些问题,而且必须写在第一行
局部变量建议使用let来定义
3、数据类型
3.1、字符串
1、多行字符串的编写:着重号
tab键上面,esc下面的键
2、字符串不可变
3、大小写转换,注意使用方法,toUpperCase(),
3.2、数组
Array可以包含任意的数据类型
1、数组长度可以任意改变
2、slice() 截取Array的一部分,返回一个新数组,类似于String中的substring()
3、push(), pop()
push: 压入到尾部
pop:弹出尾部第一个元素
4、unshift(), shift() 头部
unshift() :压入到头部
shift() :弹出头部第一个元素
5、排序sort()
6、reverse() 翻转
7、concat() 拼接
注意,并没有修改数组
8、连接符join,使用特定的字符来拼接数组
var arr = ["a","b",'c'];
arr.join('-')
"a-b-c"
3.3、对象
1、若干键值对
var person = {//对象名 person
//属性名: 属性值
name: "yt",
age: 19,
flag: [1,2,'abc',"...."]
}
JS中的对象,{。。。} 表示一个对象,键值对描述对象 xxxx:xxxx
多个属性用逗号隔开,最后一个属性不需要逗号
2、使用一个不存在的对象属性,不会报错!undefined
3、动态的删除属性,通过delete删除对象属性
4、动态的添加,直接给新的属性添加值即可
5、判断属性值是否在对象中! a in b!
3.4、流程控制
1.if判断
2、while循环
3、for循环
4、forEach循环
3.5、Map和Set
Map:
var map = new Map([['tom',100],['jack',90],['mike',80]]);
var name = map.get('tom');
map.set('admin',456);
console.log(name);
Set:无序不重复的集合
3.6、迭代器
遍历Map
var map = new Map([['tom',100],['jack',90],['mike',80]]);
for (let x of map){
console.log(x);
}
/*Array [ "tom", 100 ]
2.html:11:21
Array [ "jack", 90 ]
2.html:11:21
Array [ "mike", 80 ]
*/
遍历数组
var arr = [1,2,3,4];
for (let x of arr){
console.log(x);
}
遍历Set
var set = new Set([4,5,6]);
for (let x of set){
console.log(x);
}
4、 函数
4.1、定义函数
参数问题:JavaScript可以传任意一个参数,也可以不传递参数
arguments
arguments 是js免费赠送的关键字
代表传递进来的所有的参数,是一个数组!
rest
function aaa(a,b,...rest) {
console.log(a);
console.log(b);
console.log(rest);
}
/*
aaa(111,222,'bbb')
111
222
Array [ "bbb" ]
*/
ES6引入的新特性,获取除了已经定义的参数之外的所有参数
注意事项:rest参数必须只能定义在最后,必须使用...标识
4.2、变量的作用域
在JavaScript中,var定义的变量是有作用域的。
如果变量定义在函数体中,则在函数体外不能引用
function yt() {
var x = 1;
x = x + 1;
}
x = x + 2;//Uncaught ReferenceError: x is not defined
如果两个函数定义了两个相同的变量,则不会有影响
内部函数可以访问外部函数的成员,反之则不行
内部函数和外部函数的变量重名,函数查找变量从自身开始,由内向外查找,内部函数会屏蔽外部函数的变量。
提升变量的作用域
function yt() {
var x = "a" + y;
console.log(x);
var y = 'b';
}
运行结果:aundefined
说明:js执行引擎,自动提升了y的声明,但不会提升变量y的赋值
function yt() {
var y;
var x = "a" + y;
console.log(x);
y = 'b';
}
养成规范:所有变量都声明在函数的头部,便于代码维护
全局对象window
JavaScript实际上只有一个全局作用域
规范
由于所有的全局变量都会绑定到window上。如果不同的js文件,使用相同的全局变量,会产生冲突
//唯一的全局变量
var Yt = {};
//定义全局变量
Yt.name = 'yt';
Yt.add = function (a, b) {
return a + b;
}
把自己的代码放入自己定义的唯一空间名字中,降低全局命名冲突的问题
局部作用域 let
建议都使用let来定义局部变量
常量 const
4.3、方法
定义方法
方法就是把函数放在对象的里面,对象只有属性和方法
this代表什么呢?
apply
apply可以控制this 的指向
5、内部对象
5.1、Date
基本使用
var now = new Date();
now.getFullYear();//年
now.getMonth();//月
now.getDate();//日
now.getDay();//星期
now.getHours();//时
now.getTime();//1628340920324 时间戳
转换
now.toLocaleString();//注意调用时使用方法
5.2、JSON
是什么?
是一种轻量级的数据交换格式;
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在JavaScript一切皆为对象、任何js支持的类型都可以用JSON来表示
格式:
- 对象都用{}
- 数组都用[]
- 所有的键值对都用 key : value
JSON字符串和JS对象的转换
var user = {
name : 'yt',
age : 19,
sex : 'man'
}
//对象转换为JSON字符串 {"name":"yt","age":19,"sex":"man"}
var jsonUser = JSON.stringify(user);
//json字符串转换为对象,parse()的参数为json字符串
var obj = JSON.parse('{"name":"yt","age":19,"sex":"man"}')
6、面向对象编程
class继承
1、定义一个类和方法
//定义一个类
class Student{
constructor(name){
this.name = name;
}
hello(){
alert('hello');
}
}
var yt = new Student('yt');
2、继承
class yy extends Student{
constructor(name,grade){
super(name);
this.grade = grade;
}
}
原型链
_ proto _:
7、操作BOM对象(重点)
BOM:浏览器对象模型
- IE 6-11
- Chrome
- Safari
- FireFox
window
window代表浏览器窗口
window.innerHeight
76
window.innerWidth
911
navigator
navigator封装了浏览器的信息
大多数不会使用,很容易被人为修改
screen
screen.width
911
screen.height
512
location(重要)
location代表当前页面的URL信息
document
document 代表当前页面,HTML DOM 文档数
document.title
"百度一下,你就知道"
获取具体的文档数节点
<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
<script>
var dl = document.getElementById('app');
</script>
获取cookie
document.cookie
"Hm_lvt_dd4738b5fb302cb062ef19107df5d2e4=1628060307,1628128968,1628255816,1628324385"
劫持cookie原理
<script src="aa.js"></script>
//恶意人员:获取你的cookie上次到其他服务器上
服务器端可以设置cookie:httpOnly 来保护
history(不建议使用)
获取浏览器的历史记录
history.back;//后退
history.forward;//前进
8、操作DOM对象(重点)
核心
文本对象模型:就是把文档中的属性,标签,文本转换为对象来管理。
浏览器网页就是一个Dom树形结构!
-
更新:更新Dom节点
-
遍历dom节点:得到DOM节点
-
删除
-
添加
要操作DOM节点,就一定需要获得DOM节点
获取DOM节点
<div id="father"> <h1>标题</h1> <p id="p1">段落一</p> <p class="p2">段落二</p> </div> <script> var h1 = document.getElementsByTagName('h1'); var p1 = document.getElementById('p1'); var p2 = document.getElementsByClassName('p2'); var father = document.getElementById('father'); var chidrens = father.children;//获取父节点下的所有节点
之后尽量都使用jQuery
更新节点
- p1.innerText = '改段落' 修改文本的值
- p1.innerHTML = '123' 可以解析HTML文本标签
8.2 小结
document对象的三个查询方法:
- 如果有id属性,优先使用getElementById方法来进行查询
- 如果没有id属性,则优先使用getElementByName方法来进行查询
- 如果前两者都没有的话,再使用getElementByTagName来进行查询
- 以上三种方法,一定要在页面加载完成之后执行,才能查询到标签对象
getElementById方法例题代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
function onClickFun() {
//alert('点击完成!');
//获取标签的对象
var inputObj = document.getElementById("id1");
// alert(inputObj);[object HTMLInputElement] 这就是dom对象
var inputText = inputObj.value;
// alert(inputText);yt
//验证规则:必须是字母,数组,下划线组成,并且长度是5到12位
var patt = /^\w{5,12}$/;
/*
test()方法用于测试某个字符串,是否匹配需要的规则
匹配则是true,否则false
*/
if (patt.test(inputText)){
alert('用户名合法!');
}else{
alert('用户名不合法!');
alert('合法的规则是:必须是字母,数字,下划线组成,并且长度是5到12位');
}
}
</script>
</head>
<body>
用户名:<input type="text" id="id1" value="yt"/>
<button onclick="onClickFun();" style="color: red">点击</button>
</body>
</html>
getElementByName方法例题代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//全选
function checkAll() {
var nameObj = document.getElementsByName('hobby');
// alert(nameObj);[object NodeList]
for (var i = 0; i < nameObj.length; i++){
nameObj[i].checked = true;
}
}
//全不选
function checkNo() {
var nameObj = document.getElementsByName('hobby');
// alert(nameObj);[object NodeList]
for (var i = 0; i < nameObj.length; i++){
if(nameObj[i].checked == true){
nameObj[i].checked = false;
}
}
}
//反选
function checkReverse() {
var nameObj = document.getElementsByName('hobby');
// alert(nameObj);[object NodeList]
for (var i = 0; i < nameObj.length; i++){
nameObj[i].checked =!nameObj[i].checked ;
}
}
</script>
</head>
<body>
兴趣爱好:
<input type="checkbox" name="hobby" >C++
<input type="checkbox" name="hobby">Java
<input type="checkbox" name="hobby">JavaScript
<br/>
<button onclick="checkAll()">全选</button>
<button onclick="checkNo()">全不选</button>
<button onclick="checkReverse()">反选</button>
</body>
</html>
9、onclick单击事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
window.onload = function () {
var obj = document.getElementById('btn01');
obj.onclick = function () {
alert('点击后!');
}
}
</script>
</head>
<body>
<button id="btn01">点击</button>
</body>
</html>
注意要在window.load = function(){
}
中点击才行,因为要等页面加载之后才能使点击事件有效果