JavaScript
1. 什么是JavaScript
1.1 、概述
- JavaScript是一门世界上最流行的脚本语言
- JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为 开发Web页面的脚本语言而出名,但是它也被 用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且 支持面向对象、命令式和声明式(如函数式编 程)风格。
- 一个合格的后端人员,必须精通JavaScript
1.2 历史
- 历史相关链接: https://www.w3school.com.cn/js/pro_js_history.asp.
- ECMAScript它可以理解为是JavaScript的一个标准
- 最新版本已经到es6版本
- 但是大部分浏览器还只停留在支持es5代码上!
- 开发环境–线上环境,版本不一致
2. 快速入门
2.1 引入JavaScript
-
内部标签写js语言,注释也是 //。 <script>
alert('hello word');
</script>
通常script双标签写在的头部 或者 标签的尾部,但是不能写在标签之外 -
外部引入方式 在项目目录中创建一个js文件,把要写的js代码写在其中,文件中不需要写标签 <script src="js/qj.js"></script>
<!-- type 属性,不用显示写,默认也是text/javascript-->
<script type="text/javascript"></script>
-
测试 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
alert('hello');
</script>
<script src="js/qj.js"></script>
<script type="text/javascript"></script>
</head>
<body>
</body>
</html>
2.2 基本语法入门
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>
var num =1 ;
var name = "hello word";
var score = 75;
if (score>60 && score<70){
alert("60-70");
}else if (score>70 && score<80){
alert("70 - 80");
}else {
alert("other");
}
</script>
<body>
</body>
</html>
浏览器调试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1ROovV7-1633962944604)(C:\Users\ZYH\Desktop\tp\1629624110.png)]
2.3 数据类型
Js和java一样是严格区分大小写的一个语言
数值、文本、图形、音频、视频
变量
var num = 1;
数值
java数值类型为Number,并且不区分小数和整数
123
123.1
1.2323e3
-9
NaN
Infinity
字符串
‘abc’ “abc”
布尔值
true false
逻辑运算符
&& 两个为真,结果为真
|| 一个为真,结果为真
! 真即假,假即真
比较运算符
=
==
===
这是一个JS的缺陷,坚持不要使用==运算符进行比较
注意:
浮点数问题:
console.log((1/3)===(1-2/3));
不相等的原因是 计算机无法存储 无限不循环小数 ,所以1/3 会损失精度
尽量避免使用浮点数进行运算,存在精度问题!,通过abs绝对值函数,在取极限进行判断是否相等
Math.abs(1/3-(1-2/3))<0.00000001
null和undefined
数组
java中的数组必须是相同类型的对象,而js中不需要
var arr = [1,2,3,4,5,'hello',null,true];
console.log(arr[0]);
new Array(1,2,3,4,5,'hello');
取数组下标:如果越界了,就会
undefined
对象
对象是大括号,数组是中括号~~
每个属性之间使用逗号隔开,最后一个不需要添加
var person = {
name:"liu",
age:5,
tags:['js','java','web','...']
}
取对象值
person.name
"liu"
person.age
5
2.4 严格检查模式
-
需要IDEA中支持ES6语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict';
a=1;
let i=1;
</script>
</head>
<body>
</body>
</html>
3. 数据类型
3.1 字符串
-
正常的字符串我们使用单引号或者双引号包裹。 -
注意转义字符 \ console.log('a\t\xt1\t\u4e2d\nb');
\' 代表是字符串
\n 换行
\t Tab
\u4e2d \u#### Unicode字符
\x41 Asc11字符
-
多行字符串编写
//tab 上面esc下面的按键
var msg1 =
`hello
word
你好呀
你好;`;
console.log(msg1);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vxbTgRmg-1633962944614)(C:\Users\ZYH\Desktop\tp\1629639031(1)].png)
-
模板字符串 let name = 'Andy';
let age = 12;
var msg = `你好呀,${name}`;
console.log(msg);
``中不在需要用+拼接字符串直接 ${变量名}就可以拼接字符串,是模板字符串 -
字符串长度 str.length
var student = "zhangsan";
console.log(student.length);
-
字符串的可变性-----不可变 console.log(str[1]=1);
VM264:1 1
undefined
console.log(str);
VM329:1 student
undefined
-
大小写转换
console.log(student.toUpperCase()) ;
console.log(student.toLowerCase()) ;
-
获取单个字符下标索引 console.log(str.indexOf('u'));
-
截取字符串[)
console.log(str.substring(1));
console.log(str.substring(1,4));
3.2 数组
-
js中Array数组可以存放任何类型的值,不一定是同一个类型的。 var arr = [1,2,'3',4,5];
arr[0]=1;
- 数组长度
arr.length
注意:数组的长度是可以改变的,给arr.length赋值,数组大小就会发生变化,如果赋值小于当前长度,数组元素会丢失,如果大于当前数组长度就会存在空置,其类型是undefined
- indexOf(),通过元素获取下标索引
arr.indexOf('3');
2
字符串的’1’和数字1是不同的
- slice()截取Array的一部分,返回一个新数组,类似与substring,[ )原则,原字符串不会改变
arr.slice(5)
(3) [7, "1", "2"]
arr
(8) [1, 2, 4, 5, 6, 7, "1", "2"]
arr.slice(1,6)
(5) [2, 4, 5, 6, 7]
- push() 和 pop() 在数组尾部压入一个字符和弹出一个字符
arr
(8) [1, 2, 4, 5, 6, 7, "1", "2"]
arr.push('a')
9
arr
(9) [1, 2, 4, 5, 6, 7, "1", "2","a"]
arr.pop()
"a"
- unshift()和shift() 在数组头部压入一个字符和弹出一个字符
arr.unshift('a')
7
arr
(7) ["a", 1, 2, 4, 5, 6, 7]
arr.shift()
"a"
- 排序 sort()
arr
(3) ["C", "B", "A"]
arr.sort()
(3) ["A", "B", "C"]
- concat()在数组后边拼接元素,返回一个新数组,并且原数组不会改变
arr.concat(1,2,3)
(6) ["C", "B", "A", 1, 2, 3]
arr
(3) ["C", "B", "A"]
- join()用字符把数组的元素连接到一起返回一个字符串
arr.sort()
(3) ["A", "B", "C"]
arr.join('-')
"A-B-C"
- 元素反转 reverse()
arr
(3) ["A", "B", "C"]
arr.reverse()
(3) ["C", "B", "A"]
- 多维数组
arr = [[1,2],['3',3],['a','a']]
(3) [Array(2), Array(2), Array(2)]
0: (2) [1, 2]
1: (2) ["3", 3]
2: (2) ["a", "a"]
length: 3
__proto__: Array(0)
arr[1][1]
3
8112598
3.3 对象
若干个键值对
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}
js中的对象,{…}表示一个对象,键值对描述属性 xxxx:xxxx, 多个属性之间使用逗号隔开,最后一个不用加逗号!
JavaScript中队友的键都是字符串,值是任意对象。
-
对象赋值 person.name="zzzz"
"zzzz"
person
{name: "zzzz", age: 3, email: "123345@163.com", score: 0}
-
使用一个不存在的对象属性,不会报错! undefined person.hah
undefined
-
动态的删减属性,通过delete删除对象的属性 delete person.age
true
person
{name: "zzzz", email: "123345@163.com", score: 0}
-
动态的添加属性,直接给新属性赋值就可以 person.haha='a'
"a"
person
{name: "zzzz", email: "123345@163.com", score: 0, haha: "a"}
-
判断这个属性值是否在对象中 'haha' in person
true
'age' in person
false
-
判断一个属性是否是这个对象自身拥有的 hasOwnProperty person.hasOwnProperty('toString')
false
3.4 流程控制
-
条件语句 if var num = 3;
if (num>5){
console.log("大于5");
}else if (num<3){
console.log("小于3");
}else {
console.log(num);
}
-
while() 循环语句 while (num<100){
console.log(num);
num++;
}
do {
num++;
}while (num<100){
num++;
console.log(num);
}
-
for 循环语句 for (let i=0 ; i<100;i++){
console.log(i);
}
-
forEach 循环 var age = [12,3,5,6,78,435,345,7,87,4,4,7,82,56];
age.forEach(function (value) {
console.log(value);
});
-
for in 循环
var age = [12,3,5,6,78,435,345,7,87,4,4,7,82,56];
for (var num in age){
if (age.hasOwnProperty(num)){
console.log(age[num]);
}
}
index num 为数组索引
3.5 Map和Set
var map = new Map([["li",11],["xin",22],["dong",33]]);
var name = map.get("li");
console.log(name);
map.set("admin",45);
map.set("li",776);
map.delete("li");
var set = new Set([3,2,2,2,2,2]);
set.add(6);
set.delete(6);
console.log(set.has(3));
3.6 iterator
es6 新特性
遍历数组
var arr = [3,4,5]
for(var x of arr){
console.log(x);
}
遍历map
var map = new Map([["li",11],["xin",22],["dong",33]]);
for(var x of map){
console.log(x);
}
遍历set
var set = new Set([3,2,2,2,2,2]);
for(var x of set){
console.log(x);
}
4. 函数
4.1 函数定义
方式一-定义函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return 代表函数结束,返回结果!
如果函数中没有return 执行完会返回undefined
方式二-定义函数
var abs = function (x) {
if(x>=0){
return x;
}else{
return -x;
}
}
function(…) {} 是匿名函数,可以把结果赋值给 abs,然后通过abs调用函数。
调用函数
abs(10)
abs(-10)
参数问题:JavaScript可以传递任意参数,也可以不传递参数·
不传递参数的时候 会返回 NaN,但是我们可以定义异常来处理这种情况以及传递的参数不是一个number的情况
var abs = function (x) {
if (typeof x!== 'number'){
throw 'Not a Number';
}
if(x>=0){
return x;
}else{
return -x;
}
}
arguments
当传递多个参数时,可以用 arguments 来获取参数列表,arguments 是一个JS免费赠送的关键字; 代表,传递进来的所有的参数,是一个数组!
var abs = function (x) {
console.log("x==>" + x);
for (let i =0 ; i<arguments.length;i++){
console.log(arguments[i]);
}
if(x>=0){
return x;
}else{
return -x;
}
}
问题:arguments包含所有的参数,我们有时候想使用多余的参数进行附加操作,需要排除已有的参数~
rest
以前
if(arguments.length > 2){
}
ES6 引入的新特性,获取除了已经定义的参数之外的所有参数~
var abs = function (x,b,...rest) {
console.log("x==>" + x);
console.log("b==>" + b);
console.log(rest);
}
abs(1,2,2,2,2,2,2,2)
x==>1
b==>2
(6) [2, 2, 2, 2, 2, 2]0: 21: 22: 23: 24: 25: 2length: 6__proto__: Array(0)
undefined
4.2 变量的作用域
在javascript中,var定义变量实际是有作用域的。 假设在函数体中声明,则在函数体外不可以使用~
function t1() {
var x= 1;
x = x+1;
}
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
function t2() {
var x =1;
x= x+1;
console.log(x);
}
function t3() {
var x = 2;
x =x+1;
console.log(x);
}
t2();t3();
内部函数可以访问外部函数的成员,反之则不行
function t4() {
var x=1;
function t41() {
var y =x+1;
console.log(y);
}
t41();
}
t4();
内部函数变量和外部函数的变量,重名
function t5() {
var x = 1;
function t51() {
var x = 'A';
console.log("inner"+x);
}
t51();
console.log("outer"+x);
}
t5();
提升变量的作用域
function t6() {
var x = 'x' + y;
console.log(x);
var y ='y';
}
t6();
function t62() {
var y;
var x = 'x' + y;
console.log(x);
var y ='y';
}
function t63(){
var x = 1,
y = x + 1,
z,i,a;
}
全局变量
var x = 'xxx';
alert(x);
alert(window.x);
var alert_old = window.alert;
alert_old(x);
window.alert =function () {
}
alert(123);
window.alert = alert_old;
window.alert(456);
ES6 新特性
- let 定义局部变量
function t7() {
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+10);
}
t7();
function t71() {
for (let i = 0; i <10 ; i++) {
console.log("i="+i);
}
console.log(i);
}
t71();
- const 定义常量,在ES6之前 都是约定大写变量为常量,这样的约束并不合理,很容易造成修改,所以改es5的代码不能随意更改大写名称的变量
function t8() {
const r = "111";
}
4.3 方法
定义方法
方法就是把函数放在对象里,对象只有两个东西:属性和方法。
var zdx = {
name : "zhangyuhang",
bitrh: 2000,
age: function () {
var now = new Date().getFullYear();
return now- this.bitrh;
}
}
person.name;
person.age();
apply方法
apply方法是可以控制this指向的,该方法有两个参数,第一个是getArg要使用的是那个对象,第二个是数组
function getAge(){
var now = new Date().getFullYear();
return now - this.brith;
}
getAge.apply(zdx,[]);
5. 内部对象
内部对象
typeof 1
"number"
typeof 1.1
"number"
typeof NaN
"number"
typeof '1'
"string"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
5.1 、Date
var now = new Date();
now.getFullYear();
now.getMonth();
now.getDate();
now.getDay();
now.getHours();
now.getMinutes();
now.getSeconds();
now.getTime();
console.log(new Date(1631108637804));
5.2 Json 对象
早期,所有数据传输习惯使用XML文件!
JSONlavaScript Object Notation, JS对象简谱)是- -种轻量级的数据交换格式。 简洁和清晰的层次结构使得JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 在JavaScript -切皆为对象、任何js支持的类型都可以用JSON来表示; number, string… 格式: 对象都用{} 数组都用[] 所有的键值对都是用key:value
json 字符串 和js对象互相转换
var zdx = {
name : "zdx",
age : 4
}
var zdxJson = JSON.stringify(zdx);
var use = JSON.parse('{"name":"zd","age":"2"}');
很多人搞不清楚 JSON 和js对象的区别
var obj = {name:'zzz',age:'3'};
var json = '{"a":"hello","b":"b"}';
6.面向对象编程
6.1、什么是面向对象
JavaScript、Java、C#…面向对象;
JavaScript有些区别!
类是实体的抽象
在JavaScript 这个需要大家转换一下思考方式
var Student = {
name : "student",
age : 3,
run : function () {
console.log(this.name + "run....");
}
}
var xiaoming = {
name: "xiaming",
}
xiaoming.__proto__=Student;
var Bird = {
fly:function () {
console.log(this.name + "fly....");
}
}
xiaoming.__proto__=Bird;
class继承
class关键字,是在ES6引入的
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert('hello');
}
}
var xiaoming = new Student('xiaoming');
var xiaohong = new Student('xiaohong');
继承
class xiaoStudent extends Student{
constructor(name,age) {
super(name);
this.age = age;
}
mygrade(){
alert('我是一个小学生');
}
}
var xiaoStudent1 = new xiaoStudent('zhang',1);
原型链
在Javascript中每一个函数都有一个prototype属性指向函数的原型对象,Object指向Object
__ proto __指向原型对象
7. 操作BOM对象(重点)
B/S 架构:浏览器服务器
B:browser,S:server
BOM: browser Object Model 浏览器对象模型
浏览器内核:
- IE 6-11
- Chrome
- Safari
- Firefox
- Opera
三方
window 对象
window代表浏览器窗口
window.alert(1)
undefined
window.innerHeight
355
window.innerWidth
767
window.outerHeight
831
window.outerWidth
782
Navigator 封装了浏览器信息
Navigator 封装了浏览器信息
navigator.appName
'Netscape'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
navigator.platform
'Win32'
大多时候我们不会使用navigator 对象因为会被修改。
不建议使用这些属性来判断和编写代码。
screen 代表屏幕对象
代表屏幕尺寸
screen.width
1536 px
screen.height
864 px
location (重要) 定位
location 代表当前页面的URL信息
host: "www.baidu.com" 主机
href: "https://www.baidu.com/" 链接
protocol: "https:" 协议
reload: ? reload()
location.assign('https://www.csdn.net/')
document (重要) 文档对象
document 代表当前页面 ,HTML DOM 文档树
document.title
'百度一下,你就知道'
document.title='aaaa'
'aaaa'
获取具体的文档树节点
<dl id="app">
<dt>Java</dt>
<dt>JavaSE</dt>
<dt>JavaEE</dt>
</dl>
<script>
var dl = document.getElementById('app');
</script>
获取网页cookie
document.cookie
'BIDUPSID=39ED3B037D56FE8061C51F3A4FBFBEFD; PSTM=1628389088; BAIDUID=39ED3B037D56FE80C3DE2CB255D29F5D:FG=1; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=34649_34439_34067_31660_34711_34525_34584_34505_34707_34578_26350_34761_34424_34691_34673; BAIDUID_BFESS=39ED3B037D56FE80C3DE2CB255D29F5D:FG=1; delPer=0; BD_CK_SAM=1; PSINO=1; COOKIE_SESSION=7_3_9_9_4_7_0_0_9_7_0_0_2663_8_0_0_1633698288_1633695615_1633782197%7C9%230_3_1633695593%7C1; BD_HOME=1; BA_HECTOR=2ha5a521a1a0a00lq91gm35id0r'
劫持cookie 的原理
www.xxx.com
<scrpit src = "aa.js"></scrpit>
尽量不要把cookie暴露出来
在服务器端设置 cookie:httponly 来保护cookie
history (不建议使用)
history 代表浏览器的历史纪录
history.back()
history.forward()
8.操作DOM对象
核心
浏览器网页就是一个Dom树形结构
- 更新:更新Dom节点
- 遍历dom节点:得到Dom节点
- 删除:删除一个Dom节点
- 添加:添加一个新的dom节点
要操作一个Dom节点,就必须要先获得这个Dom节点
获得dom节点
var h1 = document.getElementsByTagName('h1');
var p1 = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var father =document.getElementById('father');
var childrens = father.children;
father.firstElementChild
father.lastElementChild
father.nextElementSibling
更新节点
<body>
<div id="id1"></div>
</body>
<script>
var id1 = document.getElementById('id1');
</script>
操纵文本
id1.innerHTML='<h1>aaa</h1>' ’id1.innerText='aaaaaaaaaaaa'
操作css
id1.style.fontSize='89px' id1.style.color='red' id1.style.padding='22px' id1.style.padding='99px'
删除节点
删除节点必须通过父节点删除子节点,因为没有节点可以删除自己。
<body>
<div id="father">
<h1>h1</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
</body>
<script>
var child = document.getElementById('p1');
var father =child.parentElement;
father.removeChild(child);
father.removeChild(father.children[0])
father.removeChild(father.children[1])
father.removeChild(father.children[2])
</script>
插入节点
我们获取某个Dom节点,假设这个节点时空的,我们通过innerHTML就可以增加一个元素了,但这这个Dom节点已经存在元素了,我们就不能通过innerHTML来增加节点了,因为会覆盖原有的节点。
追加节点
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var js = document.getElementById('js')
list = document.getElementById('list');
list.appendChild(js);
</script>
创建一个新的节点
<script>
var newP = document.createElement('p');
newP.id="newP";
newP.innerText='helloNEWP';
list.appendChild(newP);
var myScript = document.createElement('style');
myScript.setAttribute('type','text/javascript');
list.appendChild(myScript);
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerHTML='body{background-color: yellow}';
var haad =document.getElementsByTagName('head')[0];
haad.appendChild(myStyle);
</script>
在某一个节点前插入一个节点
<script>
var js = document.getElementById('js')
list = document.getElementById('list')
ee = document.getElementById('ee');
list.insertBefore(js,ee);
</script>
9. 操作表单(验证)
<form action="" method="get">
<p>
<span>用户名:</span><input type="text" id="username">
</p>
<p>
<span>性别:</span>
<input type="radio" name="sex" value="man" id="man">男
<input type="radio" name="sex" value="women" id="women">女
</p>
</form>
<script>
var user_text = document.getElementById('username');
var man = document.getElementById('man');
var women = document.getElementById('women');
man.checked=true;
</script>
user_text.value
''
user_text.value
'12354'
user_text.value='zhasngd'
'zhasngd'
man.checked=false
false
women.checked=true
true
提交表单 MD5加密密码 ,表单级别提交onsubmit
<script src="http://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.min.js"></script>
<form action="https://www.baidu.com/" method="post" onsubmit="return aaa()">
<p>
<span>用户名:</span><input type="text" name="username" id="username"/>
</p>
<p>
<span>密 码:</span><input type="password" id="password"/>
</p>
<input type="hidden" name="password" id="md5_password">
<button type="submit" >提交</button>
</form>
<script type="text/javascript">
function aaa() {
var username = document.getElementById('username')
passowrd = document.getElementById('password')
md5pass = document.getElementById('md5_password')
;
md5pass.value=md5(passowrd.value);
return false;
}
</script>
10、jQuery
jQuery 是一个JavaScript库 里边有大量的JavaScript函数
公式 😒(‘选择器’).actio();
获取jQuery
初体验
<a href="" id="test_jquery">点我</a>
<script type="text/javascript">
document.getElementById('test_jquery');
$('#test_jquery').click(function () {
window.alert("a被点击了")
});
</script>
选择器
<script>
document.getElementById();
document.getElementsByTagName();
document.getElementsByClassName();
$('#id1').click();
$('p').click();
$('.class').click();
</script>
事件
<style>
#mouseMove {
height: 500px;
width: 400px;
border: 1px solid red;
}
</style>
<body>
mouse: <span id="mouse"></span>
<div id="mouseMove">鼠标在这里移动试试</div>
<script type="text/javascript">
$(
$('#mouseMove').mousemove(function (e) {
$('#mouse').text('x:'+e.pageX+'y:'+e.pageY);
})
);
</script>
</body>
操作dom
<body>
<ul id="ul">
<li name="javascript">JavaScript</li>
<li name="java">java</li>
</ul>
<script type="text/javascript">
$('#ul li[name=java]').text();
$('#ul li[name=java]').text('12312312');
$('#ul li[name=java]').html();
$('#ul li[name=java]').css({'color':'red'});
$('#ul li[name=java]').hide();
$('#ul li[name=java]').show();
</script>
|