前端-JavaScript
一、JavaScript介绍
1.1 背景介绍
1.1.1 JavaScript框架介绍
jQuery
Angular
React
Vue
Axios
1.1.2 UI框架
Ant-Design
ElementUI、iview、ice
BootStrap:
AmazeUI
1.1.3 JavaScript 构建工具
Babel
WebPack
1.2 什么是JavaScript
1.2.1 概述
JavaScript是一门世界上最流行的脚本语言
Java vs JavaScript
10天
一个合格的后端人员,必须要精通JavaScript
1.2.2 历史
ECMAScript它可以理解为是JavaScript的一个标准
最新版本已经到es6版本~
但是大部分浏览器还只停留在支持es5代码上!
二、快速入门
2.1 引入JavaScript的两种方式
2.1.1 内部标签
2.1.1 外部引入
外部js文件
效果如下:
2.2 基本语法入门
确认idea的JavaScript是版本6
2.2.1 变量赋值
JavaScript中一切的变量类型都可以是var
2.2.2 条件控制
2.2.3 多行注释
// 多行注释
/**
*
*/
2.2.4 console.log
console.log(score)
//相当于java的System.out.println()
2.3 javascript的调试
直接用google浏览器
2.3.1 使用source
流程如下:
2.3.2 其他需要用到发google功能
2.4 数据类型简介
数值、文本、图形、音频、视频
2.4.1 变量
var abc
2.4.2number
js不区分小数和整数
123
123.1
1.123e3 //科学计数
-99 //复数
NaN //not a number
Infinity //表示无限大
2.4.3字符串
“abc” ‘abc’
2.4.4布尔值
true false
2.4.5逻辑运算
&& //-两个都为真,结果为真
|| //一个为真,结果为真
! //真即假,假即真
比较运算符
!!!重要!
=
== //等于(类型不一样,值一样,也会为true)
=== //绝对等于(类型一样,值一样,为true)
这是一个js的缺陷,坚持不要使用==比较
2.4.6null
和undefined
null 空指针
undefined 未定义
2.4.7数组
java数组要求:一系列相同类型的对象,但js不需要这样!
var arr=[1,2,3,4,5,"happy",null,true]
new Array(1,2,3,4,5,"happy",null,true)
取数组小标,如果越界了,就会undifined
2.4.8对象
对象用大括号,数组是中括号
-
每个属性之间用逗号分开。最后一个不需要逗号
var person={
name:"happy",
age:3,
tag:[13,4334,"java","..."],
}
2.4.9取对象的值
person.name
person.age
注意:
1.NaN===NaN,这个域所有的数字都不相等,包括自己
只能通过isNaN(NaN)来判断
2.浮点数问题
console.log(1/3===(1-2/3))
尽量避免使用浮点数进行运算,存在精度问题。
2.5 严格检查模式
“'use strict' ”
严格检查模式,预防JavaScript的随意性导致产生的一些问题。必须写在script的``
-
局部变量都建议使用let定义
-
前提Idea支持ES6语法
开启严格检查后:
三、数据类型详细应用
3.1 字符串
3.1.1 声明字符串
正常字符串我们使用单引号或者双引号包裹内。
3.1.2 注意转义字符 \
\.
\n
\t
\u4e2d
\x41
3.1.3 多行字符串编写
3.1.4 模板字符串
3.1.5 字符串的一些方法和属性
var student="student"
undefined
student.length;
7
student[0]
's'
student[2]
'u'
student.toUpperCase()
'STUDENT'
student.indexOf("t")
1
student.charAt(2)
'u'
student.substr(3)
'dent'
student.substring(0,5)
'stude'
student.substr(0,3)
'stu'
3.1.6 字符串的可变性: 不可变
3.2 数组
3.2.1 声明数组
Array可以包含任意的数据类型。作用:存储数据(如何存、取数据)
var arr=[1,2,3,4,5,6]
3.2.2 数组的一些方法和属性
键入给arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失
var arr=[1,2,3,4,5,6]
undefined
arr
(6) [1, 2, 3, 4, 5, 6]
arr.length
6
arr.length=10
10
arr.length
10
arr
(10) [1, 2, 3, 4, 5, 6, empty × 4]0: 11: 22: 33: 44: 55: 6length: 10[[Prototype]]: Array(0)
arr[7]
undefined
arr[11]
undefined
arr[2]
3
arr.indexOf(3)
2
3.2.3 特殊的方法
slice()
:
数组版的substring
push():
压入元素到尾部
pop():
弹出尾部的一个元素
unshift() :
压入头部的一个元素
shift():
弹出头部的一个元素
sort():
排序
reverse():
元素反转
concat():
拼接数组。并没有修改数组,只是会返回一个新的数组
join('-'):
连接符,将数组变成字符串。打印拼接字符串,使用特定的的字符串连接
arr.slice(3,5)
(2) [4, 5]
arr.push('a','b');
12
arr
(12) [1, 2, 3, 4, 5, 6, empty × 4, 'a', 'b']
arr.pop();
'b'
arr
(11) [1, 2, 3, 4, 5, 6, empty × 4, 'a']
arr.unshift('A','B');
13
arr
(13) ['A', 'B', 1, 2, 3, 4, 5, 6, empty × 4, 'a']
arr.shift();
'A'
arr
(12) ['B', 1, 2, 3, 4, 5, 6, empty × 4, 'a']
arr.sort();
(12) [1, 2, 3, 4, 5, 6, 'B', 'a', empty × 4]
arr.reverse();
(12) [empty × 4, 'a', 'B', 6, 5, 4, 3, 2, 1]
arr.concat([1,2,3]);
(15) [empty × 4, 'a', 'B', 6, 5, 4, 3, 2, 1, 1, 2, 3]
arr.join('-');
'----a-B-6-5-4-3-2-1'
3.2.4 多维数组
[[1,2],['a','b'],['A','B']]
(3) [Array(2), Array(2), Array(2)]
arr1=[[1,2],['a','b'],['A','B']]
(3) [Array(2), Array(2), Array(2)]
arr1
(3) [Array(2), Array(2), Array(2)]
0: (2) [1, 2]
1: (2) ['a', 'b']
2: (2) ['A', 'B']
length: 3
[[Prototype]]: Array(0)
3.3 对象
3.3.1 声明对象
javascript也是一个面向对象的语言,可以理解为若干个键值对。
JavaScript中所有的
键都是字符串
,值是任意对象!
var 对象名={
属性名: 属性值,
属性名: 属性值,
属性名: 属性值
}
var person={
name: "happy",
age: 18,
sex: man
}
js中的对象,{}表示一个对象,键值对描述属性xxx:yyy。多个属性之间使用逗号隔开,最后一个属性不加逗号!
3.3.2 对象复制
person
{name: 'happy', age: 31, sex: 'man'}
person.name
'happy'
person.name="gaoxing"
'gaoxing'
3.3.3 使用一个不存在的对象属性,不会报错!
person.email
undefined
3.3.4 动态的删减属性和添加属性
delete
delete person.name
true
person
{age: 31, sex: 'man'}
person.email="103098723@qq.com";
'103098723@qq.com'
person
{age: 31, sex: 'man', email: '103098723@qq.com'}
3.3.5 判断属性值是否在这个对象中
person['age']
31
person['sex']
'man'
"sex" in person
true
'toString' in person
true
person.hasOwnProperty("sex")
true
person.hasOwnProperty("toString")
false
3.4 流程控制
if 判断
while循环
for循环
forEach 循环
for in循环
3.5 Map 和 Set
ES6才出来的
3.5.1 Map
console显示如下:
Map(3) {'tom' => 100, 'jack' => 90, 'happy' => 80}
map.set("hha",30);
Map(4) {'tom' => 100, 'jack' => 90, 'happy' => 80, 'hha' => 30}
map.set("tom",30);
Map(4) {'tom' => 30, 'jack' => 90, 'happy' => 80, 'hha' => 30}
3.5.2 Set
无序不重复的集合。 所以set可以用来去重
效果如下:
3.6 iterator
只用iterator来遍历
四.函数及面向对象
方法 VS 函数
方法 | 函数 |
---|---|
存在对象里 | 脱离对象存在 |
4.1 定义函数
-
一旦执行到retrun代表函数结束,返回结果
-
如果没有执行return,函数执行完也会返回结果,结果就是undefined
如下,绝对值函数
4.1.1 定义方式一
4.1.2 定义方式二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>function</title>
</head>
<script>
// 方式一
function abs(x){
if (x>=0){
return x;
} else {
x= -x;
return x;
}
}
// 方式二
var abs1=function (x){
if (x>=0){
return x;
} else {
x= -x;
return x;
}
}
</script>
<body>
</body>
</html>
4.2 调用函数
abs(-10)
abs(10)
参数问题:JavaScript可以传递任意个参数,也可以不传,也不报错
typeof
arguments
argument:是一个JS免费赠送的关键字
代表,传递进来的所有的参数,是一个
数组
!
rest
rest,ES6 引入的新特性,获取除了已经定义的参数之外的所有参数。
rest只能写最后面,必须用...标识
4.3 变量作用域
Java vs Javascript
Javascript | Java |
---|---|
提升作用域:提升声明,但不提升赋值 | 变量可以提升作用域 |
在javascript中,var定义变量实际是有作用域的。
假设在函数提声明的,则在函数体外不可以使用。非要实现的话可以研究下
闭包
内部函数可以访问外部函数的成员,反之不行。
假设内部函数变量和外部函数变量名重名,内部为准。JavaScript中函数查找变量从自身函数开始,由内向外查找,屏蔽外部变量。(有一个查找过程)
1.提升变量的作用域:
js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值。所以与其自动提升,一般要求规范都提升到函数头部分对变量进行声明。
结果如下:
而如果不声明y,如下
一个报变量声明了没有赋值,一个报没有赋值。由此说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值;
但注意换成let后效果不一样。
2.变量的声明
这是一个在JavaScript建立之初就存在的特性。养成规范:所有的变量定义都放在函数的头部,不要乱发,便于代码维护:
function happy(){
var x=1,
y=x+1,
z,i,a; //undefined
}
3.全局变量和函数
4.全局对象window
javascript的window
是默认的全局变量。
alert()这个函数本身也是一个window
变量
JavaScript实际上只有一个全局作用域,任何变量(函数也可以视为变量),建设没有在函数作用域范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错引用异常:Reference Error
5.创建全局变量和函数的规范
由于我们所有的全局变量都会绑定到我们的windows。如果不同的js文件,使用了相同的全局变量,冲突==>如何能减少冲突?
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题。
比如jQuery就是把自己的变量全部绑定在jQuery对象中,调用jQuery或者$()都可以
6.局部作用域let
ES6 let关键字解决局部变量作用域冲突的问题,建议使用let去定义局部作用域的变量
使用老版本的var定义变量,不规范,局部变量可以出局部作用域。现在规范使用let
老版本var定义变量:
使用let以后:
7.常量const
在ES6之前,怎么定义常量:只用大写字母命名的变量就是常量,建议人不要修改,只是约定。
var PI=“3.14”;
ES6之后,引入const
4.4 方法:
对象里面的函数不叫函数,叫方法。或者说方法就是把函数放在对象的里面,对象只有两个东西:属性和方法。
1.this
this是无法指向的,是默认指向
调用他的那个对象
。
说明:直接调getAge()没用,因为window调用他,此时this指window,而window没有这个this.age
2.apply
在js中可以改变控制this指向。第一个参数决定改变指向
所有方法本身都有个apply
方法,改变this指向happy对象,传参为空。
五、常用内部对象
标准对象
可以用typeof判断对象的类型
typeof 34
'number'
typeof "34"
'string'
typeof '34'
'string'
typeof true
'boolean'
typeof NaN
'number'
typeof null
'object'
typeof []
'object'
typeof {}
'object'
typeof Map
'function'
typeof Math.abs
'function'
typeof undefined
'undefined'
typeof Date
'function'
5.1 Date
date对象相关方法:
注意month
当前时间:2022年4
月8日11:34
now.toLocaleString()
'4/8/2022, 11:35:37 AM'
now.toLocaleTimeString()
'11:35:37 AM'
5.2 JSON
5.2.1 JSON的定义
json是什么
JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。
简洁和清晰的
层次结构
使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成
有效提升网络传输效率
早期,数据传输都是使用xml格式。Json和XML的可读性不相上下,一边是简易的语法,一边是规范标签形式
在JavaScript一切皆为对象
,任何js支持的类型都可以用JSON来表示。
5.2.2 JSON格式
对象和map都用{}
数组和list都用[]
所有的键值对,都是用key:value ,键值对之间用逗号,
Json实际为
字符串
,一种特殊的字符串。
JavaScript可以很方便的将对象转换成json字符串
对象转json字符串
json字符串转对象
5.3 AJAX
-
原生的js写法,xhr异步请求
-
jQuery封装好方法 $(#name)
-
axios请求
六、面向对象编程
6.1 什么是面向对象
javascript、java、c# 、python都有面向对象,但javascript有些区别!
普通
-
类:模板,是一个抽象
-
对象:具体的示例
但在JavaScript里面需要大家换一个思维方式。
1.proto继承
ES6之前,用原型。可以把原型对象理解为父类
2.class继承
class关键字
,支在ES6引入的。
也可以extends
本质上查看对象类型还是:proto
3.原型链
在JavaScript中,每个对象都有一个属性[[Prototype]]指向自己的原型对象
七、操作Bom对象
B/S
B:浏览器
BOM:浏览器对象模型
浏览器介绍
JavaScript和浏览器的关系?
JavaScript: 诞生,就是为了让他在浏览器中运行脚本。
主流内核如下:
-
IE: 6~12
-
Chrome
-
FireFox (Linux默认浏览器内核)
-
Safari (苹果默认浏览器内核)
7.1 window对象
window代表浏览器窗口
window.innerHeight;
1376
window.innerWidth;
246
window.outerHeight
344
window.outerWidth;
61
7.2 Navigator
封装了浏览器的信息
Navigator {vendorSub: '', productSub: '20030107', vendor: 'Google Inc.', maxTouchPoints: 1, userActivation: UserActivation, …}
appCodeName: "Mozilla"
appName: "Netscape"
appVersion: "5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Mobile Safari/537.36"
bluetooth: Bluetooth {}
clipboard: Clipboard {}
connection: NetworkInformation {onchange: null, effectiveType: '4g', rtt: 50, downlink: 1.85, saveData: false}
cookieEnabled: true
credentials: CredentialsContainer {}
deviceMemory: 8
doNotTrack: null
geolocation: Geolocation {}
hardwareConcurrency: 8
hid: HID {onconnect: null, ondisconnect: null}
ink: Ink {}
keyboard: Keyboard {}
language: "en-US"
languages: (2) ['en-US', 'en']
locks: LockManager {}
managed: NavigatorManagedData {onmanagedconfigurationchange: null}
maxTouchPoints: 1
mediaCapabilities: MediaCapabilities {}
mediaDevices: MediaDevices {ondevicechange: null}
mediaSession: MediaSession {metadata: null, playbackState: 'none'}
mimeTypes: MimeTypeArray {length: 0}
onLine: true
pdfViewerEnabled: false
permissions: Permissions {}
platform: "Win32"
plugins: PluginArray {length: 0}
presentation: Presentation {defaultRequest: null, receiver: null}
product: "Gecko"
productSub: "20030107"
scheduling: Scheduling {}
serial: Serial {onconnect: null, ondisconnect: null}
serviceWorker: ServiceWorkerContainer {controller: null, ready: Promise, oncontrollerchange: null, onmessage: null, onmessageerror: null}
storage: StorageManager {}
usb: USB {onconnect: null, ondisconnect: null}
userActivation: UserActivation {hasBeenActive: true, isActive: true}
userAgent: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Mobile Safari/537.36"
userAgentData: NavigatorUAData {brands: Array(3), mobile: true, platform: 'Android'}
vendor: "Google Inc."
vendorSub: ""
virtualKeyboard: VirtualKeyboard {boundingRect: DOMRect, overlaysContent: false, ongeometrychange: null}
wakeLock: WakeLock {}
webdriver: false
webkitPersistentStorage: DeprecatedStorageQuota {}
webkitTemporaryStorage: DeprecatedStorageQuota {}
xr: XRSystem {ondevicechange: null}
[[Prototype]]: Navigator
大多数时候,我们不建议使用navigator对象, 因为会被人为修改!
7.3 screen
代表屏幕尺寸
7.4 locaton
(重要)
location代表当前页面的url信息
location
Location {ancestorOrigins: DOMStringList, href: 'https://www.baidu.com/', origin: 'https://www.baidu.com', protocol: 'https:', host: 'www.baidu.com', …}
ancestorOrigins: DOMStringList {length: 0}
assign: ƒ assign()
hash: ""
host: "www.baidu.com"
hostname: "www.baidu.com"
href: "https://www.baidu.com/"
origin: "https://www.baidu.com"
pathname: "/"
port: ""
protocol: "https:"
reload: ƒ reload()
replace: ƒ replace()
search: ""
toString: ƒ toString()
valueOf: ƒ valueOf()
Symbol(Symbol.toPrimitive): undefined
[[Prototype]]: Location
注意上面
location.reload() 可以刷新网页
location.assign("http://www.google.com")
7.5 document
document代表当前的页面,HTML dom文档树,下面DOM会专门介绍
7.5.1 DOM入门:
document可以获取cookie
这是前端获取的方式,后端可以通过request对象获取。
cookie是客户端的一些本地信息,是不安全的,cookie可以被劫持的。
cookie劫持原理
植入js
<script src="happy.js"></script>
<!--恶意人员:获取你们的cookie上传到他的服务器
用ajax上传
-->
服务器端可以设置cookie为:httpOnly来保证安全性
7.6 history
代表浏览器的历史浏览记录
八、操作Dom元素
(重要)
8.1 DOM:文档对象模型介绍
整个浏览器网页就是DOM树形结构!
更新:更新Dom节点
遍历DOM节点:得到DOM节点
删除:删除一个DOM节点
添加:添加一个新的节点
前端版的增删改查
要做一个DOM节点,就必须要先获得这个Dom节点
8.2 获取dom节点
以上都是原生的dom对象操作方法,之后我们都是用jQuery
8.3 更新dom节点
8.3.1 操作文本内容
id1.innerHTML="happy test";
id1.innerText="<h1>happy</h1>";
8.3.2 操作CSS
也可以操作CSS
id1.innerHTML="happy test";
'happy test'
id1.style.fontSize="20px"
'20px'
id1.style.color="blue";
'blue'
id1.style.padding="20px";
'20px'
注意事项
-
dom操作css时,下划线转驼峰命名
-
属性用字符串包括
8.4 删除dom节点
删除节点,先获取该节点的父节点,再干掉自己。(不能自己删除自己)
let father=节点.parent
father.removeChild(节点)
注意事项
删除一个节点子节点的时候,其children是时刻在变化的。
8.5 插入dom节点
我们获得了某个dom节点,假设这个dom节点是空的,我们通过
innerHTML
就可以增加一个元素了,但是这个dom节点就会被覆盖,我们就最好不要这样干了。
所以我们通过追加方式插入appendChild
8.5.1 追加已有节点
8.5.2 增加新节点(追加)
给节点设置样式的几种方法
8.5.2 增加新节点(插入)
list.insertBefore(新的节点,定位节点);
list.insertBefore(newP,ee);
九.操作表单(验证)
9.1 表单级别验证函数
使用onsubmit接收,固定写法onsubmit=“return aaa()”,记得return true或false
前端用MD5加密后提交密码,不直接提交password,二是用隐藏域