ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。
从第 6 版开始,发生了里程碑的改动,并保持着每年迭代一个版本的习惯。
ES6=2015年,ES7=2016年,ES8=2017年,ES9=2018年,ES10=2019年,ES11=2020年以此类推。
-
- //声明变量
- let a;
- let b, c, d;
- let e = 100;
- let f = 521, g = 'iloveyou', h = [];
-
- //1. 变量不能重复声明
- //let star = '罗志祥';
- //let star = '小猪';
- //console.log("Uncaught SyntaxError: Identifier 'star' has already been declared");
-
- //2. 块儿级作用域 全局, 函数, eval
- //类似块级作用于的还有:if else while for
- {
- let girl = '周扬青';
- console.log(girl);//可以正确输出
- }
- //console.log(girl);
- //console.log("Uncaught ReferenceError: girl is not defined at");
-
- //3. 不存在变量提升
- // console.log(song);
- // let song = '爱唱歌';
- // console.log("Uncaught ReferenceError: Cannot access 'song' before initialization");
-
- //4. 不影响作用域链
- {
- let school = '清华大学';
- function fn() {
- console.log(school);
- }
- fn();
- }
-
-
- //声明常量
- const SCHOOL = '清华大学';
-
- //1. 一定要赋初始值
- //const A;
- //console.log("Uncaught SyntaxError: Missing initializer in const declaration");
-
- //2. 一般常量使用大写(潜规则)
- const a = 100;
- //3. 常量的值不能修改
- //SCHOOL = '北京大学';
- //console.log("Uncaught TypeError: Assignment to constant variable");
-
- //4. 块儿级作用域
- // {
- // const PLAYER = '乔丹';
- // }
- // console.log(PLAYER);
- // console.log("Uncaught ReferenceError: PLAYER is not defined at");
-
- //5. 对于数组和对象的元素修改, 不算做对常量的修改, 不会报错
- const BAT = ['百度', '阿里巴巴', '腾讯'];
- BAT.push('字节跳动');
- console.log(BAT);//输出:['百度', '阿里巴巴', '腾讯', '字节跳动']
-
-
-
- //ES6 允许按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。
- //1. 数组的结构
- const SCHOOL = ['清华大学', '北京大学'];
- let [qinghua, beida] = SCHOOL;
- console.log(qinghua);//输出清华大学
- console.log(beida);//输出北京大学
-
- //2. 对象的解构
- const student = {
- name: "小明",
- age: 18,
- like: function () {
- console.log("我喜欢打篮球");
- }
- }
- let { name, age, like } = student;
- console.log(name);//输出小明
- console.log(age);//输出18
- console.log(like);//输出:ƒ () {console.log("我喜欢打篮球");}
- like();//输出:我喜欢打篮球
-
-
- // ES6 引入新的声明字符串的方式 『``』
- //1. 声明
- let str = `这是一个字符串`;
- console.log(str, typeof str);//输出:这是一个字符串 string
-
- //2. 内容中可以直接出现换行符
- let SCHOOL = `
-
- 清华大学
-
- 北京大学
- `;
-
- //3.变量拼接
- let boy = `马云`;
- let word = `${boy}说让天下没有难做的生意!`;
- console.log(word);//输出:马云说让天下没有难做的生意!
-
-
- //ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。
- //这样的书写更加简洁
- let name = '马云';
- let word = function () {
- console.log('让天下没有难做的生意');
- }
-
- const obj = {
- name,
- word,
- say() {
- console.log("幸福是奋斗出来的!");
- }
- }
- console.log(name);//输出:马云
- console.log(word);//输出:ƒ () { console.log('让天下没有难做的生意'); }
- console.log(obj);//输出:{name: '马云', word: ƒ, say: ƒ}
-
-
- // ES6 允许使用「箭头」(=>)定义函数。
- //声明一个函数
- let fn = (a, b) => {
- return a + b;
- }
- //调用函数
- let result = fn(3, 5);
- console.log(result);//输出:8
-
-
- //1. this 是静态的. this 始终指向函数声明时所在作用域下的 this 的值
- function getName() {
- console.log(this.name);
- }
- let getName2 = () => {
- console.log(this.name);
- }
-
- //设置 window 对象的 name 属性
- window.name = '清华大学';
- const school = {
- name: "北京大学"
- }
-
- //直接调用
- getName();//输出:清华大学(作用域是 window)
- getName2();//输出:清华大学(作用域是 window)
-
- //call 方法调用
- getName.call(school);//输出:北京大学
- getName2.call(school);//输出:清华大学(作用域是 window)
-
- //2. 不能作为构造实例化对象
- // let Person = (name, age) => {
- // this.name = name;
- // this.age = age;
- // }
- // let me = new Person('张三', 18);
- // console.log(me);//输出错误信息:Person is not a constructor at
-
- //3. 不能使用 arguments 变量
- // let fn = () => {
- // console.log(arguments);
- // }
- // fn(1, 2, 3);//输出错误信息:Uncaught SyntaxError: Identifier 'fn' has already been declared
-
- //4. 箭头函数的简写
- //1) 省略小括号, 当形参有且只有一个的时候
- let add = n => {
- return n + n;
- }
- console.log(add(6));//输出:12
-
- //2) 省略花括号, 当代码体只有一条语句的时候, 此时 return 必须省略
- // 而且语句的执行结果就是函数的返回值
- let pow = n => n * n;
-
- console.log(pow(9));//输出:81
-
-
注意:箭头函数不会更改 this 指向,用来指定回调函数会非常合适
- <div>我是div1div>
- <div>我是div2div>
- <div>我是div3div>
- <script>
- // ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments
- // rest 参数
- function getUserName(...args) {
- console.log(args);
- }
- getUserName('刘亦菲', '关之琳', '刘雯雯');//输出:['刘亦菲', '关之琳', '刘雯雯']
-
- // rest 参数必须要放到参数最后
- function fn(a, b, ...args) {
- console.log(a);
- console.log(b);
- console.log(args);
- }
- fn(1, 2, 3, 4, 5, 6);//输出:1、2、 [3, 4, 5, 6]
-
- //1. 数组的合并
- const university = ["清华大学", "北京大学"];
- const foreign = ["哈佛大学", "牛津大学"];
- const concat1 = university.concat(foreign);
- console.log("concat1=" + concat1);//输出:concat1=清华大学,北京大学,哈佛大学,牛津大学
- const concat2 = [...university, ...foreign];
- console.log("concat2=" + concat2);//输出:concat2=清华大学,北京大学,哈佛大学,牛津大学
-
- //2. 数组的克隆
- const student = ["小明", "小花", "小聪"];
- const copy1 = [...student];
- console.log("copy1=" + copy1);//输出:copy1=小明,小花,小聪
-
- //3. 将伪数组转为真正的数组
- const divs = document.querySelectorAll('div');//注意在文档顶部有3个div
- const divArr = [...divs];
- console.log(divArr);//输出:[div, div, div]
-
- script>
-
-
- // 『...』 扩展运算符能将『数组』转换为逗号分隔的『参数序列』
- //声明一个数组 ...
- const F4 = ['刘德华', '黎明', '张学友', '郭富城'];
-
- // 声明一个函数
- function tianwang() {
- console.log(arguments);
- }
- tianwang(...F4);
- //输出:Arguments(4) ['刘德华', '黎明', '张学友', '郭富城', callee: ƒ, Symbol(Symbol.iterator): ƒ]
-
-
-
- //创建 symbol
- let s1 = Symbol();
- console.log(s1, typeof s1);//输出:Symbol() 'symbol'
-
- let s2 = Symbol("清华大学");
- let s3 = Symbol.for("广东省深圳市");
-
- //不能与其他数据进行运算
- //let result1 = s1 + 100;
- //console.log(result1);//输出:Uncaught TypeError: Cannot convert a Symbol value to a number
- //let result2 = s2 + "教授";
- //console.log(result2);//输出:Uncaught TypeError: Cannot convert a Symbol value to a string
-
- let youxi = {
- name: "王者荣耀",
- [Symbol('zhongdan')]: function () {
- console.log("我可以中单")
- },
- [Symbol('daye')]: function () {
- console.log('我可以打野');
- }
- }
- console.log(youxi)
-
-
- let F4 = ["刘德华", "郭富城", "黎明", "张学友"];
- //使用 for...of 遍历数组
- for (let v of F4) {
- console.log(v);//循环输出:刘德华、郭富城、黎明、张学友
- }
-
- let iterator = F4[Symbol.iterator]();
- //调用对象的next方法
- console.log(iterator.next());//输出:{value: '刘德华', done: false}
- console.log(iterator.next());//输出:{value: '郭富城', done: false}
- console.log(iterator.next());//输出:{value: '黎明', done: false}
- console.log(iterator.next());//输出:{value: '张学友', done: false}
- console.log(iterator.next());//输出:{value: undefined, done: true}
-
- //自定义遍历数据
- const NBA = {
- name: "美国篮球协会",
- player: ["乔丹", "麦迪", "姚明"],
- [Symbol.iterator]() {
- //索引变量
- let index = 0;
- let _this = this;
- return {
- next: function () {
- if (index < _this.player.length) {
- const result = {
- value: _this.player[index], done: false
- };
- //下标自增
- index++;
- return result;
- } else {
- return { value: undefined, done: true };
- }
- }
- };
- }
- }
-
- //遍历这个 NBA 对象
- for (let v of NBA) {
- console.log(v);//输出:乔丹、麦迪、姚明
- }
-
-
-
-
- //生成器其实就是一个特殊的函数
- //异步编程 纯回调函数
- //函数代码的分隔符
- function* NBA() {
- yield "乔丹";
- yield "麦迪";
- yield "姚明";
- }
-
-
- let iterator = NBA();
- console.log(iterator.next());//输出:{value: '乔丹', done: false}
- console.log(iterator.next());//输出:{value: '麦迪', done: false}
- console.log(iterator.next());//输出:{value: '姚明', done: false}
- console.log(iterator.next());//输出:{value: undefined, done: true}
-
- //遍历
- for (let v of NBA()) {
- console.log(v);//输出:乔丹、麦迪、姚明
- }
-
- //生成器函数参数
- function* university(arg) {
- console.log("arg=" + arg);
- let one = yield "清华大学";
- console.log("one=" + one);
-
- let two = yield "北京大学";
- console.log("two=" + two);
-
- let three = yield "哈佛大学";
- console.log("three=" + three);
- }
-
- //执行获取迭代器对象
- let iter = university("上海交大");
- console.log("iter.next1=" + iter.next());
- //next方法可以传入实参
- console.log("iter.next2=" + iter.next("医科大"));
- console.log("iter.next3=" + iter.next("中山大学"));
- console.log("iter.next4=" + iter.next("复旦大学"));
-
- //依次输出:
- /*
- arg=上海交大
- iter.next1=[object Object]
- one=医科大
- iter.next2=[object Object]
- two=中山大学
- iter.next3=[object Object]
- three=复旦大学
- iter.next4=[object Object]
- */
-
-
- //生成器函数实例
- //异步编程、文件操作、网络操作(ajax、Request、数据库操作)
- //模拟获取:用户数据、订单数据、商品数据
- function getUserInfo() {
- setTimeout(
- () => {
- let data = "用户数据";
- console.log(data);
- //调用 next 方法,并且将数据传入
- info.next(data);
- }, 1000)
- }
-
- function getOrderInfo() {
- setTimeout(
- () => {
- let data = "订单数据";
- console.log(data);
- info.next(data);
- }, 1000)
- }
-
- function getGoodsInfo() {
- setTimeout(
- () => {
- let data = "商品数据";
- console.log(data);
- info.next(data);
- }, 1000)
- }
-
- function* getMallInfo() {
- yield getUserInfo();
- yield getOrderInfo();
- yield getGoodsInfo();
- }
-
- //调用生成器函数
- let info = getMallInfo();
- info.next();//依次输出:用户数据、订单数据、商品数据
-
-
代码说明:
-
- // promise 基本语法
- //实例化 Promise 对象
- const promise = new Promise(function (resolve, reject) {
- /* 正常读取数据*/
- setTimeout(function () {
- let data = '数据库中的用户数据';
- resolve(data);
- }, 1000);
-
-
- /*
- setTimeout(function () {
- let err = '数据读取失败';
- reject(err);
- });
- */
- });
-
- //调用 promise 对象的 then 方法
- promise.then(function (value) {
- console.log(value);
- }, function (reason) {
- console.error(reason);
- })
-
-
-
- const p = new Promise((resolve, reject) => {
- //1. 创建对象
- const xhr = new XMLHttpRequest();
-
- //2. 初始化
- xhr.open("GET", "输入具体的 URL 地址,比如 http://www.baidu.com/");
-
- //3. 发送
- xhr.send();
-
- //4. 绑定事件, 处理响应结果
- xhr.onreadystatechange = function () {
- //判断
- if (xhr.readyState === 4) {
- //判断响应状态码 200-299
- if (xhr.status >= 200 && xhr.status < 300) {
- //表示成功
- resolve(xhr.response);
- } else {
- //如果失败
- reject(xhr.status);
- }
- }
- }
- })
-
- //指定回调
- p.then(function (value) {
- console.log(value);
- }, function (reason) {
- console.error(reason);
- });
-
-
- //创建 promise 对象
- const p2 = new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve('用户数据');
- // reject('出错啦');
- }, 1000)
- });
-
- //调用 then 方法 then方法的返回结果是 Promise 对象, 对象状态由回调函数的执行结果决定
- //1. 如果回调函数中返回的结果是 非 promise 类型的属性, 状态为成功, 返回值为对象的成功的值
-
- // const result = p2.then(value => {
- // console.log(value);
- // //1. 非 promise 类型的属性
- // // return 'iloveyou';
- // //2. 是 promise 对象
- // // return new Promise((resolve, reject)=>{
- // // // resolve('ok');
- // // reject('error');
- // // });
- // //3. 抛出错误
- // // throw new Error('出错啦!');
- // throw '出错啦!';
- // }, reason=>{
- // console.warn(reason);
- // });
-
- //链式调用
- p2.then(value => {
-
- }).then(value => {
-
- });
-
-
-
- const p3 = new Promise((resolve, reject) => {
- setTimeout(() => {
- //设置 p 对象的状态为失败, 并设置失败的值
- reject("出错啦!");
- }, 1000)
- });
-
- // p3.then(function(value){}, function(reason){
- // console.error(reason);
- // });
-
- p3.catch(function (reason) {
- console.warn(reason);
- });
-
-
- //创建一个空集合
- let emptySet = new Set();
-
- //创建一个非空集合
- let wangzhe = new Set(["射手", "法师", "打野", "上单", "辅助"]);
- //返回集合的元素个数
- console.log(wangzhe.size);//输出:5
- //遍历集合
- for (let v of wangzhe) {
- console.log(v);//输出:射手、法师、打野、上单、辅助
- }
- //添加新元素
- console.log(wangzhe.add("野怪"));//输出:Set(6) {'射手', '法师', '打野', '上单', '辅助', '野怪'}
- //删除元素
- console.log(wangzhe.delete("野怪"));//输出:true
- //检测是否存在某个值
- console.log(wangzhe.has("野怪"));//输出:false
- //清空集合
- console.log(wangzhe.clear());//输出:undefined
-
- //set 集合的去重、并、交、差集合
- let arr1 = ["北京", "上海", "广州", "深圳", "上海"];
- //数组去重
- let repeat = [...new Set(arr1)];
- console.log("repeat=" + repeat);//输出:repeat=北京,上海,广州,深圳
-
- //交集
- let arr2 = ["广州", "深圳", "武汉"];
- let intersection = [...new Set(arr1)].filter(item => new Set(arr2).has(item));
- console.log("intersection=" + intersection);//输出:intersection=广州,深圳
-
- //并集
- let union = [...new Set([...arr1, ...arr2])];
- console.log("union=" + union);//输出:union=北京,上海,广州,深圳,武汉
-
- //差集
- let diff = [...new Set(arr1)].filter(item => !(new Set(arr2).has(item)));
- console.log("diff=" + diff);//输出:diff=北京,上海
-
-
-
- //声明一个 map
- let map = new Map();
- //添加元素
- map.set("name", "马云");
- map.set("word", function () {
- console.log("让天下没有难做的生意!");
- });
-
- let school = {
- name: "浙江师范大学"
- };
- map.set(school, ["北京大学", "清华大学"]);
-
- //map集合数据长度
- console.log("map.size=" + map.size);//输出:map.size=3
- //删除
- console.log(map.delete("name"));//输出:true
- //获取map数据
- console.log("word=" + map.get("word"));//输出:word=function () {console.log("让天下没有难做的生意!");}
- console.log("school=" + map.get("school"));//输出:school=undefined
-
- //遍历
- for (let m of map) {
- console.log(m);
- }
- /*
- 输出:
- ['word', ƒ]
- [{…}, Array(2)]
- */
-
- //清空 map
- console.log(map.clear());//输出:undefined
-
-
- class Phone {
- //构造方法
- constructor(brand, price) {
- this.brand = brand;
- this.price = price;
- }
- //方法必须使用该语法,不能使用 ES5 的对象完整形式
- call() {
- console.log("我是一部手机");
- }
- }
-
- let Huawei = new Phone("华为折叠手机", 8999);
- console.log(Huawei);//输出:Phone {brand: '华为折叠手机', price: 8999}
-
- //class 的 get、set
- class Game {
- get name() {
- console.log("游戏的名字属性被读取了");
- return "王者荣耀";
- }
-
- set name(newName) {
- console.log("游戏的名字属性被修改了");
- }
- }
-
- //实例化对象
- let play = new Game();
- console.log(play.name);//输出:游戏的名字属性被读取了、 王者荣耀
- play.name = "打野";//游戏的名字属性被修改了
-
- //类的静态成员
- class University {
- static name = "清华大学";
- static word() {
- console.log("自强不息,厚德载物");
- }
- student() {
- console.log("好好学习,天天向上");
- }
- }
- let Tom = new University();
- console.log("Tom.name=" + Tom.name);//输出:Tom.name=undefined
- console.log("Tom.word=" + Tom.word);//输出:Tom.word=undefined
- console.log("Tom.student=" + Tom.student);//输出:Tom.student=student() {console.log("好好学习,天天向上");}
- console.log("University.name=" + University.name);//输出:University.name=清华大学
- console.log("University.word=" + University.word);//输出:University.word=word() {console.log("自强不息,厚德载物");}
- //结论:类的静态成员只能被该类访问
-
- //类的继承
- class Person {
- constructor(age, sex) {
- this.age = age;
- this.sex = sex;
- }
- //父类的成员属性
- call() {
- console.log("我的人类共有的特征");
- }
- }
-
- //子类继承
- class OtherPeople extends Person {
- constructor(age, sex, name) {
- super(age, sex);
- this.name = name;
- }
- //唱歌
- sing() {
- console.log("我会唱歌");
- }
- codding() {
- console.log("我会编程");
- }
- }
- const XiaoMing = new OtherPeople(18, "男", "我叫小明");
- XiaoMing.call();//输出:我的人类共有的特征
- XiaoMing.sing();//输出:我会唱歌
- XiaoMing.codding();//输出:我会编程
-
-
-
- //1、Number.EPSILON 是 JavaScript 表示的最小精度
- //EPSILON 属性的值接近于 2.2204460492503130808472633361816E-16
- function equal(a, b) {
- if (Math.abs(a, b) < Number.EPSILON) {
- return true;
- } else {
- return false;
- }
- }
- console.log(1 + 2 == 3);//输出:true
- console.log(1 + 2 === 3);//输出:true
- console.log(0.1 + 0.2 == 0.3);//输出:false
- console.log(0.1 + 0.2 === 0.3);//输出:false
- console.log(equal(0.1 + 0.2, 0.3));//输出:false
-
- //2、Number.isFinite 检测一个数值是否为有限数
- console.log("-------------------------------------");
- console.log(Number.isFinite(100));//输出:true
- console.log(Number.isFinite(100 / 0));//输出:false
- console.log(Number.isFinite(Infinity));//输出:false
-
- //3. Number.isNaN 检测一个数值是否为 NaN
- console.log("-------------------------------------");
- console.log(Number.isNaN(123));//输出:false
- console.log(Number.isNaN(NaN));//输出:true
-
- //4. Number.parseInt Number.parseFloat字符串转整数
- console.log("-------------------------------------");
- console.log(Number.parseInt('123砍三刀'));//输出:123
- console.log(Number.parseFloat('3.1415926圆周率'));//输出:3.1415926
-
- //5. Number.isInteger 判断一个数是否为整数
- console.log("-------------------------------------");
- console.log(Number.isInteger(666));//输出:true
- console.log(Number.isInteger(8.88));//输出:false
- console.log(Number.isInteger("一刀999"));//输出:false
-
- //6. Math.trunc 将数字的小数部分抹掉
- console.log("-------------------------------------");
- console.log(Math.trunc(1.25));//输出:1
-
- //7. Math.sign 判断一个数到底为正数 负数 还是零
- console.log("-------------------------------------");
- console.log(Math.sign(0));//输出:0
- console.log(Math.sign(12306));//输出:1
- console.log(Math.sign(-2.98));//输出:-1
-
-
-
- //1. Object.is 判断两个值是否完全相等
- console.log(Object.is(666, 666));//输出:true
- console.log(Object.is(NaN, NaN));//输出:true
- console.log(NaN === NaN);//输出:false
-
- //2. Object.assign 对象的合并
- const dbConfigDev = {
- host: 'http://127.0.0.1',
- port: 3306,
- name: 'dev',
- pass: 'dev',
- dbName: 'dev数据库',
- remark: "这是备注,开发环境数据库"
- };
- const dbConfigTest = {
- host: 'http://127.0.0.2',
- port: 8848,
- name: 'test',
- pass: 'test',
- dbName: 'test数据库',
- info: "请开启防火墙"
- }
- console.log(Object.assign(dbConfigDev, dbConfigTest));
- //输出:{host: 'http://127.0.0.2', port: 8848, name: 'test', pass: 'test', dbName: 'test数据库', info: "请开启防火墙",remark: "这是备注,开发环境数据库"}
-
- //3. Object.setPrototypeOf 设置原型对象 Object.getPrototypeof
- const school = {
- name: '清华大学'
- }
- const cities = {
- xiaoqu: ['北京', '上海', '深圳']
- }
- Object.setPrototypeOf(school, cities);
- console.log(Object.getPrototypeOf(school));//输出:{xiaoqu: Array(3)}['北京', '上海', '深圳']
- console.log(school);//输出:{name: '清华大学'}
-
-
在 ES7 中引入指数运算符「**」,用来实现幂运算,功能与 Math.pow 结果相同
-
- // includes indexOf
- // const mingzhu = ['西游记','红楼梦','三国演义','水浒传'];
-
- //判断
- // console.log(mingzhu.includes('西游记'));
- // console.log(mingzhu.includes('金瓶梅'));
-
- // **
- console.log(2 ** 10);//
- console.log(Math.pow(2, 10));
-
-
async 和 await 两种语法结合可以让异步代码像同步代码一样
-
- //async 函数
- async function fn(){
- // 返回一个字符串
- // return '清华大学';
- // 返回的结果不是一个 Promise 类型的对象, 返回的结果就是成功 Promise 对象
- // return;
- //抛出错误, 返回的结果是一个失败的 Promise
- // throw new Error('出错啦!');
- //返回的结果如果是一个 Promise 对象
- return new Promise((resolve, reject)=>{
- resolve('成功的数据');
- // reject("失败的错误");
- });
- }
-
- const result = fn();
-
- //调用 then 方法
- result.then(value => {
- console.log(value);
- }, reason => {
- console.warn(reason);
- })
-
1. await 必须写在 async 函数中
2. await 右侧的表达式一般为 promise 对象
-
- //创建 promise 对象
- const p = new Promise((resolve, reject) => {
- // resolve("用户数据");
- reject("失败啦!");
- })
-
- // await 要放在 async 函数中.
- async function main() {
- try {
- let result = await p;
- //
- console.log(result);
- } catch (e) {
- console.log(e);
- }
- }
- //调用函数
- main();
-
-
- // 发送 AJAX 请求, 返回的结果是 Promise 对象
- function sendAJAX(url) {
- return new Promise((resolve, reject) => {
- //1. 创建对象
- const x = new XMLHttpRequest();
-
- //2. 初始化
- x.open('GET', url);
-
- //3. 发送
- x.send();
-
- //4. 事件绑定
- x.onreadystatechange = function () {
- if (x.readyState === 4) {
- if (x.status >= 200 && x.status < 300) {
- //成功啦
- resolve(x.response);
- }else{
- //如果失败
- reject(x.status);
- }
- }
- }
- })
- }
-
- //promise then 方法测试
- // sendAJAX("https://api.apiopen.top/getJoke").then(value=>{
- // console.log(value);
- // }, reason=>{})
-
- // async 与 await 测试 axios
- async function main(){
- //发送 AJAX 请求
- let result = await sendAJAX("https://api.apiopen.top/getJoke");
- //再次测试
- let tianqi = await sendAJAX('https://www.tianqiapi.com/api/?version=v1&city=%E5%8C%97%E4%BA%AC&appid=23941491&appsecret=TXoD5e8P')
-
- console.log(tianqi);
- }
-
- main();
-
-
-
- //声明对象
- const school = {
- name:"清华大学",
- cities:['北京','上海','深圳'],
- xueke: ['前端','Java','大数据','运维']
- };
-
- //获取对象所有的键
- // console.log(Object.keys(school));
- //获取对象所有的值
- // console.log(Object.values(school));
- //entries
- // console.log(Object.entries(school));
- //创建 Map
- // const m = new Map(Object.entries(school));
- // console.log(m.get('cities'));
-
- //对象属性的描述对象
- // console.log(Object.getOwnPropertyDescriptors(school));
-
- // const obj = Object.create(null, {
- // name: {
- // //设置值
- // value: '清华大学',
- // //属性特性
- // writable: true,
- // configurable: true,
- // enumerable: true
- // }
- // });
-
- function connect({host, port, ...user}) {
- console.log(host);
- console.log(port);
- console.log(user);
- }
- connect({
- host: '127.0.0.1',
- port: 3306,
- username: 'root',
- password: 'root',
- type: 'master'
- });
- let str = '百度';
- const reg = /(?
.*)<\/a>/ ; - const result = reg.exec(str);
- console.log(result.groups.url);
- console.log(result.groups.text);
- //声明字符串
- let str = 'JS5211314 你知道么 555 啦啦啦';
- //正向断言
- const reg = /\d+(?=啦)/;
- const result = reg.exec(str);
- //反向断言
- const reg = /(?<=么)\d+/;
- const result = reg.exec(str);
- console.log(result);
- let str = `
-
-
上映日期: 1994-09-10
-
-
-
上映日期: 1994-07-06
-
- `;
- //声明正则
- const reg = /
- .*?(.*?)<\/a>.*?
(.*?)<\/p>/g
s; - //执行匹配
- const result = reg.exec(str);
- let result;
- let data = [];
- while(result = reg.exec(str)){
- data.push({title: result[1], time: result[2]});
- }
- //输出结果
- console.log(data);
-
- //二维数组
- // const result = Object.fromEntries([
- // ['name','北京大学'],
- // ['xueke', 'Java,大数据,前端,云计算']
- // ]);
-
- //Map
- // const m = new Map();
- // m.set('name','BEIJING');
- // const result = Object.fromEntries(m);
-
- //Object.entries ES8
- const arr = Object.entries({
- name: "北京大学"
- })
- console.log(arr);
-
-
-
- //flat 平
- //将多维数组转化为低位数组
- // const arr = [1,2,3,4,[5,6]];
- // const arr = [1,2,3,4,[5,6,[7,8,9]]];
- //参数为深度 是一个数字
- // console.log(arr.flat(2));
-
- //flatMap
- const arr = [1,2,3,4];
- const result = arr.flatMap(item => [item * 10]);
- console.log(result);
-
-
- //创建 Symbol
- let s = Symbol('清华大学');
-
- console.log(s.description);
-
-
- let str = `
-
-
上映日期: 1994-09-10
-
-
-
上映日期: 1994-07-06
-
- `;
-
- //声明正则
- const reg = /
- .*?(.*?)<\/a>.*?
(.*?)<\/p>/
sg -
- //调用方法
- const result = str.matchAll(reg);
-
- // for(let v of result){
- // console.log(v);
- // }
-
- const arr = [...result];
-
- console.log(arr);
-
-
- class Person{
- //公有属性
- name;
- //私有属性
- #age;
- #weight;
- //构造方法
- constructor(name, age, weight){
- this.name = name;
- this.#age = age;
- this.#weight = weight;
- }
-
- intro(){
- console.log(this.name);
- console.log(this.#age);
- console.log(this.#weight);
- }
- }
-
- //实例化
- const girl = new Person('小梅', 18, '45kg');
-
- // console.log(girl.name);
- // console.log(girl.#age);
- // console.log(girl.#weight);
-
- girl.intro();
-
-
- //声明两个promise对象
- const p1 = new Promise((resolve, reject)=>{
- setTimeout(()=>{
- resolve('商品数据 - 1');
- },1000)
- });
-
- const p2 = new Promise((resolve, reject)=>{
- setTimeout(()=>{
- resolve('商品数据 - 2');
- // reject('出错啦!');
- },1000)
- });
-
- //调用 allsettled 方法
- // const result = Promise.allSettled([p1, p2]);
-
- // const res = Promise.all([p1, p2]);
-
- console.log(res);
-
-
-
- function main(config){
- // const dbHost = config && config.db && config.db.host;
- const dbHost = config?.db?.host;
-
- console.log(dbHost);
- }
-
- main({
- db: {
- host:'192.168.1.100',
- username: 'root'
- },
- cache: {
- host: '192.168.1.200',
- username:'admin'
- }
- })
-
- <button id="btn">点击button>
- <script src="./js/app.js" type="module">script>
-
- console.log(globalThis);
-