JS map/set函数对象面向对象BOM表单JQuery#20230714
## 3。js中 !==和 !=的区别
### 1、用法
都是用来比较值的。
### 2、比较过程
#### != 比较时,若类型不同,会偿试转换类型;
#### !== 只有相同类型才会比较。
### 3、比较结果
#### !=返回同类型值比较结果 ;
#### !== 不同类型不比较,且无结果,同类型才比较;
### 4、举例
var num = 1; var str = '1'; var test = 1;
test !== num //false test与num类型相同,其值也相同,非运算肯定是false。
num != str //false == 的非运算。
num !== str //true num 与 str类型不同 意味着其两者不等,非运算自然是true啦。
#### 3 “2” + 默认拼接 - 只能运算
```javascript
var a = 2;
var b = "3";
alert(a + b) //弹出23
```
### 3.5 Map和Set (ES6)
#### Map:
```javascript
//ES6 Map
1 //ES6 Map
//学生的成绩,学生的名字
// var names = ["tom","jack", "haha"];
// var scores = [100,90,80];
8
9
var map = new Map([['tom', 100], ['jack', 90], ["haha',80]]);var name = map.get('tom');
//通过key获得valuemap.set('admin',123456); //新增或修改map.delete("tom");
//删除
```
#### Set:无序不重复的集合
```javascript
set.add(2); //添加
set.delete(1); //删除
console
.1
og(set.has(3)); //是否包含某个元素
```
我的练习:
```javascript
<script>
var map = new Map([['tom', 100], ['kavl', 90], ['dfg', 67]]);
var name0 = map.get('dfg');
map.set('bella', 234567);
map.delete('dfg');
console.log('kavl');
var set = new Set([3, 1, 1, 1, 1, 1]);
set.add(2);
set.add(5);
set.delete(2);
console.log(set.has(5));
</script>
````
### 3.6 iterator
#### 遍历数组
```javascript
//通过for of / for in 下标
var arr = [3,4,5]
for (var x of arr){console.1og(x)
```
#### 遍历map
```javascript
var map = new Map([["tom", 100], ["jack", 90], ["haha", 80]]);
for (let x of map) {
console.1og(x)
```
#### 遍历set
```javascript
var set = new Set([5, 6, 7]);
for (let x of set) [
console.1og(x)
```
## 4、函数
### 4.1 定义函数
函数 vs方法 对象(属性,方法)
#### 定义方法1
```java
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
```
一旦执行到 return 代表函数结束,返回结果!如果没有执行 return,函数执行完也会返回结果,结果就是 undefined
#### 定义方法2
匿名函数直接赋值给一个变量
```java
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
```
function(x){.....}这是一个匿名函数。但是可以把结果赋值给 abs,通过abs 就可以调用函数
#### 调用函数
直接abs(10)//10
abs(-10)//10
#### 手动抛出异常
```java
var abs = function (x) {
//手动抛出异常
if (typeof x !== 'number') {
throw 'Not a Number ~~';
}
if
(x >= 0) {
return x;
} else {
return -x;
}
}
```
#### arugements
是一个免费赠送的关键字;arguments代表,传递进来的所有的参数,是一个数组!
```java
var abs = function (x) {
console.log("x====>" + x);
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
```
#### rest
ES6 引入的新特性,获取除了已经定义的参数之外的所有参数
rest 参数只能写在最后面,必须用 ... 标识。
```javascript
function aaa(a, b, ...rest) {
console.log(a);
console.log(b);
console.log(rest);
}
```
### 4.2 变量的作用域
在javascript中, var 定义变量实际是有作用域的
#### 1 假设在函数体中声明,则在函数体外不可以使用
~(非要想实现的话,后面可以研究一下
闭包
```javascript
function qj() {
var x = 1;
X = x + 1;
}
x = x + 2; //Uncaught ReferenceError: x is not defined
```
#### 2 如果两个函数使用了相同的变量名,只要在函数内部,就不冲突
```javascript
function qj() {
var x = 1;
x = x + 1;
}
function qj2() {
var x = 'A';
x = x + 1;
}
```
#### 3 内部函数可以访问外部函数的成员,反之则不行
```javascript
function qj() {
var x = 1;
function qj2() {
var y = x + 1;//y=2
}
// 内部函数可以访问外部函数的成员,反之则不行
var z = y + 1;
// 报错 找不到 not defined
}
```
#### 4 就近原则。假设在javaScript 中 函数查找变量从自身函数开始~,由“内“向“外“查找.假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
```javascript
function qj() {
var x = 1;
function qj2() {
var x = 'A';
console.log('inner' + x);
}
qj2();
//innerA
console.log('outer' + x);
}
qj();
//outer1
```
#### 5 js存在变量提升机制,JS引擎遇到var声明,会将其声明提到作用域顶端
##### 5.1 全局变量
```javascript
x = 1;
function f(){
console.1og(x);
};
f();//1
console.1og(x);//1
```
这个是在JavaScript建立之初就存在的特性。养成规范: 所有的变量定义都放在函数的头部,不要乱放,便于代码维护;
##### 5。2全局函数
```javascript
//全局变量 定义在函数之外的 就是全局变量
x = 1;
I
function fO fconsole.1og(x);
2fO;
console.1og(x);
```
##### 5.2 全局对象 window
变量是对象的变量,变量都要绑定在对象上。
而默认所有的全局变量,都会自动绑定在 window对象下;
```javascript
var x ='xxx';
alert(x);
alert(window.x);
// 默认所有的全局变量,都会自动绑定在 window对象下;
```
##### 5.3alert这个函数本身也是一个 window 变量
```javascript
var x = 'xxx';
window.alert(x);
var old_alert = window.alert;
//old_alert(x);
window.alert = function () {
};
// 发现 alert() 失效了 I
window.alert(123);
//恢复
window.alert = old_alert;
window.alert(456);
```
Javascript 实际上只有一个全局作用域,任何变量 (函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错RefrenceError
##### 5,4 规范
由于我们所有的全局变量都会绑定到我们的 window 上。如果不同的is 文件,使用了相同的全局变量,冲突~>如果能够减少冲突?
jQuery.XXX
$.XXX
```javascript
// 唯一全局变量
var Zyy = {};
// 定义全局变量
Zyy.name = 'kuangshen', Zyy.add = function (a, b) {
return
a + b;
}
```
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题
jQuery
#### 7 局部作用域let
```javascript
function aaa() {
for (var i = 0; i < 100; i++) {
console.log(i)
}
console.log(i + 1); //问题? i 出了这个作用域还可以使用
}
```
ES6. let 关键字,解决局部作用域冲突问题
```javascript
function aaa() {
for (let i = 0; i < 100; i++) {
console.log(i)
}
console.log(i + 1);
//uncaught ReferenceError: i is not defined
}
```
在 ES6 引入了常量关键字const
```javascript
const PI ='3.14';// 只读变量
console.1og(PI);
PI ='123', // TypeError: Assignment to constant variable.
console.1og(PI);
```
### 4.3、 方法的定义和调用
#### 定义方法
##### 1 方法就是把函数放在对象的里面,对象只有两个东西 : 属性和方法
```javascript
var zyy = {
name: '王千',
bitrh: 1996,
// 方法
age: function () {
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.bitrh;
}
}
//属性 zyy.name
//方法,一定要带zyy. age()
```
##### 2 或者 将方法分开写,让对象的属性值调用方法。
```javascript
function getAge() {
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.bitrh;
}
var zyy = {
name: '王千',
bitrh: 1996,
// 方法
age: getAge
}
```
java :this是无法指向的,是默认指向调用它的那个对象;
javascript:
##### 3 apply 在js 中可以控制 this 指向
```javascript
function getAge() {
// 今年 - 出生的年
var now = new Date().getFullYear();
return now - this.bitrh;
}
var zyy = {
name: '王千',
bitrh: 1996,
// 方法
age: getAge
}
var ls= {
name: '李四',
bitrh: 2000,
// 方法
age: getAge
}
getAge.apply(b,[]);
//this,指向了ls,参数为空
```
#### 调用
getAge.apply(ls,[])
VS
ls.age()
主动调用 和被动调用
## 5.内部对象
标准对象
```java
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
```
### 5.1 Date 日期类型
```javascript
var now = new Date();//sat Jan 04 2020 10:47:06 GMT+0800 (中国标准时间)now.getFu11Year(; //年
now.getMonth();// 月0~11 代表月now.getDate(); // 日now.getDay(;// 星期几now.getHours(); // 时
now.getMinutes(;// 分now.getSeconds();// 秒
now.getTime();// 时间戳 全世界统一 1970 1.1 0:00:00毫秒数
console.1og(new Date(1578106175991)) //时间戳转为时间
now = new Date(1578106175991)sat Jan 04 2020 10:49:35 GMT+0800 (中国标准时间)
now.toLocalestring
// 注意,调用是一个方式,不是一个属性!f toLocalestring() f [native code] ]now.toLocalestring()"2020/1/4 上午10:49:35"
now.toGMTstring(
"sat,04 Jan 2020 02:49:35 GMT"
Date()
如何使用 Date() 方法获得当日的日期。
Date.getFullYear()
使用 getFullYear() 获取年份。
Date.getTime()
Date.getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。
Date.setFullYear()
如何使用 setFullYear() 设置具体的日期。
Date.toUTCString()
如何使用 toUTCString() 将当日的日期(根据 UTC)转换为字符串。
Date.getDay()
如何使用 getDay() 和数组来显示星期,而不仅仅是数字。
Date.Display a clock
如何在网页上显示一个钟表。
```
### 5.2 JSON
json 是什么
早期,所有数据传输习惯使用 XML 文件!
·JSONUavaScript Object Notation,J 对象简谱)是一种轻量级的数据交换格式简洁和清晰的层次结构使得JSON 成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
在JavaScript 一切皆为对象、任何is 支持的类型都可以用SON来表示
格式:
###### 对象都用 {}
###### 数组都用[]
###### 所有的键值对 都是用 key:value
#### 对象转化为json字符串
var user = {
name: "wangqian",
age: 3,
sex: '女'
}
{"name":"qinjiang","age":3,"sex":"男"]
var jsonUser = JSON.stringify(user);
调用:jsonUser
#### json 字符串转化为对象 参数为 json 字符串
var obj = JSON.parse('{"name":"wangqian","age":3, "sex":"女"}');
调用:
console.log(obj)
### 5.3、Ajax
。原生的js写法 xhr 异步请求。jQuey 封装好的方法 $(“#name").ajax("axios 请求
## 6. 面向对象编程 class继承
javascript、Java、c#。。。。面向对象;javascript有些区别!
##### 类: 模板 原型
##### 对象: 具体的实例
在JavaScript这个需要大家换一下思维方式!
原型:
### 6.1 原型 xiaoming.__proto__ = Bird;
```javascript
var Student = {
name: "qinjiang",
age: 3,
run: function () {
console.log(this.name + " run....");
}
};
var xiaoming = {
name: "xiaoming";
}
//原型对象
xiaoming.__proto__ = Student;
var Bird = {
fly: function () {
console.log(this.name + " fly....");
}
};
// 小明的原型 是 student
xiaoming.__proto__ = Bird;
```
### 6.2 class 继承
关键字,是在ES6引入的class
##### 定义一个类,属性,方法
class 示例
```javascript
//定义一个学生类 属性和方法
class Student {
constructor(name) {
this.name = name;
}
hello() {
alert("hello")
}
}
class XiaoStudent extends Student {
constructor(name, grade) {
super(name);
this.grade = grade;
}
myGrade() {
alert('hi 我是一名小学生')
}
}
var xi = new XiaoStudent("xi");
// //调用 : xi.hello()
// xi.myGrade()
// xi.name
```
```javascript
//ES6之后
//定义一个学生类 属性和方法
class Student {
constructor(name) {
this.name = name;
}
hello() {
alert("hello")
}
}
var xiaoming = new Student("xiaoming");
//调用: xiaoming.hello(); 对象小明的hello方法
//调用: xiaoming.name 对象小明的name属性
var lisi = new Student("lisi");
//lisi.hello()
// lisi.name
```
```javascript
console.log(xi);
XiaoStudent {name: 'xi', grade: undefined}grade: undefinedname: "xi"[[Prototype]]: Studentconstructor: class XiaoStudentmyGrade: ƒ myGrade()[[Prototype]]: Objectconstructor: class Studenthello: ƒ hello()[[Prototype]]: Object
```
## 7 操作BOM对象(重点)
### 7,1 浏览器介绍
JavaScript 和浏览器关系?
#### JavaScript 诞生就是为了能够让他在浏览器中运行!
#### BOM:浏览器对象模型
IE6~11
Chrome
Safari
FireFox
Opera
三方
。QQ浏览器
。360浏览器
### 7.2window 窗口
window 代表浏览器窗口
```javascript
window.alert(1)
undefined
window.innerHeight
window.innerwidth
window.outerHeight
window.outerwidth
// 大家可以调整浏览器窗口试试...
```
### 7.3 navigator 不建议用
```javascript
navigator. appName
“Netscape"
navigator.appVersion
"5.0 (windows NT 10.0; wOW64) AppleWebKit/537.36 (KHTML,1ike Gecko)chrome /63.0.3239.132 safari /537.36"
navigator.userAgent"
Mozi11a/5.0 (windows NT 10.0;wOW64)ApplewebKit/537.36 (KHTML,1ikeGecko) chrome /63.0.3239.132 Safari/537.36"
navigator.platform
"win32"
数时候,我们不会使用
对象,因为会被人为修改.navigator
```
### 7.4 screen 屏幕信息
screen.width
57
screen.height
677
### 7.5 location (重要)
```html
location
location 代表当前页面的URL信息
host: "www. baidu.com"
href:"https ://www.baidu.com/"
protocol:"https:"
reload:f reload() // 刷新网页
// 设置新的地址
1ocation .assign('https://blog. zyy.com/')
```
### 7.6 document 内容 表单
#### 1 document.title
'新标签页'
#### 2 document.title="haohao"
'haohao'
#### 3 获取具体的文档树节点 document.getElementById('app');
```javascript
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
</script>
</head>
<body>
<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
<script>
var dl = document.getElementById('app');
</script>
</body>
</html>
```
### 7.7 获取cookie
##### 1 获取 cookie
document.cookie
guid=111872281.88375976493059340.1578110638877.133;monitor_count=1"
##### 2 劫持 cookie 原理
www.taobao.com
<script src=""aa.js"></script>
<!--恶意人员;获取你的cookie上传到他的服务器-->
##### 服务器端可以设置 cookie: httpOnly
### 7.8 history浏览器的历史记录
history 代表浏览器的历史记录
history.back() //后退
history.forward() //前进
## 8 操作DOM对象(对象)增删改查
### 8.1核心
浏览器网页就是一个Dom 树形结构!
#### 更新:更新Dom节点
#### 遍历dom节点: 得到Dom节点
#### 删除: 删除一个Dom节点
#### 添加: 添加一个新的节点要操作一个Dom节点,就必须要先获得这个Dom节点
### 8.2获得dom节点
对应css选择器
#### 1标签document.getElementsByTagName('h1');
var h1 = document.getElementsByTagName('h1');
#### 2通过元素iddocument.getElementById('p1');
var p1 = document.getElementById('p1');
#### 3通过类名document.getElementsByClassName('p2')
var p2 = document.getElementsByClassName('p2');
#### 4获取夫类的节点后.children获取所有子元素
var father = document.getElementById('father');
var childrens =father.children;
4以下是源代码:
```javascript
<body>
<div id="father">
<h1>标题一</h1>
<p id="p1">p1</p>
<p>p2</p>
</div>
<script>
//对应css选择器
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.children
HTMLCollection(3)[h1, p#p1, p.p2, p1: p#p1]
* 获取父节点下的所有子节点
*/
</script>
</body>
```
### 8.3更新节点
#### 1 操作文本
##### id1.innerText='hello world'
##### document.getElementById('id1').innerText='hello 122345'
##### id1.innerHTML='<strong>1243</strong>'
可以解析HTML文本标签
```javascript
<div id="id1">123 </div>
<!--document.getElementById('id1')
得到此标签
-->
<script>
var id1 = document.getElementById('id1');
id1.innerText='hello world'
//结合获取节点 加 调用innerText 进行代码块内容的修改
// document.getElementById('id1').innerText='hello 122345'
</script>
```
#### 2 操作CSS
##### id1.style.color='red'//属性使用字符串进行包裹
##### id1.style.fontSize='200px'
不需要方法 直接结合获取节点 加 调用style方法进行
##### document.getElementById('id1').style.color='blue'
##### id1.style.paddding = '2em'
#### 3删除结点
注意: 删除多个节点的时候,children 是在时刻变化的,删除节点的时候一定要注意!
//删除元素p1
var p1 = document.getElementById('p1');
//找到p1的父结点
var father = p1.parentElement;
//通过父节点调用removeChildren方法 向下查找 进行删除操作
// 调用 father.removeChild(p1);
```javascript
<body>
<div id="father">
<h1>标题一</h1>
<p id="p1">p1</p>
<p>p2</p>
</div>
<script>
//删除元素p1
var p1 = document.getElementById('p1');
//找到p1的父结点
var father = p1.parentElement;
//通过父节点调用removeChildren方法 向下查找 进行删除操作
// 调用 father.removeChild(p1);
</script>
</body>
```
#### 4插入节点
创建一个新的标签,实现插入
```javascript
<body>
<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');
var list = document.getElementById('list');
//调用:
//list.appendChild(js) 追加到后面
var newP = document.createElement('p');//创建一个p标签
newP.id = 'newP';
newP.innerText = 'Hello,bella';
list.appendChild(newP);
var myScript = document.createElement('script');//创建一个标签节点
myScript.setAttribute('type', 'text/javascript');
myScript.setAttribute('id', 'js123');
list.appendChild(myScript);
//操作 :list.appendChild(myScript) 讲myScript标签作为子结点添加到list列表内
// 创建一个Style 标签
var myStyle1 = document.createElement('style');//创建一个空style标签
myStyle1.setAttribute('type','text/css');//设置标签的属性
myStyle1.innerHTML='body{background-color:red;}';//设置标签的内容
document.getElementsByTagName('head')[0].appendChild(myStyle1)
//插入到head的头部
</script>
</body>
```
###### insert
## 9、操作表单(验证)
### 9.1表单是什么 form DOM 树
##### 。文本框 text
##### 。下拉框< select >
##### 。单选框radio
##### 。多选框checkbox
##### 。隐藏域 hidden
##### 。密码框password
##### 。表单的目的: 提交信息
```javascript
<body>
<form action="post">
<p>
<span> 用户名:</span> <input type="text " id="username">
</p>
<p>
</p>
</form>
<script>
var input_text = document.getElementById('username');
</script>
<!--input_text.value 获取输入框的值
input_text.value= 修改输入框的值
-->
</body>
```
### 9.2 获得要提交的信息
```javascript
<body>
<form action="post">
<p>
<span> 用户名:</span>
<input type="text " id="username">
</p>
<p>
<span>性别:</span>
<input type="radio" name="sex" value="man" id="boy">男
<input type="radio" name="sex" value="women" id="girl"> 女
</p>
</form>
<script>
var input_text = document.getElementById('username');
var boy_radio = document.getElementById('boy');
var girl_radio = document.getElementById('girl');
</script>
</body>
```
```javascript
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="https://www.baidu.com" method="post" onsubmit="return aaa()">
<p>
<span> 用户名: </span>
<input type="text" id="username" name="username">
</p>
<p><span>密码:</span>
<input type="password" id="input-password">
</p>
<input type="hidden" id="md5-password" name="password">
<!-- 绑定时间 onclick 被点击 -->
<button type="submit">提交</button>
</form>
<script>
function aaa() {
alert(1);
var uname = document.getElementById('username');
var pwd = document.getElementById('input-password');
var md5pwd = document.getElementById('md5-password');
// pwd.value = md5(pwd.value);
md5pwd.value = md5(pwd.value);
//可以校验判断表单内容,true就是通过提交 false就是阻止提交
}
</script>
</body>
</html>
```
## 10、初识jQuery及公式
### 10.1 公式:$(selector).action()
<script>
document.getElementById('id');
//选择器就是css的选择器 获取id
$('#test-jquery').click(function () {
alert('hello,jQuery');
})
</script>
```javascript
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="jquery-3.7.0.js"></script>
</head>
<body>
<a href="" id="test-jquery">点我</a>
<!--公式:$(selector).action()-->
<script>
document.getElementById('id');
//选择器就是css的选择器
$('#test-jquery').click(function () {
alert('hello,jQuery');
})
</script>
</body>
</html>
```
### 10.2选择器
#### 1 原生js,选择器少,麻烦不好记
##### document.getElementsByTagName();//标签
##### document.getElementById();//ID
##### document.getElementsByClassName(); //类
#### 2 jQuery css 中的选择器它全部部能用!
##### $('p').click(); //标签选择器
##### $('#id1').click(); //id选择器'
##### $('.class1').click() //cLass选择器
### 文档工具站:https://jquery.cuishifeng.cn
### 10.3事件
鼠标事件
键盘事件
其他事件
$(selector).action()
```javascript
$('.class1').click() //cLass选择器
$('.class1').mousedown()(jQuery)
$('.class1').mouseenter()(jQuery)
$('.class1').mouseleave()(jQuery)
$('.class1').mousemove()(jQuery)
$('.class1').mouseout()(jQuery)
$('.class1').mouseover()(jQuery)
$('.class1').mouseup()(jQuery)
```