let和const
1-1 let和const
let和const是什么
let和const是什么let和const的用法- 什么是变量 什么是常量
代码演示
<script>
// 1.let和const是什么
// 声明变量或声明常量
// var 声明变量
// let 代替 var 声明变量
// const 声明常量 constant
// 2.let 和 const 的用法
// var 一样
var username = "Alex"
let age = 18
const sex = "male"
console.log(username,age,sex)
// 3.什么是变量,什么是常量
username = "ZS"
agr = 28
console.log(username,age)
// 报错 常量
// sex = "female"
// var let 声明的就是变量 变量一旦初始化之后 还可以重新赋值
// const 声明的就是常量 一旦常量初始化 就不能重新赋值了 否则就会报错
</script>
1-2 const
const
- 为什么需要
const const的注意事项- 什么时候用
const什么时候用let
代码演示
<script>
// 为什么需要 const
// let
// let sex = "male"
// // ...
// sex = "female"
// console.log(sex)
// const
// const sex = "male"
// // ...
// sex = "female"
// console.log(sex)
// const 就是为了那些一旦初始化就不希望重新赋值的情况设计的
// 2.const 的注意事项
// 2.1 适用const 声明常量 一旦声明 就必须立即初始化 不能留到以后赋值
// const sex;
// sex = "male"
// const sex = "male"
// 2.2 const 声明的常量 允许在补充下赋值的情况下修改它的值
// 基本数据类型
// const sex = "male"
// sex = "female"
// // 引用数据类型
// const person = {username:"Alex"}
// person = {}
// person.username = "ZhangSan"
// console.log(person)
// 3.什么时候用 const 什么时候用let
// var
// for (let i = 0 ; i < 2 ; i++){}
con. username = "Alex"
// 不知道用什么先用const
//
username = "ZhangSan"
</script>
1-3 let、const与var的区别
let、const与var的区别
- 重复声明
- 变量提升
- 暂时性死区
- window 对象的属性和方法(全局作用域中)
块级作用域
演示代码
<script>
// 1 重复变量声明
// 已经存在的变量或常量 又声明了一遍
// var 允许重复声明 let const 不允许
// let a = 1
// //
// let a = 2
// console.log(a)
// 报错 形参也是参数 不能重复声明
// function func (a) {
// let a = 1
// }
// func()
// 2 变量提升
// var 会提升变量的声明到当前作用域的顶部
// console.log(a)
// console.log(a)
// var a = 1
// 相当于
// var a
// console.log(a)
// a = 1
// console.log(a)
// let const 不存在变量提升
// console.log(a)
// let a = 1
// console.log(a)
// 养成良好的编程习惯 对于所有的变量或者常量 做到先声明 后使用
// 3 暂时性死区
// 只要作用域存在let const 它们所声明的变量或者常量就自动"绑定"这个区域 不再受到外部作用域的影响
// let const 存在暂时性死区
// let a = 2
// let b = 1
// function func() {
// console.log(b)
// // console.log(a)
// // let a = 1
// }
// func()
// 养成良好的编程习惯 对于所有的变量或者常量 做到先声明 后使用
// 4 window 对象的书写和方法
// 在全局作用域中 var声明的变量 通过 function 声明的函数 会自动编程window对象的属性或方法
// let const 不会
// var/function
// var age = 18
// function add () {
// console.log(window.age)
// console.log(window.add === add)
// }
// let/const
// let age = 18
// const add = function add () {
// console.log(window.age)
// console.log(window.add === add)
// }
</script>
1-4 块级作用域
块级作用域
- 什么是块级作用域
- 作用域链
- 有哪些块级作用域
代码演示
<script>
// 块级作用域
// 1 什么是块级作用域
// var 没有会计作用域
// for (var i = 0 ; i < 3 ; i++) {
// console.log(i)
// }
// console.log(i)
// // let/const有块级作用域
// for (let i = 0 ; i < 3 ; i++) {
// // i = i + 1
// // console.log(i)
// }
// console.log(i)
// 2 作用域链
// function func() {
// for(let i = 0 ; i < 3 ; i++) {
// console.log(i)
// }
// }
// fun()
// console.log(i)
// 作用域链 : 内层作用域 -> 外层作用域 -> ... -> 全局作用域
// 3 有哪些块级作用域
// 只有 let 或 const 才可以叫作用域
// {}
// {
// let age = 18
// console.log(age)
// }
// console.log(age)
// for() {}
// while() {}
// do{}while()
// if(){}
// switch() {}
// function() {}
// 对象不构成任何作用域
// const person = {
// getAge:function() {
// }
// }
</script>
1-5 let和const的应用
代码演示
<style>
body {
padding: 50px 0 0 150px;
}
btn {
width: 100px;
height: 100px;
margin-right: 20px;
font-style: 80px;
cursor: pointer;
}
</style>
</head>
<body>
<button class="btn">0</button>
<button class="btn">1</button>
<button class="btn">2</button>
<script>
// 1 var
// var btns = document.querySelectorAll(".btn")
// for(var i = 0 ; i < btns.length ; i++) {
// btns[i].addEventListener(
// "click",function(){
// console.log(i)
// },false)
// }
// 2 闭包
// var btns = document.querySelectorAll(".btn")
// for(var i = 0 ; i < btns.length ; i++) {
// (function(index) {
// btns[index].addEventListener(
// "click",
// function() {
// console.log(index)
// },false
// )
// }) (i)
// }
// 3 let/const
let btns = document.querySelectorAll(".btn")
for(let i = 0 ; i < btns.length ; i++) {
(function(index) {
btns[index].addEventListener(
"click",
function() {
console.log(index)
},false
)
}) (i)
}
</script>
模板字符串
2-1 模板字符串
模板字符串是什么
- 认识模板字符串
- 模板字符串与一般字符串的区别
代码演示
<script>
// 1 认识模板字符串
// ‘alex’
// const username1 = 'alex'
// // “alex”
// const username2 ='alex'
// console.log(username1,username2,username1 === username2)
// // 模板字符串与一般字符串的区别
const person = {
username : "Alex",
age : 18 ,
sex : "male"
}
// const info = "我的名字是:" + person.username + "性别:" + person.sex + "今年" + person.age + "岁了"
const info = "我的名字是:$(person.username),性别:$(person.sex),今年 $(person.age)岁了"
console.log(info)
// 和其他东西一起使用的时候 使用模板字符串 方便注入
// 其他情况下使用模板字符串或一般字符串都行
</script>
2-2 模板字符串的注意事项
模板字符串的注意事项
- 输出多行字符串
- 输出 ` 和 \ 等特殊字符
- 模板字符串的注入
<script>
// 1 如何输出多行字符串
// 一般字符串
// const info = '第一行\n第二行'
// console.log(info)
// 模板字符串
// const info = `第一行\n第二行`
// console.log(info)
// 模板字符串
// const info = `第一行
// 第二行`
// console.log(info)
// 模板字符串中 所有的空格 换行或缩进都会被保留在输出之中
// 2 输出 ` 和 \ 等特殊字符
// const info = `'\`\\`
// console.log(info)
// 3 模板字符串的注入
// ${}
const username = 'alex'
const person = {
age:18,
sex:'male'
}
const getSex = function(sex) {
return sex === 'male' ? '男' : '女'
}
const info = `${username},${person.age + 2},${getSex(person.sex)}`
console.log(info)
// 只要最终可以得出一个值的就可以通过${}注入到模板字符串中
</script>
2-3、模板字符串的应用
代码演示
<style>
body {
padding: 50px 0 0 300px;
font-size: 22px;
}
ul {
padding: 0;
}
p {
margin-bottom: 10px;
}
</style>
</head>
<body>
<p>学生列表</p>
<ul class="list">
<li style = "list-style: none;">信息加载中</li>
</ul>
<script>
// 数据
const students = [
{
username:"Alex",
age:18,
sex:"male"
},
{
username:"ZhangSan",
age:28,
sex:"male"
},
{
username:"LiSi",
age:20,
sex:"female"
}
]
const list = document.getElementById("list")
let html = ''
for(let i = 0 ; i < students.length ; i++) {
html += `<li>我的名字是:${students[i].username},${students[i].sex},${students[i].age}</li>`
}
console.log(html)
list.innerHTML = html
</script>
箭头函数
3-1 箭头函数
箭头函数是什么
- 认识箭头函数
- 箭头函数的结构
- 如何将一般函数改写成箭头函数
代码演示
<script>
// 1 认识箭头函数
// const add = (x,y) => {
// return x + y
// }
// console.log(add(1,1))
// 2 箭头函数的结构
// const/let 函数名 = 参数 => 函数体
// 3 如何将一般的函数改写成箭头函数
// function add () {}
// 声明形式 => 函数表达形式
// const add = function() {}
// 函数表达式形式 -> 箭头函数
// const add = () => {}
</script>
3-2 箭头函数的注意事项
箭头函数的注意事项
- 单个参数
- 单个函数体
- 单个对象
代码演示
<script>
// 1 单个参数
// 单个参数可以省略圆括号
// const add = x => {
// return x + 1
// }
// console.log(add(1))
// 无参数或多个参数不能省略圆括号
// const add = () => {
// return 1 + 1
// }
// console.log(add())
// const add = (x,y) => {
// return x + y
// }
// console.log(add(1,1))
// 2 单行函数体
// 单行函数体可以同时省略 {}和 return
// const add = (x,y) => {
// return x + y
// }
// const add = (x,y) => x + y
// console.log(add(1,1))
// 多行函数体不能再化简了
// const add = (x,y) => {
// const sum = x + y
// return sum
// }
// 3 单行对象
// const add = (x, y) => {
// return {
// value: x + y
// }
// }
// const add = (x, y) => {
// value: x + y
// // return (返回值) undefined
// }
// 如果箭头函数返回单行对象 可以再 {} 外面加上 () 让浏览器不再认为那是函数体的花括号
// const add = (x,y) => [x,y]
// console.log(add(1,1))
</script>
3-3 this指向1
this指向
- 全局作用域中的
this指向 - 一般函数 (非箭头函数) 中的this指向
代码演示
<script>
// 1 全局作用域中的this指向
// console.log(this) // window
// 2 一般函数(非箭头函数)中的this指向
// function add() {
// console.log(this)
// }
// // 严格模式下就指向 undefined
// // add() // undefined -> window (非严格模式下)
// // window.add()
// const calc = {
// add:add
// }
// // calc.add() //calc
// const adder = calc.add;
// adder() // undefined -> window (非严格模式下)
// document.onclick = function() {
// console.log(this)
// }
// document.onclick()
// function Person(username) {
// this.username = username
// console.log(this)
// }
// const p = new Person('Alex')
// 只有在函数调用的时候this指向才确定 不调用的时候 不知道指向谁
// this 指向和函数在哪儿调用没关系 只是和谁在调用有关
</script>
3-4 this指向2
this指向
- 全局作用域中的
this指向 - 一般函数 (非箭头函数) 中的
this指向 - 箭头函数中的
this指向
代码演示
<script>
// 1 箭头函数中的 this 指向
// 箭头函数没有自己的 this
// const calc = {
// add : () => {
// console.log(this)
// }
// }
// cale.add() // window
// 2 练习
// 'use strict'
const calc = {
add : function() {
// this
const adder = () => {
console.log(this)
}
adder()
}
}
// calc.add() // calc
const addFn = calc.add
addFn() // undefiner -> window
</script>
3-5 不适用箭头函数的场景
不适用箭头函数的场景
- 作为构造函数
- 需要
this指向调用对象的时候 - 需要使用
arguments的时候
代码演示
<script>
// 1 作为构造函数
// 箭头函数没有 this
// const Person = () => {}
// new Person()
// 2 需要 this 指向调用对象的时候
// document.onclick = function() {
// console.log(this)
// }
// document.addEventListener("click",() => {
// console.log(this) //window
// },false )
// 3 需要使用 arguments 的时候
// function add() {
// console.log(arguments)
// }
// add(1,2,3,4,5)
// const add = () => console.log(arguments)
// add()
// 剩余参数
</script>
3-6 箭头函数的应用
代码演示
<style>
body {
padding: 50px 0 0 250px;
font-size: 22px;
font-size: 30px;
}
#btn {
width: 100px;
height: 100px;
margin-right: 20px;
font-size: 30px;
cursor: pointer;
}
</style>
</head>
<body>
<button id="btn">开始</button>
<span id="result">0</span>
<script>
const btn = document.getElementById("btn")
const result = document.getElementById("result")
// const time = {
// time:0,
// start:function() {
// btn.addEventListener("click",function() {
// setInterval(function() {
// // this.time++;
// // result.innerHTML = this.time
// that:time++;
// result.innerHTML = that.time
// },1000)
// },false)
// }
// }
const timer = {
time: 0,
start: function () {
btn.addEventListener("click", () => {
setInterval(() => {
console.log(this);
this.time++
result.innerHTML = this.time
}, 1000)
}, false)
}
}
timer.start()
</script>
数组的解构赋值
4-1 数组的解构赋值
解构赋值是什么
- 认识解构赋值
- 什么是解构赋值
代码演示
<script>
// 1 认识解构赋值
// const arr = [1,2,3]
// const a = arr[0]
// const b = arr[1]
// const c = arr[2]
// console.log(a,b,c)
// const [a,b,c] = [1,2,3]
// onsole.log(a,b,c)
// 2 什么是解构赋值
// 解析某一数据的结构 将我们想要的东西提取出来 赋值给变量或常量
</script>
4-2、数组解构赋值的原理
数组解构赋值的原理
- 模式 (结构) 匹配
- 索引值相同的完成赋值
代码演示
<script>
// 1 模式(结构)匹配
// [] = [1,2,3]
// 2 索引值相同的完成赋值
// const [a,b,c] = [1,2,3]
// console.log(a,b,c)
// 不取的 可以直接用逗号跳过
const [a,[,,b],c] = [1,[2,4,5],3]
console.log(a,b,c)
</script>
4-3 数组解构赋值的默认值
数组解构赋值的默认值
- 默认值的基本用法
- 默认值的生效条件
- 默认值表达式
代码演示
<script>
// 1 默认值的基本用法
// const [a,b] = []
// const [a,b] = [undefined,undefined]
// const [a,b] = []
// console.log(a,b)
// 2 默认值的生效条件
// 只有当一个数组成员严格等于 ( === ) undefined时 对应的默认值才会生效
// const [a = 1 , b = 2] = [3,0] // 3 0
// const [a = 1 , b = 2] = [3,null] // 3 null
// const [a = 1 , b = 2] = [3] // 3 2
// console.log(a,b)
// 3 默认值表达式
// 如果默认值是表达式 默认表达式是惰性求值的
const func = () => {
console.log("我被执行了")
return 2
}
const[x = func()] = [1]
console.log(x)
</script>
4-4 数组解构赋值的应用
代码演示
<body>
<p>111</p>
<p>151</p>
<p>121</p>
<script>
// 1 常见的类数组的解构赋值
// arguments
// function func() {
// // console.log(arguments)
// // console.log(arguments.push)
// const [a,b] = arguments
// }
// func()
// func(1,2)
// NodeList
// console.log(document.querySelectorAll("p"))
// const [p1,p2,p3] = document.querySelectorAll("p")
// console.log(p1,p2,p3)
// 2 函数参数的解构赋值
// const array = [1,1]
// // const add = arr => arr[0] + arr[1]
// const add = ([x,y])=> x + y
// console.log(add(array))
// 3 交换变量的值
let x = 1;
let y = 2;
// let = tmp = x
// x = y
// y = tmp
// console.log(x,y)
[x,y] = [y,x];
console.log(x,y)
</script>
</body>
对象的解构赋值
5-1 对象的解构赋值
对象的解构赋值的原理
- 模式 (结构) 匹配
- 属性名相同的完成赋值
代码演示
<script>
// 1 模式(结构)匹配
// {} = {}
// 2 属性名相同的完成赋值
// const {age,username} = {username:"Alex",age18}
// const {age:age,username:username} = {username:"Alex",age:18}
// console.log(age,username)
// 取别名
const {age:age,username:uname} = {username:"Alex",age:18}
console.log(age,uname)
</script>
5-2 对象解构赋值的注意事项
对象解构赋值的注意事项
- 对象解构赋值的默认值
- 将一个已经声明的变量用于解构赋值
- 可以取到继承的属性
代码演示
<script>
// 默认值的生效条件
// 对象的属性严格等于 undefined 时 对应的默认值才会生效
// const {username = "ZhangSan",age = 0} = {username:"Alex"}
// console.log(username,age)
// 2 默认值表达式
// 如果默认值是表达式 默认值表达式是惰性求值
// 3 将一个已经声明的变量用于解构赋值
// 如果将一个已经声明的变量用于对象的结构赋值 整个赋值需在圆括号中进行
// let {x} = {x:1}
// console.log(x)
// let x = 2;
// // ({x} = {x:1})
// [x] = [1];
// console.log(x)
// 4 可以取到继承的属性
// const {a = 1} = {}
// console.log(a)
const {toString} = {}
// console.log(toString)
// Object.prototype
// console.log(Object.prototype)
console.log({})
</script>
5-3 对象解构赋值的应用
代码演示
<script>
// 1 函数参数的结构赋值
// const logPersonlnfo = user => console.log(user.username,user.age)
const logPersonlnfo = ({ age = 0, username = "ZhangSan" }) => console.log(username, age)
// logPersonlnfo({username:"Alex",age:18})
logPersonlnfo({})
// {age,username:username} = {username:"Alex",age:18}
// 2 复杂的嵌套
const obj = {
x: 1,
y: [2, 3, 4],
z: {
a: 5,
b: 6
}
}
// const {x,y,z} = obj
// console.log(x,y,z)
const {
y: y,
y: [, yy],
z,
z:{b:b}
} = obj
console.log(yy,y,z)
</script>
5-4 其他数据类型的解构赋值
其他数据类型的解构赋值
- 字符串的解构赋值
- 数值和布尔值的解构赋值
undefine和null的解构赋值
代码演示
<script>
// 1 字符串的解构赋值
// "" = "hllo" x
// 数组形式的结构赋值
// const [a,b,,c] = "hello"
// console.log(a,b,c)
// 对象形式的结构赋值
// const {0:a,1:b} = "hello";
// console.log(a,b,length)
// console.log("hello".length)
// 字符串既可以按数组形式来解构赋值 也可以按对象形式来解构赋值
// 2 数值和补二至的结构赋值
// 先将等号右边的值转为对象
// console.log(new Number(123))
// const{a = 1 , toString} = 123
// console.log(a,toString)
// const { b = 2 , toString} = true
// console.log(b,toString)
// undefined 和 null 的结构赋值
// 由于 undefined 和 null 无法转为对象 所以它们进行解构赋值 都会报错
// const {toString} = undefined //报错
// const {toString} = null //报错
</script>
对象字面量的增强
6-1 方括号语法
方括号语法
- 方括号语法的用法
- 方括号中可以放什么
- 方括号语法和点语法的区别
代码演示
<script>
// 方括号语法的用法
// const prop = "age"
// const person = {}
// person.prop = 18
// person[prop] = 18
// 方括号语法可以写在对象字面量中
// const person = {
// [prop]:18
// }
// console.log(person)
// 2 方括号中可以放什么
// ${}
// [值或通过计算可以得到值的(表达式)]
// const prop = "agea"
// const func = () => "age"
// const person = {
// // [prop]:18
// // [func()]:18
// // ["sex"]:18
// // ["s"+"ex"]:"male"
// }
// consoel.log(person)
// 3 方括号语法和点语法的区别
// 点语法是方括号语法的特殊形式
// const person = {}
// person.age 等价于 person["age"]
// 属性名由数字 字母 下滑线以及 $ 构成 并且数字还不能大头的时候可以使用点语法
// age18_$ √
// 18age ×
// 合法标识符可以用来作为变量或者常量名
</script>
6-2 属性和方法的简洁表示法
属性和方法的简洁表示法
- 对象字面量是什么
- 属性的简洁表示法
- 方法的简洁表示法
代码演示
<script>
// 1 对象字面量是什么
// const person = new Object()
// person.age = 18
// person.speak = function() {}
// 对象字面量
// const person = {
// age:18,
// speak:function(){}
// }
// 2 属性的简简洁表示法
// 键名和变量或常量名一样的时候 可以只写一个
// const age = 18
// const person = {
// // "age":age
// age
// }
// console.log(person)
// 3 方法的简洁表示法
// 方法可以省略冒号和 function 关键字
// const person = {
// // speak:function() {}
// speak(){}
// }
// console.log(person)
</script>
函数参数的默认值
7-1 函数参数的默认值
函数参数的默认值是什么
- 认识函数参数的默认值
- 函数参数默认值的基本用法
代码演示
script>
// 1 认识函数参数的默认值
// 调用函数的时候传参了 就用传递的参数 如果没传参 就用默认值
// multiply(2,1)
// multiply(2)
// 2 函数参数默认值的基本用法
// const multiply = (x,y) => {
// if(typeof y === 'undefined' ) {
// y = 1
// }
// return x * y
// }
// console.log(multiply(2,2))
// const multiply = (x , y = 1) => x * y
// console.log(multiply(2,2))
</script>
7-2 函数参数默认值的注意事项
函数参数默认值的注意事项
- 默认值的生效条件
- 默认值表达式
- 设置默认值的小技巧
代码演示
<script>
// 1 默认值的生效条件
// // 不传参数 胡总明确的传递 undefined 作为参数 只有这两种情况下 默认值才会生效
// const multiply = (x , y = 1) => x * y
// console.log(multiply(2,0))
// // console.log(multiply(2,null))
// console.log(multiply(2,undefined))
// console.log(multiply(2)
// 2 默认值表达式
// 如果默认值是表达式 默认值表达式是惰性求值的
// 3 设置默认值的小技巧
// 函数参数的默认值 最好从三处列表的右边开始设置
// const multiply = (x = 8.5 , y ) => x * y
// console.log(multiply(undefined,2))
</script>
7-3 函数参数默认值的应用
<script>
// 1 接收很多参数的时候
// const logUser = (username = "ZhangSan" , age = 0 , sex = "male") => console.log(username,age,sex)
// logUser("Alex",18,"male")
// logUser()
// 2 接收一个对象作为参数
// const logUser = options => console.log(options.username,options.age,options.sex)
// logUser({
// username:"Alex",
// age:18,
// sex:"male"
// })
// const logUser = ({username = "ZhangSan" , age = 0 , sex = "male"}) => console.log(username,age,sex)
// const logUser = ({username = "ZhangSan" , age = 0 , sex = "male" }= {})=> console.log(username,age,sex)
// logUser({
// username:"Alex",
// age:18,
// sex:"male"
// })
// logUser({username:"Alex"})
// logUser()
// logUser({username:"Alex"})
</script>
剩余参数
8-1 剩余函数
剩余参数是什么
- 认识剩余函数
- 剩余参数的本质
代码演示
<script>
// 1 认识剩余参数
// const add =(x,y,z,...args) => {}
// 2 剩余参数的本质
const add = (x, y, ...args) => {
console.log(x, y, args)
}
// add()
// add(1)
// add(1,2)
add(1, 2, 3, 4, 5)
// 剩余参数永远是个数组 即使没有值 也是空数组
// 3,4,5 -> [3,4,5]
</script>
8-2 剩余参数的注意事项
注意事项
- 箭头函数的剩余参数
- 使用剩余参数替代
arguments获取实际参数 - 剩余参数的位置
代码演示
<script>
// 1 箭头函数的剩余参数
// 箭头函数的参数部分即使使用一个剩余参数 也不能省略圆括号
// const add =(...args) => {}
// 2 使用剩余参数代替 arguments 获取实际参数
// const add = function() {
// console.log(arguments)
// }
// add(1,2)
// const add = (...args) => {
// console.log(args)
// }
// add(1,2)
// 3 剩余参数的位置
// 剩余参数只能是最后一个参数 之后不能再有其他参数 否则会报错
// const add = (x,y,...args) => {
// console.log(args)
// }
</script>
8-3 剩余函数的应用
代码演示
<script>
// // 1 完成 add 函数
// const add = (...args) => {
// let sum = 0
// for (let i = 0 ; i < args.length; i++) {
// sum += args[i]
// }
// return sum
// // reduce
// }
// // console.log(add())
// console.log(add(1,1,3))
// 2 与解构赋值结合使用
// 剩余参数不一定非要作为函数参数使用
// const [num,...args] = [1,2,3,4]
// // 必须是最后一个
// console.log(num,args)
// const func = (num,...args) => {}
// func(1,2,3)
// const {x,y,...z} ={a:3,x:1,y:2,b:4}
// console.log(x,y,z)
// const func = ({x,y,...z}) => {}
// func({a:3,x:1,y:2,b:4})
</script>
数组的展开运算符
9-1 数组的展开运算符
数组展开运算符的基本用法
- 认识展开运算符
- 数组展开运算符的基本用法
代码演示
<script>
// 1 认识展开运算符
// [3,1,2]
// Math.min
// console.log(Math.min([3,1,2]))
// console.log(Math.min(3,1,2))
// [3,1,2] -> 3,1,2
// 2 数组展开运算符的基本用法
// console.log(Math.min([...3,1,2]))
// 相当于
// console.log(Math.min(...3, 1, 2))
</script>
9-2 区分剩余参数和展开运算符.
区分剩余参数和展开运算符
- 根本区别
- 区分剩余参数和展开运算符
代码演示
<script>
// 1 根本区别
// 展开运算符
// [3,1,2] -> 3,1,2
// 剩余参数
// 3,1,2- > [3,1,2]
// 2 区分僧与参数和展开运算符
// const add = (...args) => {
// console.log(args)
// console.log(...args)
// console.log(...[1,2,3])
// console.log(1,2,3)
// }
// add(1,2,3)
// console.log([...[1,2,3],4])
// 1,2,3- > [1,2,3]
</script>
9-3 数组展开运算符的应用
代码演示
<body>
<p>1</p>
<p>1</p>
<p>1</p>
<script>
// 1 复制数组
// const a = [1,2]
// const B = a
// a[0] = 3
// console.log(b)
// const c = [...a]
// const c = [1,2]
// a[0] = 3
// console.log(a)
// console.log(c)
// 合并数组
// const a = [1,2]
// const b = [3]
// const c = [4,5]
// console.log([...a,...b,...c])
// console.log([...b,...a,...c])
// console.log([1,...a,2,...b,3,...c])
// 3 字符串转为数组
// 字符串可恶意按照数组的形式展开
// console.log(..."Alex")
// console.log('A','l','e','x')
// console.log([..."Alex"])
// console.log("Alex".split(""))
// 4 常见的类数组转化为数组
// arguments
// function fun () {
// console.log(arguments.push)
// console.log(...arguments)
// }
// fun(1,2)
// NodeList
// console.log(document.querySelectorAll("p"))
// console.log([document.querySelectorAll("p")].push)
</script>
</body>
对象的展开运算符
10-1 对象的展开运算符
基本用法
- 展开对象
- 合并对象
代码演示
<script>
// 展开对象
// const apple = {
// color : "红色",
// shape : "球形",
// taste : "甜"
// }
// console.log(...apple)
// console.log([...apple])
// 对象的展开 : 把属性罗列起来 用逗号分隔 放到一个 {} 中 构成新对象
// console.log({ ...apple })
// console.log({ ...apple } === apple)
// 2 合并对象
// const apple = {
// color: "红色",
// shape: "球形",
// taste: "甜"
// }
// const pen = {
// color: "黑色",
// shape: "圆柱形",
// use: "写字"
// }
// console.log(...pen)
// console.log({...apple,...pen})
// 新对象拥有全部属性 相同属性 后者覆盖前者
// console.log({...pen,...apple})
// 相当于
// console.log({
// use: "写字",
// color: "红色",
// shape: "球形",
// taste: "甜"
// })
// console.log({...pen,apple})
<script>
10-2 对象展开运算符的注意事项
注意事项
- 空对象的展开
- 非对象的展开
- 对象中对象属性的展开
代码演示
<script>
// 复制对象
// const a = {x:1,y:2}
// const b = a
// constc = {...a}
// console.log(c,c === a)
// 2 用户参数和默认参数
// add(1,2)
// const logUser = ({
// username = "ZhangSan",
// age = 0,
// sex = "male"
// } = {}) => {
// console.log(username, age, sex)
// }
// const logUser = userParam => {
// const defaultParam = {
// username: "ZhangSan",
// age: 0,
// sex: "male"
// }
// const param = {...defaultParam,...userParam }
// console.log(param.username)
// const {username,sex,age} ={...defaultParam,...userParam}
// console.log(username,age,sex)
// }
// logUser()
</script>
10-3 对象展开运算符的应用
代码演示
<script>
// 1 复制对象
// const a = {x:1,y:2}
// const b = a
// const c = {...a}
// console.log(c,c===a)
// 2 用户参数和默认参数
// add(1,2)
// const logUser = ({
// username = "ZhangSan",
// age = 0,
// sex = "male"
// } = {}) => {
// console.log(username, age, sex)
// }
// const logUser = userParam => {
// const defaultParam = {
// username: "ZhangSan",
// age: 0,
// sex: "male"
// }
// const param = { ...defaultParam, ...userParam }
// console.log(param.username)
// const param = {...defaultParam,...undefined}
// const {username,age,sex} = {...defaultParam,...userParam}
// console.log(username,age,sex)
// }
// logUser()
</script>
Set
11-1 Set是什么
代码演示
<script>
// 1 什么是set
// 集合
// [1,2]
// 数组是一系列有序的数据集合
// Set 是一系列无序 没u有重复值的数据集合
// 2 理解set
// console.log([1,2,1])
// console.log(new Array(1,2,1))
const s = new Set()
s.add(1)
s.add(2)
// Set中不能有重复成员
s.add(1)
console.log(s)
// Set 没有下标去标示每一个值 所以set是无序的 也不能像数组那样通过下笔哎去访问Set成员
</script>
11-2 Set实例的方法和属性
- 方法
- 属性
代码演示
<script>
// 1 方法
// add
const s = new Set()
s.add(1).add(2).aff(2)
// console.log(s)
// has
// console.log(s.has(1))
// console.log(s.has(3))
// delete
// s.delete(1)
// s.delete(3)
// console.log(s)
// clear
// s.clear()
// console.log(s)
// forEach
// s.forEach(function(value,key,set){
// // Set中的 value = key
// // console.log(value,key,set === s)
// // console.log(this)
// },document)
// console.log(s)
// 按照成员添加进集合的顺序遍历
// 2 属性
// size
// console.log(s.size)
// console.log(s)
</script>
11-3 Set构造函数的参数
代码演示
<body>
<p>1</p>
<p>2</p>
<p>3</p>
<script>
// 数组
// const s = new Set([1,2,1])
// console.log(s)
// 字符串 arguments NodeList Set 等
// console.log(new Set("hi"))
// function func() {
// console.log(new Set(arguments))
// }
// func(1,2,1)
// console.log(new Set(document.querySelectorAll("p")))
// const s = new Set([1,2,1])
// console.log(new Set(s) === s)
// console.log(s)
</script>
</body>
11-4 Set的注意事项
- 基本用法
- 什么时候使用
Set
<body>
<script>
// 1.判断重复的方式
const s = new Set([1,2,1])
// console.log( 1 === 1 )
// console.log( NaN === NaN )
// Set 对重复值的判断基本遵循严格相等 ( === )
// 但是对于 NaN 的判断与 === 不同 Set 中 NaN 等于 NaN
// console.log(s)
</script>
</body>