js
JavaScript
简介
- 使网页有动态行为,可以与用户交互
- ECMAScript 5,Es为规范标准
引入方式
- 1内部标签直接写
- 2外部引用,标签src写js地址
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- <script>-->
<!-- // 注释和java一样-->
<!-- // 第一种引入方式,内部标签-->
<!-- alert('xax');-->
<!-- </script>-->
<!--第二种引入方式,src写js地址,外部引用-->
<script src="js/qj.js"></script>
</head>
<body>
</body>
</html>
浏览器控制台和f12基本使用
- js语法和java差不多,但没有java严格
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//语法和java差不多,没用java严格,但也区分大小写
var a = 3;
var name = "ks";
if (a>2){
alert(name);
}
</script>
</head>
<body>
</body>
</html>
- f12各个块的应用
- 元素 elements 仿写前端界面 可以拿到css和html代码
- 控制台 可以console.log()等调试js
- 源代码 sources 可以断点调试,先断点,再刷新,再调试
- 网络 network 抓包
- 性能内存 performance memory 和内存相关,暂时用不到
- 应用程序 application 存一些数据到浏览器内,主要用来拿cookie
数据类型
-
number
js不区分小数和整数
//小数整数负数就不说了 NaN // not a number Infinity // 无限大 -
字符串
'abc' "abc"都可以
-
布尔值
true false
-
逻辑运算符
且&& 或|| 非!
-
比较运算符
= //赋值 == //等于,只判断值,不判断类型 === //绝对等于,判断值和类型 -
浮点数问题
console.log(1/3===(1-2/3)) false Math.abs(1/3-(1-2/3))<0.0000000001 true -
null和undefined
null 表示定义了没赋值
undefined 表示没定义,越界也会提示这个
-
数组
java必须存同一种,JavaScript不用
var arr = [1,1.2,'a','axb',null,true]//用这个 new Array(1,3,5,7,9,true) -
对象
对象用大括号,逗号隔开属性,最后一个不用逗号
数组用中括号
var person={ name:"ax", age:10, tags:['js','html','css'] }取值
console.log(person.age) 10 console.log(person.name) ax console.log(person.tags) (3) ['js', 'html', 'css']
严格检查模式
// 严格检查,未定义等会红色报错,要写在第一行
'use strict';
// 一般let定义局部变量
let i = 1;
字符串
-
单双引号都可以''或者""
-
转义字符
/* 转义字符都要在单双引号内才有效 常见 \n \t \' \" \u4e2d unicode字符 中字 \x41 ascii码 A */ console.log('a\tb') a b console.log('a\nb') a b -
多行字符串编写
let msg = `first second third` -
模板字符串
// 用``(tap上面esc下面)包住,${}引用 let name = "zhm"; let msgg = `你好啊,${name}`; -
字符串长度,大小写,取值
console.log(student) stuednt console.log(student.length) 7 console.log(student.toUpperCase()) STUEDNT console.log(student.toLowerCase()) stuednt console.log(student.charAt(1)) t console.log(student.indexOf('t')) 1 -
substring
// 下标1的后面所有 console.log(student.substring(1)) tudent // 包左不包右[),2 console.log(student.substring(2,3)) u // 2-4 console.log(student.substring(2,5)) ude -
字符串不可变
student[0] 'S' student[0]='c' 'c' student[0] 'S'
数组
-
length长度可变
//arr长度改变,变长会增加未定义的,变短会丢失后面的数据 var arr = [1,2,3,4,5,6,7] arr (7) [1, 2, 3, 4, 5, 6, 7] arr.length 7 arr.length=3 arr (3) [1, 2, 3] arr.length = 10 arr (10) [1, 2, 3, 4, 5, 6, 7, 空 ×3] arr[7] undefined arr[999] undefined -
indexof() 和slice(begin,end)
// slice和substring差不多,都是截取 // indexof(i) 返回第一个值是i的下标 arr = [1,2,3,4,'1','2','3'] (7) [1, 2, 3, 4, '1', '2', '3'] arr.indexOf(2) 1 arr.indexOf('2') 5 arr.slice(1) (6) [2, 3, 4, '1', '2', '3'] arr.slice(1,4) (3) [2, 3, 4] -
push() 压入尾部
pop() 弹出尾部最后一个
arr (7) [1, 2, 3, 4, '1', '2', '3'] arr.push('a') 8 arr (8) [1, 2, 3, 4, '1', '2', '3', 'a'] arr.pop() 'a' arr (7) [1, 2, 3, 4, '1', '2', '3']unshift() 压入头部
shift() 弹出头部最后一个
arr (7) [1, 2, 3, 4, '1', '2', '3'] arr.unshift('a') 8 arr (8) ['a', 1, 2, 3, 4, '1', '2', '3'] arr.unshift('b') 9 arr (9) ['b', 'a', 1, 2, 3, 4, '1', '2', '3'] arr.unshift('c','d') 11 arr (11) ['c', 'd', 'b', 'a', 1, 2, 3, 4, '1', '2', '3'] arr.shift() 'c' arr.shift() 'd'一次可以压入多个
-
sort()排序默认从小到大
revers()数组反转
concat([])链接返回连接结果,不改变原来数组
arr = ['B','C','A'] (3) ['B', 'C', 'A'] arr.sort() (3) ['A', 'B', 'C'] arr.reverse() (3) ['C', 'B', 'A'] arr.concat('a','b') (5) ['C', 'B', 'A', 'a', 'b'] arr (3) ['C', 'B', 'A'] arr.concat([1,2,3]) (6) ['C', 'B', 'A', 1, 2, 3] -
join()连接符,返回每两个元素被连接
arr = ['B','C','A'] (3) ['B', 'C', 'A'] arr.join(1) 'B1C1A' arr (3) ['B', 'C', 'A'] arr.join('-') 'B-C-A' -
多维数组和java一样
arr=[[1,2],[3,4],[5,6]]; (3) [Array(2), Array(2), Array(2)]0: arr[1][1] 4 arr.length 3 arr[1].length 2
对象
-
定义对象
键值对,定义属性
JavaScript所有键都是字符串,值是任意对象
/* var 对象名 = { 属性名: 属性值, 属性名: 属性值, 属性名: 属性值, 属性名: 属性值 } */ // 最后一个属性不要带逗号 var person = { name : 'zhm', id : '001', score : 0, sex : '男' } -
操作对象属性
person.id '001' person.name 'zhm' person.haha undefined -
动态删除增加属性
delete person.id true person {name: 'zhm', score: 0, sex: '男'} person.haha = 'haha' 'haha' person {name: 'zhm', score: 0, sex: '男', haha: 'haha'} -
判断属性是否在对象中
xxx in xxx 包括父类继承,含有就返回true
hasOwnProperty('') 方法,只看自己,含有就返回true
person {name: 23, score: 0, sex: '男', haha: 'haha', id: 1 // JavaScript所有键都是字符串,值是任意对象 name in person false 'name' in person true 'toString' in person true person.hasOwnProperty('toString') false person.hasOwnProperty('name') true -
JavaScript所有键都是字符串,值是任意对象
person[name] undefined person['name'] 23 name in person false 'name' in person true
流程控制
-
while和do while
if else if
for循环
let i = 1; if (i>0) console.log('i'); console.log('-----------------------------'); while (i<10){ console.log(i++); } console.log('-----------------------------'); for (let j = 0; j < 10; j++) { console.log(i--); } console.log('-----------------------------'); -
几种遍历数组方法
// forEach函数 var arr = [12,3,5,2,6,5,56,5,56]; arr.forEach(function (value) { console.log(value); }) console.log('-----------------------------'); // for ..in ..,取到的是下标 for (var arrKey in arr) { console.log(arr[arrKey]); } // for ..of ..,取到的是值 for (var arrKey in arr) { console.log(arr[arrKey]); }
map和set集合
-
map
-
存键值对,无序,键不可重复,值可以
// Map 是键值对,和java map差不多,无序,无下标,键不可重复,值可重复 var map = new Map([['tom',100],['jerry',98],['faker',111]]); var score = map.get('tom');// 通过键得值 map.delete('jerry');// 删 map.set('sm',666);// 增和改 -
set
存值,无序,无下标,不可重复,重复自动存不了,只能存一个
// set 无序,无下标,不可重复 var set = new Set([1,2,3,4,1,2,3,5]); set.add(8);// 增 // set.add(`1`); // set.add('1'); set.delete(4);// 善 console.log(set.has(1));// 判断是否包含 console.log(set.has('1')); -
用迭代器循环遍历
// map.entries() map.key() map.value()返回迭代器 for (const entry of map.entries()) { console.log(entry); } for (const entry of set.values()) { console.log(entry); }
函数
- 函数和方法的区别
- 对象里有的函数就是方法,对象由属性和方法组成
- 函数是在对象外定义的方法
定义函数
-
第一种
function 函数名(参数){函数体}
function abs(x){ if (x<0){ return -x; } return x; } -
第二种
定义匿名函数,赋值给一个变量
var max = function (x,y){ return x>y?x:y; }; -
arguments
包含所有参数的数组,定义和未定义的,可以用未定义的参数进行操作
function dc(x){ console.log("x->"+x); for (let i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } -
规避不存在参数
主动抛出异常
function abs(x){ // 规避不存在参数,抛出异常 if(typeof x!=="number"){ throw "Not a Number"; } if (x<0){ return -x; } return x; } -
操作未定义参数
...rest 直接获取所有未定义参数存入rest数组
// 1 function ab(a,b){ console.log("a->"+a); console.log("b->"+b); for (let i = 2; i < arguments.length; i++) { // 一个方法多个函数,这里写操作ab后面的参数的函数 } } // 2 function ab2(a,b,...rest){ console.log("a->"+a); console.log("b->"+b); console.log(rest); for (let i = 0; i < rest.length; i++) { // 一个方法多个函数,这里写操作ab后面的参数的函数 } }
变量作用域
-
定义在方法内就是局部变量
-
如果方法1内的方法2定义的变量名x和方法1定义的变量名x重复,那么调用x时优先方法内
-
定义变量最好是先在最前面先定义好所有需要,可以先不赋值
var x = 1; console.log(x+'x'); console.log(y+'y');// undefinedy var y = x+1; console.log(y+'y');// 2y -
定义在方法外,script内就是全局变量
-
全局变量都绑定在window对象下,可以通过window.调用
-
alert也是window的一个变量,函数也可以是一个变量
'use strict' alert('我是alert'); window.alert('我是window.alert'); // alert也是window的一个变量,函数也可以是一个变量 // var alert = function () {} let myalert1 = window.alert; myalert1('我是myalert1'); // 修改alert window.alert = function (x,y) { console.log(x+y); } window.alert(1,2); window.alert = myalert1; window.alert('1,2'); -
局部变量最好都要let,var有时候会作用域混乱
function ml(){ for (let i = 0; i < 10; i++) { console.log(i); } console.log(i);// i is not defined } ml(); -
const修饰常量,不可修改
const PI = '3.14';// 常量不可改 // PI = '1.3';
由于全局变量都在window对象下,合作容易重名,所以最好自己定义一个对象,把需要的变量用对象.变量名定义
// 定义一个对象,用于存自己需要的全局变量,以免和他人都用window存 var zhm = {}; zhm.name = 'xyz'; zhm.x = 123; zhm.fuc = function(){ }
方法
- 就是对象下面的函数
- 方法的定义有两种,1 :后面写function(){} 2 拆开,先定义方法,再:定义的方法名
- 方法调用要(),()为参数列表,空或者写参数
- apply 每个方法都有,方法名.apply(),用于定义方法内this的对象和参数,没用就写空数组[]
- 对象由属性和方法组成,都是k:v键值对
'use strict';
function getName(){
return this.name;
}
var zhmstudy = {
name : 'zhm',
birth : 2001,
age : function () {
let now = new Date().getUTCFullYear();
return now - this.birth;
},
gN : getName
};
var xxxstudy = {
name : 'xxx',
birth : 2001,
age : function () {
let now = new Date().getUTCFullYear();
return now - this.birth;
},
gN : getName
};
getName.apply(zhmstudy,[]);
getName.apply(xxxstudy,[]);
内部对象(常用类)
标准对象
typeof 123 'number' typeof '123' 'string' typeof true 'boolean' typeof NaN 'number' typeof undefined 'undefined' typeof []// []数组 'object' typeof Math.abs 'function' typeof {}// {}对象 'object'
Data
-
基本使用
let now = new Date(); console.log(now); console.log(now.getFullYear());// 年 console.log(now.getMonth());// 月 0-11 console.log(now.getDate());// 日 console.log(now.getDay());// 星期1到6是1-6 星期天是0 console.log(now.getHours());// 时 console.log(now.getMinutes());// 分 console.log(now.getSeconds());// 秒 console.log(now.getTime());// 从1970.1.1 0:0:0到现在的ms数 console.log(new Date(now.getTime()));// 传入ms,返回对应距离1970.1.1的ms的对象 -
转换不同地区的对应时间
now.toLocaleString() '2025/1/5 12:55:41' now.toUTCString() 'Sun, 05 Jan 2025 04:55:41 GMT' now.toDateString// 转地区是方法要带() ƒ toDateString() { [native code] } now.toDateString() 'Sun Jan 05 2025'
JSON
-
JSON是一种数据交换格式,有效提升传输速率
-
JS里一切皆对象,所以JS里的所有支持类型(都是对象)都能转化为JSON字符串
-
JSON是字符串‘ ’包住,js对象是{}包住的
-
两个方法,JSON.stringify(objp)将对象转为字符串,JSON.parse('{"name":"zzz","age":30,"sex":"女"}'),将字符串解析为对应js对象
'use strict'; var objp = { name : 'zhm', age : 3, sex : '男' }; // 把对象转换为JSON字符串 '{"name":"zhm","age":3,"sex":"男"}' let jsonp = JSON.stringify(objp);// typeof Jsonp 'string' // 把字符串转换为对应对象 {name: 'zzz', age: 30, sex: '女'} let newobjp = JSON.parse('{"name":"zzz","age":30,"sex":"女"}');objp {name: 'zhm', age: 3, sex: '男'} typeof objp 'object' jsonp '{"name":"zhm","age":3,"sex":"男"}' typeof jsonp 'string' newobjp {name: 'zzz', age: 30, sex: '女'} typeof newobjp 'object'
面向对象
原型继承
-
关键字 __ proto __
var student = { name : 'zhm', age : 3, run : function(){ console.log(this.name + '...run') } }; var xiaoming = { name: 'xiaoming' }; // 原型继承,意思是小明的原型是student xiaoming.__proto__ = student;
class 定义原型 extends继承
-
本质还是原型继承
-
跟java差不多,更加好用
-
区别在于构造器和方法,构造器constructor(){},方法无返回值
// class extends继承 本质还是原型 class person { constructor(name){ this.name = name; } runa(){ alert(this.name + '...run') } } class teacher extends person{ constructor(name,age) { super(name); this.age = age; } } var xiaogang = new person('xiaogang'); var xiaohong = new teacher('xiaohong',3);xiaohong teacher {name: 'xiaohong', age: 3} // age: 3name: "xiaohong"[[Prototype]]: person // 继承person xiaohong.runa() xiaogang person {name: 'xiaogang'} xiaogang.runa()
操作BOM对象(重点)
- js诞生就是为了操作浏览器,让js在浏览器中运行
- BOM B是BS里的B,object,model,浏览器对象模型
typeof Window// 类 'function' typeof window// 对象 'object'
-
window对象
window 代表浏览器窗口,定义的全局变量默认在window下
window.alert(1) undefined // 可以拖动改变 window.innerHeight 150 window.innerWidth 714 window.outerWidth 782 window.outerHeight 840 -
navigator
封装浏览器信息,用的少(会被人为修改),一般用于判断当前浏览器的属性(手机还是pc)
navigator Navigator {getBattery: undefined, vendorSub: '', productSub: '20030107', vendor: 'Google Inc.', …} navigator.appName 'Netscape' navigator.appVersion '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' navigator.userAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0' -
screen
电脑屏幕尺寸 获取宽高
screen Screen {availWidth: 1536, availHeight: 824, width: 1536, height: 864, colorDepth: 24, …} screen.width 1536 screen.height 864 -
location
当前页面url信息
host: "www.baidu.com"// 主机 hostname: "www.baidu.com" href: "https://www.baidu.com/index.php?tn=02049043_12_pg"// 跳转链接 origin: "https://www.baidu.com" pathname: "/index.php" port: "" protocol: "https:"// 协议 reload: f reload()// 重新加载,刷新 location.assign('https://www.bilibili.com/video/BV1JJ41177di?spm_id_from=333.788.player.switch&vd_source=1b85443d48f3788670100c987a9eb19b&p=19')// 指向其他链接 -
document
代表当前页面,HTML文档树,将html标签转换为对象
var dl = document.getElementById('app');// 通过选择器获取标签 dl <dl id="app"><dt>JAVA</dt><dd>JAVASE</dd><dd>JAVAEE</dd></dl> typeof dl 'object' // 改标题 document.title 'Title' document.title='nb' 'nb' //获取cookie,所以不安全会被劫持,要cookie:httpOnly document.cookie 'BIDUPSID=09CB7A0A2FC5208BDFE2E171A865EF3B; PSTM=1602335167; __bid_n=1852e266e678c4df614207; BAIDU_WISE_UID=wapp_1723430472290_842; BAIDUID=2E1854FDB8086C84E02964AEDCF413C8:SL=0:NR=10:FG=1; BAIDUID_BFESS=2E1854FDB8086C84E02964AEDCF413C8:SL=0:NR=10:FG=1; sug=0; sugstore=0; ORIGIN=2; bdime=0; arialoadData=false; ZFY=dwkvNWoHu04ulgwI3MUpeSzNIPHzB5w9:AWoDtEO7IVk:C; BDRCVFR[r_74CZIkx53]=aeXf-1x8UdYcs; H_PS_PSSID=61027_61360_60853_61522_61568_61613_61631_61635_61573_61557_61721; BD_UPN=12314753; BA_HECTOR=01a524a02haga004a5ak8h0lb1nvbi1jnl6s11u; RT="z=1&dm=baidu.com&si=1497bc64-d415-4f34-b83b-3198f001562e&ss=m5jq8r5w&sl=2&tt=1kq&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=9nu&ul=1fsh&hd=1fsj"' -
history
历史记录
history.back() // 后退 history.forward()// 前进
操作DOM对象
-
html文档树对象模型,操作文档树节点
文档树,下面每个都是节点
-
对文档树节点的增删改查,前端的增删改查
-
获取节点(先获取才能操作)
-
增加新节点
-
删除节点
-
修改节点
-
遍历获取节点
-
获取节点
<body> <div id="father"> <h1>标题</h1> <p class="p1">p1</p> <p id="p2">p2</p> </div> <script> // 对应css选择器 var h1 = document.getElementsByTagName('h1'); var p1 = document.getElementsByClassName('p1'); var p2 = document.getElementById('p2'); var father = document.getElementById('father'); var fa = father.children;// 数组 // p2.nextElementSibling // p2.previousElementSibling </script> </body> -
更新DOM节点
先获取节点,再更新
// 修改DOM var div1 = document.getElementById('div1');// 修改内容,会直接覆盖原来的 div1.innerText = 'new' 'new' // 修改超文本链接,可以识别html div1.innerHTML = '<strong>newnew<strong>' '<strong>newnew<strong>' // 修改样式,下面跟css一样修改 div1.style.color = 'red' 'red' div1.style.fontSize = '50px' '50px' div1.style.background = 'yellow' 'yellow' -
删除DOM节点
删除子节点,要先获取父节点,再通过父节点删除子节点
var p2 = document.getElementById('p2'); var fatherr = p2.parentElement;// 通过子节点获取父节点 fatherr.removeChild(p2);// 通过父节点移除子节点如果通过 var fa = father.children;孩子节点数组删除
fatherr.removeChild(fa[0]);
fatherr.removeChild(fa[1]);
fatherr.removeChild(fa[2]);
是不对的,因为fa数组在动态改变
-
插入节点
appendChild 在最后插入
newElement 创建节点
// 在后面插入 var newp = document.getElementById('newp'); father.appendChild(newp); // 创建节点 var style = document.createElement('style'); // 节点内写html style.innerHTML = 'body{background:red}'; // 给节点属性赋值 style.setAttribute('type','text/css'); document.getElementsByTagName('body')[0].append(style); // 在father 下 div1 插到p1[0]前面 father.insertBefore(div1,p1[0]); father.insertBefore(div1,p2);
表单相关
-
md5加密
-
获取输入值
-
绑定提交事件或点击事件(函数)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.19.0/js/md5.min.js"></script> </head> <body> <form action="" method="get" onsubmit="aaa()"> <p><span>姓名:</span><input type="text" name="name" id = "username" required></p> <p><span>密码:</span><input type="password" id = "input_pwd"></p> <p><input type="password" hidden="hidden" name="pwd" id="md5_pwd"></p> <p><input type="submit" name="sub" onclick="aaa()"></p> </form> <script> var username = document.getElementById('username'); username.value = '233';// 获取和修改输入 // md5加密 var input_pwd = document.getElementById('input_pwd'); var md5_pwd = document.getElementById('md5_pwd'); md5_pwd.value = md5(input_pwd.value); // 表单提交绑定事件onsubmit,按钮绑定点击事件onclick function aaa(){ alert(123); } </script> </body> </html>
JQuery
-
引入方式
在线 或者 项目直接引用
-
用法公式
$(css选择器).action();
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 在线引入--> <!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>--> <!-- 直接项目引入--> <script src="lib/jquery-3.7.1.js"></script> </head> <body> <a href="" id="aaa">点我</a> <script> // 公式 $(css选择器).action() $('#aaa').click(function (x) { alert(1); }); </script> </body> </html> -
一些方法
鼠标相关
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="lib/jquery-3.7.1.js"></script> <style> #mouse_div{ width: 500px; height: 500px; border: 1px solid red; } </style> </head> <body> 鼠标位置:<span id="mouse_xy"></span> <div id="mouse_div"></div> <script> /* $(function(){}) 等价 $(document).ready(function () {}) */ // 加载完html再加载这个js $(function () { $('#mouse_div').mousemove(function (e) { $('#mouse_xy').text('x:'+e.pageX+'y:'+e.pageY); }) }) </script> </body> </html>操作DOM节点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="lib/jquery-3.7.1.js"></script> </head> <body> <ul id="qd"> <li id="js">JavaScript</li> <li class="css">CSS</li> <li name="html">HTML</li> </ul> <script> $(function () { $('#qd li[name="html"]').text(); $('#qd li[name="html"]').text('html'); $('#qd li[name="html"]').html(); $('#qd').css({ "color": "#ff0011", "background": "blue" });// 多个 $('#qd').css( "color", "yellow");// 单个 }) </script> </body> </html>
浙公网安备 33010602011771号