ES6
介绍
ECMAScript 6.0(以下简称 ES6,ECMAScript 是一种由 Ecma 国际(前身为欧洲计算机制造商 协会,英文名称是 European Computer Manufacturers Association)通过 ECMA-262标准化的脚本 程序设计语言)是 JavaScript 语言的下一代标准
,已经在 2015 年 6 月正式发布了,并且 从 ECMAScript 6 开始,开始采用年号来做版本。
即 ECMAScript 2015,就是 ECMAScript6。 它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 每年一个新版本
。
ECMAScript 是浏览器脚本语言的规范,而各种我们熟知的 js 语言,如 JavaScript 则是 规范的具体实现。
let 与 var 的区别,const声明常量
现在常用 let 声明变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// var 声明的变量往往会越域
// let 声明的变量有严格局部作用域
{
var a = 1;
let b = 2;
}
// 1
console.log(a)
// 1let.html:24 Uncaught ReferenceError: b is not defined
console.log(b)
// var 可以声明多次
// let 只能声明一次
var m = 1
var m = 2
let n = 3
let n = 4
console.log(m)
// Uncaught SyntaxError: Identifier 'n' has already been declared
console.log(n)
// var 会提升变量
// let 不存在变量提升
// undefined
console.log(x)
var x = 10;
// Uncaught ReferenceError: Cannot access 'y' before initialization
console.log(y)
let y = 5
// 1.声明之后不允许改变
// 2.一旦声明必须初始化,否则会报错
const a = 1;
// Uncaught TypeError: Assignment to constant variable.
a = 3;
</script>
</body>
</html>
解构表达式
简化代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 数组解构
let arr = [1,2,3]
// 这么写没问题,就是太麻烦了
// let a = arr[0]
// let b = arr[1]
// let c = arr[2]
let [a,b,c] = arr;
// 1,2,3
console.log(a,b,c)
// 对象解构
const person = {
name: "jack",
age: 21,
language:['java','js','css']
}
// 以前的写法
// const name = person.name
// const age = person.age
// const language = person.language
// 属性名相同时
// const {name, age, language} = person;
// console.log(name,age,language)
// 属性名不同时
const {name:abc, age, language} = person;
console.log(abc,age,language)
</script>
</body>
</html>
字符串扩展
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let str = "hello.vue";
// 都是true
console.log(str.startsWith("hello"))
console.log(str.endsWith(".vue"))
console.log(str.includes("e"))
console.log(str.includes("hello"))
// 字符串模板
// 以前是双引号,很麻烦
let ss = `<div>
<span>hello world</span>
</div>
`
// console.log(ss)
// 字符串插入变量和表达式,变量名写在 ${} 中,${} 中可以放入 js 表达式
function fun(){
return "这是一个函数"
}
// 我是jack,今年31了,我想说:这是一个函数
// 字符串插入变量和表达式。变量名写在${}中,${}中可以放入 javascript 表达式
let info = `我是${abc},今年${age + 10}了,我想说:${fun()}`
console.log(info)
</script>
</body>
</html>
函数优化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法
function add(a,b){
b = b || 1;
return a + b;
}
// 11
// console.log(add(10))
// 现在可以这么写,方法声明的时候直接给参数写上默认值,没穿就会自动使用默认值
function add2(a, b = 1){
return a+ b;
}
// 11
console.log(add2(10))
// 不定参数
function fun(...values){
console.log(values.length)
}
// fun(1,2)
// fun(1,2,3,4)
// 箭头函数
// 以前声明一个方法
// var print = function(obj){
// console.log(obj)
// }
// 现在
// 一个参数
// var print = obj => console.log(obj)
// print('hello')
// 多参数
// var sum = (a,b) => a + b;
// console.log(sum(1,2))
// 方法体代码较多
// var sum2 = (a,b) => {
// c = a + b;
// return a + c;
// }
// console.log(sum2(10,20))
// 解构 + 箭头函数
const person = {
name: "jack",
age: 21,
language:['java','js','css']
}
function hello(param){
console.log('hello' + param.name)
}
var hello2 = (param) => console.log('hello' + param.name)
var hello3 = ({name}) => console.log('hello' + name)
hello3(person)
</script>
</body>
</html>
对象优化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const person = {
name: "jack",
age: 21,
language:['java','js','css']
}
// 返回所有key
console.log(Object.keys(person))
// 返回所有value
console.log(Object.values(person))
// [["name","jack"],["age",21],["language",["java","js","css"]]]
console.log(Object.entries(person))
const target = {a:1};
const source1 = {b:2};
const source2 = {c:3};
// Object.assign 方法的第一个参数是目标对象,后面的参数都是源对象
Object.assign(target,source1,source2)
// {a:1,b:2,c:3}
console.log(target)
// 声明对象简写
const age = 23;
const name = "张三";
// 以前
// const person = {age:age,name:name}
// 如果对象的属性名和变量的属性名是一样的
const person2 = {name,age}
console.log(person2)
// 对象的函数属性简写
let person3 = {
name:"jack",
// 以前
// eat: function(food){
// console.log(this.name + '在吃' + food)
// }
// 箭头函数this不能使用,对象.属性
// eat: food => console.log(person3.name + '在吃' + food)
eat(food){
console.log(this.name + '在吃' + food)
}
}
person3.eat("香蕉")
// 对象拓展运算符
// 拷贝对象(深拷贝)
let p1 = {name:"Amy",age:15}
// 把p1所有的属性、值赋值给someone
let someone = {...p1}
// console.log(someone)
// 合并对象
let age1 = {age:15}
let name1 = {name:"Amy"}
// {age: 15, name: "Amy"}
// 如果字段有重复,后面的值会覆盖前面的值
let person4 = {...age1,...name1}
console.log(person4)
</script>
</body>
</html>
数组的map()和reduce()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
let arr = ['1','20','-5','3']
// 数组.map():接收一个函数,将原数组中的所有元素用这个函数处理后返回一个新的数组
// arr = arr.map((item)=>{
// return item*2
// })
// 简写
arr = arr.map(item=>item*2)
console.log(arr);
// 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素
// arr [2, 40, -10, 6]
// arr.reduce(callback,[initialValue])
// 参数可以有四个
// previousValue (上一次调用调用返回的值,或者是提供的初始值(initialValue))
// currentValue 数组中当前被处理的元素
// index 当前元素在数组中的索引
// array 调用reduce的数组
let result = arr.reduce((a,b)=>{
console.log("上一次处理后:"+a)
console.log("当前正在处理:"+b)
return a + b;
});
// 上一次处理后:2
// 当前正在处理:40
// 上一次处理后:42
// 当前正在处理:-10
// 上一次处理后:32
// 当前正在处理:6
// 38
console.log(result)
// 加上初始值就是,从100开始加,而不是从2开始加
// 就是说第一个a是100
let result = arr.reduce((a,b)=>{
console.log("上一次处理后:"+a)
console.log("当前正在处理:"+b)
return a + b;
},100);
</script>
</body>
</html>
Promise异步编排
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- <script type="text/javascript" src="/jquery.js"></script> -->
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<script>
// 1.查出当前用户信息
// 2.按照当前用户的id查出
// 3.按照当前课程id查出分数
// 这样不断的嵌套还是太麻烦了
// $.ajax({
// url:"mock/user.json",
// success(data){
// console.log("查询用户:", data);
// $.ajax({
// url: `mock/user_score_${data.id}.json`,
// success(data){
// console.log("查询到课程:",data)
// $.ajax({
// url: `mock/corse_score_${data.id}.json`,
// success(data){
// console.log("查询到分数:",data)
// },
// error(error){
// console.log("出现异常了:" + error)
// }
// });
// },
// error(error){
// console.log("出现异常了:" + error)
// }
// });
// },
// error(error){
// console.log("出现异常了:" + error)
// }
// })
// Promise 可以封装异步操作
// resolve 成功并把结果往下传,reject 失败并把结果往下传
// Promise在代码上来说并没有简化很多
// 但是不会嵌套那么多层,符合人类的思考思路
let p = new Promise((resolve, reject) => {
// 异步操作
$.ajax({
url: "mock/user.json",
dataType: "json",
success: function (data) {
console.log("查询用户成功:", data)
resolve(data);
},
error: function (error) {
reject(error)
}
});
});
p.then((obj) => {
return new Promise((resolve, reject) => {
$.ajax({
url: `mock/user_corse_${obj.id}.json`,
dataType: "json",
success: function (data) {
console.log("查询用户课程成功:", data)
resolve(data);
},
error: function (error) {
reject(error)
}
});
})
}).catch((err)=>{
})
.then((data) => {
$.ajax({
url: `mock/corse_score_${data.id}.json`,
dataType: "json",
success: function (data) {
console.log("查询课程得分成功:", data)
// resolve(data);
},
error: function (error) {
reject(error)
}
});
}).catch((err)=>{
})
console.log("-------------------------------")
// 把 Promise封装成方法
function get(url, data) {
return new Promise((resolve, reject) => {
$.ajax({
url: url,
dataType: "json",
success: function (data) {
resolve(data);
},
error: function (error) {
reject(error)
}
})
})
}
get("mock/user.json")
.then((data) => {
console.log("用户查询成功", data)
return get(`mock/user_corse_${data.id}.json`)
})
.then((data) => {
console.log("课程查询成功", data)
return get(`mock/corse_score_${data.id}.json`)
})
.then((data)=>{
console.log("课程成绩查询成功:",data)
})
.catch((err) =>{
console.log("出现异常",err)
});
</script>
</body>
</html>
模块化
模块化就是把代码进行拆分,方便重复利用。类似 java 中的导包:要使用一个包,必须先 导包。
而 JS 中没有包的概念,换来的是 模块。 模块功能主要由两个命令构成:export
和import
。 export
命令用于规定模块的对外接口。 import
命令用于导入其他模块提供的功能。
export
// export const util = {
// sum(a,b){
// return a + b;
// }
// }
// 方法名是默认的,在导入的时候,方法名可以自己定义
// import abc
export default{
sum(a,b){
return a + b;
}
}
let name = "jack"
let age = 21
// export 不仅可以导出对象,一切js变量都可以导出。
// 比如:基本类型变量、函数、数组、对象
// export {
// util,name,age
// }
import
import { util,name,age } from "./user";
全部转载自尚硅谷视频:
https://www.bilibili.com/video/BV1np4y1C7Yf?p=29&spm_id_from=pageDriver
那一瞬间,思琪的刘海往上飞蒸,就好像她从高处掉下来。长脖颈托住蛋形脸,整个的脸露出来,额头光饱饱地像一个小婴儿的奶嗝。
房思琪的初恋乐园
林奕含