一、解构赋值

解构赋值语法是一个js表达式,这使得可以将值从数组或属性从对象提取到不同的变量中

1、数组的解构赋值

  1. const arr = [1,2,3,4,5]
  2. let [a,b,c,d,e] = arr
  3. //1、更复杂的匹配规则
  4. const arr = ['a', 'b', ['c', 'd', ['e', 'f', 'g'] ] ]
  5. const [ , b ] = arr //b = 'b'
  6. const [ , , g ] = ['e', 'f', 'g'] //g = 'g'
  7. const [ , , g ] = ['c', 'd', ['e', 'f', 'g'] ] //g = ['e', 'f', 'g']
  8. const [ , , [ , , [ , , g ] ] ] = arr //g = 'g'
  9. //2、扩展运算符 ...
  10. const arr1 = [1, 2, 3]
  11. const arr2 = ['a', 'b']
  12. const arr3 = ['zz', 1]
  13. const arr4 = [...arr1, ...arr2, ...arr3] //arr4 = [7]> [ 1, 2, 3, 'a', 'b', 'zz', 1]
  14. const arr = [1, 2, 3, 4, 5, 6]
  15. const [a, b, ...c] = arr //c = [ 1, 2, 3, 'a', 'b', 'zz', 1]
  16. //3、默认值
  17. const arr = [1, undefined, null];
  18. const [a, b, c, ,d] = arr //a = 1, b = undefined, c = null, d = undefined
  19. const [a, b = 123, c = 3, d] = arr //a = 1, b = 2, c = null, d = undefined
  20. PS:只有当undefined才会取默认值,null是不行的
  21. //4、交换变量
  22. [a, b] = [b , a]
  23. //5、接收多个 函数返回值
  24. function getUserInfo(id){
  25. // ...get请求
  26. return [
  27. true,
  28. {
  29. name: '小明',
  30. gender: '女',
  31. id: id
  32. },
  33. '请求成功'
  34. ]
  35. }
  36. const [status, data, msg] = getUserInfo(123)
  37. //output=> status = true, data = { name: '小明', gender: '女', id: id }, msg = '请求成功'

2、对象的解构赋值

  1. //等号左右两边都为对象结构 - const{ a, b } = {a:1, b:2 } 左边的{}中为需要赋值的变量,右边为需要解构的对象;
  2. //1、对象结构赋值的用法
  3. const obj = {
  4. saber: '阿尔',
  5. archer: '卫宫',
  6. };
  7. const { saber, archer} = obj //output: saber="阿尔",archer="卫宫" 注意:属性名称要一致,否则拿不到值;
  8. //2、稍微复杂的解构条件
  9. const player = {
  10. nickname: '感情的戏',
  11. skill: [{
  12. skillName: '龙吟',
  13. mp: '100',
  14. time: 3000,
  15. },{
  16. skillName: '龙腾',
  17. mp: '400',
  18. time: 20000,
  19. }]
  20. };
  21. const { nickname } = player //output: nickname="感情的戏"
  22. const { skill } = player //output: skill=[{skillName: '龙吟',mp: '100',time: 3000,},{skillName: '龙腾',mp: '400',time: 20000,}]
  23. const {skill: [ skill1, { skillName } ] } = player; //output: skillName="龙吟"
  24. //3、扩展运算符
  25. const obj = {
  26. saber: '阿尔',
  27. archer: '卫宫',
  28. lancher '呼呼呼',
  29. };
  30. const { saber, ...oth } = obj //output:saber="阿尔", oth="{archer:"卫宫"},{lancher:"呼呼呼"}"
  31. //4、如何对已经申明的变量进行对象的解构赋值
  32. let age;
  33. const obj = {
  34. name: '阿尔',
  35. age: 22,
  36. };
  37. ({ age } = obj ); //output:age = 22
  38. //5、默认值
  39. const obj = {
  40. name: 'name',
  41. age: undefined,
  42. };
  43. const { name, age = 24, hobby = ['学习'] } = obj //output: age = 24
  44. //6、提取对象
  45. const { name, hobby:[hobby1], hobby } = {
  46. name: '小红',
  47. hobby: ['学习'],
  48. }; //output: name = "小红", hobby1="学习", hobby=["学习"]
  49. //7、使用对象传入乱序的函数参数
  50. function AJAX({
  51. url,
  52. data,
  53. type='get'}) {
  54. console.log(type);
  55. };
  56. AJAX({
  57. url: '/getinfo',
  58. data: {
  59. a: 1,
  60. b: 2,
  61. }
  62. });
  63. //8、获取多个 函数返回值
  64. function getUserInfo(){
  65. //...ajax
  66. return {
  67. status: true,
  68. data: {
  69. name: '小明',
  70. gender: '女',
  71. id: id
  72. },
  73. msg: '请求成功'
  74. };
  75. };
  76. const { status, data, msg: message } = getUserInfo(123);
  77. //9、动态插入属性名和属性值:
  78. for (var i = 1; i < 3; i++) {
  79. var app['app' + i] = {
  80. text: window.appInfo[i].appName,
  81. imageUrl: '/src/assets/images/chihoi/workbench/test.png',
  82. ...createAction('custom:App', '已选APP', 'app', window.appInfo[i].appName, window.appInfo[i].id),
  83. };
  84. }
  85. console.log(app)
  86. //output: 见下图

image.png

3、字符串的解构赋值

  1. //1、解构赋值
  2. const str = 'I am fy';
  3. const [ a, b, c, ...oth ] = str; // a="I",b=" ",c="a",oth=['m',' ','f','y']
  4. const [ ...spStr1 ] = str
  5. const spStr2 = str.split('');
  6. const spStr3 = [ ...str ]; //output: spStr1=spStr2=spStr3=[7>]['....']
  7. //2、提取属性
  8. const { length, split } = str

二、ES6扩展

1、字符串扩展

(1)模板字符串

  1. 符号:``
  2. const xiaoming = {
  3. name: 小明',
  4. age : 13,
  5. say1: function(){
  6. console.log('我叫' + this.name + ', 今年' + this.age + '岁');
  7. }
  8. say2 function(){
  9. console.log(`我叫 ${this.name}, 我今年 ${this.age}岁`);
  10. }
  11. }
  12. xiaoming.sya1();
  13. xiaoming.say2(); //我叫小明,我今年13岁

(2)部分新的方法

  1. // 1.padStart--从头部补充字符串 padEnd--从尾部补充字符串
  2. let str = 'i';
  3. let str1 = str.padStart(6, 'mooc');
  4. console.log(str1); // str1 = moocmi
  5. let str2 = str.padEnd(5, 'mooc');
  6. console.log(str2); // str2 = imooc
  7. // 2.repeat--相当于复制粘贴(不能写负数,小数的话回自动取整)
  8. console.log('i', repeat(10) ); // iiiiiiiiii
  9. function repeat(str, num){
  10. return new Array(num + 1).join(str);
  11. }
  12. console.log(repeat('s', 5) ); // sssss
  13. // 3.startsWith--判断字符串以什么开头 endsWith--判断字符串以什么结尾(输出为布尔值)
  14. const str = 'A process'
  15. console.log(str.startsWith('B')); //false
  16. console.log(str.endsWith('cess')); //true
  17. // 4.includes
  18. const str = 'A process'
  19. if(str.indexOf('process') !== -1){
  20. console.log(" 存在 "); //存在
  21. }
  22. if(str.includes('process')){
  23. console.log(" 存在 "); //存在
  24. }

(3)新的Unicode表示法和遍历方式

  1. // 1. 转成数组遍历循环字符串
  2. let str = 'PROMISE';
  3. var oStr = Array.prototype.slice.call(str);
  4. console.log(oStr); //[7>]['P','R','O','M','I','S','E']
  5. // 2.扩展运算符实现
  6. var oStr = [...str]; //[7>]['P','R','O','M','I','S','E']
  7. //需求:有时候需要对字符串加密解密
  8. var oStr = 'BD';
  9. const map = {A: '100', B: '99', C: '98', D: '97', E: '96'};
  10. const words = 'ABCDE';
  11. oStr.forEach(function(word, index){
  12. if(words.includes(word))
  13. oStr[index] = map[word];
  14. });
  15. console.log(oStr.join('')); // join方法是用来连接字符串,output:9997
  16. // 3.for-of遍历字符串实现对字符串加密解密
  17. let newStr = '';
  18. for(let word of oStr){
  19. if(words.includes(word))
  20. newStr += map[word];
  21. }
  22. console.log(newStr); // output:9997
  23. // Unicode是一项标准 包括字符集、编码方案等,为了解决传统的字符编码方案的局限二产生的,为每个语言
  24. 中的每个字符设定了统一并且唯一的二进制编码。
  25. '\u{1f436}' //ES6 提供 \u{} 来支持Unicode编码 output:"🐶"
  26. // codePointAt() 获取字符串中对应字符的一个码点;
  27. "🐶".codePointAt(0);

三、扩展

1、正则扩展

  1. const regexp1 = /^a/g; //g代表全局意思,全局匹配开头为 a 的字符串
  2. const regexp2 = new RegExp('^a', 'g');
  3. const regexp3 = new RegExp(/^a/g); //全局匹配 a 的字符串
  4. console.log('aaabbccdd'.match(regexp1)); // ['a'];
  5. console.log('aaabbccdd'.match(regexp3)); // ['a', 'a', 'a'];
  6. // u(unicode)修饰符作用将两个字符当作一个字符
  7. console.log(/^\ud83d/u.test('\ud83d\udc36')); // false;
  8. // y 粘连修饰符
  9. const r1 = /imooc/g;
  10. const r2 = /imooc/y;
  11. const str = 'imoocimooc-imooc';
  12. console.log(r1.exec(str)); // ['imooc', 'imooc', 'imooc']
  13. console.log(r2.exec(str)); // ['imooc', 'imooc']

2、数值扩展

(1)新的进制表示法

  1. //八进制以 0o(0O)开头
  2. //二进制以 0b(0B)开头

(2)新的方法与安全数

  1. //Number.parseInt() 转换整数; Number.parseFloat()
  2. //Number.isNaN() 判断是不是NaN
  3. //Number.isFinite() 判断是不是有限的
  4. //Number.MAX_SAFE_INTEGER() 判断是不是安全数,范围 (2^53) -1 ~ (- 2^53) + 1
  5. //Number.MIN_SAFE_INTEGER()
  6. //Number.isSafeInteger()
  7. //幂运算(默认右边开始计算)
  8. let a = (2 ** 10) ** 0;
  9. console.log( a ) = 1024

3、函数扩展之默认参数

(1)默认参数

  1. function add(a, b=999){
  2. //如果不给b传值,默认为999
  3. }

(2)与扩展运算符的结合(剩余参数…)

  1. function sun(){
  2. let args = Array.prototype.slice.call(argu); // 转换成数组
  3. //等价于 let args = [...agru]
  4. console.log(argu);
  5. }
  6. sum(1,2,3,'345');
  7. function op(type, ...nums){
  8. console.log(type); // type = 'sum'
  9. console.log(nums); // nums = [1, 2, 3, 4, 5]
  10. }
  11. op('sun', 1, 2, 3, 4, 5);

(3)箭头函数(=>)

  1. const add1 = (a, b) => a + b;
  2. //等价于 :
  3. const add2 = function(a, b){
  4. return a + b;
  5. }
  6. //函数不返回值
  7. const pop = arr => void arr.pop();
  8. console.log(pop([1, 2, 3])); // arr = undefine
  9. //与普通函数的区别:箭头函数没有arguments参数,需要使用扩展运算符...args
  10. const log = () => {
  11. console.log(arguments);
  12. };
  13. log(1, 2, 3); // 控制台报错。修改为:const log = (...args) =>
  14. //箭头函数没有自己的this
  15. const xiaoming = {
  16. name: '小明',
  17. say1: function(){
  18. console.log(this);
  19. },
  20. say2: () => {
  21. console.log(this);
  22. },
  23. }
  24. xiaoming.say1();
  25. xiaoming.say2(); //结果见下图;

image.png

4、对象扩展

(1)简洁表示法

  1. //老式写法
  2. const getUserInfo = (id = 1) =>{
  3. const name = 'xiaoming';
  4. age = age;
  5. return {
  6. name: name,
  7. age: age,
  8. say: function(){
  9. console.log(this.name + this.age);
  10. }
  11. }
  12. }
  13. const xiaoming = getUserInfo();
  14. //ES6写法
  15. const getUserInfo = (id = 1) =>{
  16. const name = 'xiaoming';
  17. age = age;
  18. return {
  19. name, //会自动去找同名变量
  20. age,
  21. say(){
  22. console.log(this.name + this.age);
  23. }
  24. }
  25. }
  26. const xiaoming = getUserInfo();
  27. // 属性名表达式
  28. const obj = {
  29. a: 1,
  30. $abc: 2,
  31. 'uiasfuafyhahfio': 3,
  32. }
  33. // 可以通过obj.a拿到a的值
  34. // 但是乱码的就不能通过这种形式拿到对应的值,需要通过obj['属性名']的方式取到值

(2)扩展运算符

  1. // 复制对象-- 浅拷贝(拷贝后对象值改变也会修改被拷贝的对象)
  2. const obj = {
  3. a: 1,
  4. b: 2,
  5. d:{ a: 3 },
  6. }
  7. const cobj = { ...obj } // 这样可以完成对象的复制
  8. cobj.d.a = 999; // 此时obj和cobj的 d.a 的值都会被修改为999
  9. // 合并对象(也是浅拷贝)-- 同名属性时取后一个为最终结果(与合并写的顺序有关)
  10. const obj1 = {
  11. a: 1,
  12. b: 2,
  13. }
  14. const obj2 = {
  15. a: 9,
  16. c: 3,
  17. }
  18. const newObj = { ...obj1, ...obj2 } // 此刻输出{ a=9,b=2,c=3 }
  19. // 部分新的方法和属性
  20. // Object.is()-- 浅拷贝
  21. console.log(Object.is(+0, -0)) // false
  22. console.log(+0 === -0) // true
  23. console.log(Object.is(NaN, NaN)) // true
  24. console.log(NaN === NaN) // false
  25. // Object.assign
  26. const o = Object.assign({a: 1}, {b: 2}) // o就是合并后的结果;
  27. // Object.keys-- 返回数组, 返回自身对应的key
  28. // Object.values-- 返回数组, 返回自身对应的value
  29. // Object.entries-- 返回数组, 每个数组包括key和value
  30. 效果如下:
  31. console.log(Object.keys(obj1));
  32. console.log(Object.values(obj1));
  33. console.log(Object.entries(obj1));

image.png

  1. // Object.setPrototypeOf 设置对象的原型
  2. // Object.getPrototypeOf 获取对象的原型
  3. // super 一个关键字,可以拿到原型对象
  4. const obj = { name: 'xiaoming' };
  5. const cObj = {
  6. say() {
  7. console.log(`My name is ${super.name}`)
  8. }
  9. }
  10. Object.setPrototypeOf(cObj, obj); // 将cObj以obj为原型设置
  11. cObj.say();
  12. // 结果见下:

image.png

5、数组扩展

(1)结合扩展运算符使用

  1. function foo (a, b, c) {
  2. console.log(a);
  3. console.log(b);
  4. console.log(c);
  5. }
  6. foo(...[1, 2, 3]);
  7. // apply的使用
  8. const arr = [1, 255, 5];
  9. console.log(Math.max(...arr));
  10. console.log(Math.max.apply(null, arr)); // 输出结果一致,都是255
  11. // 生成器函数-- 生成迭代器函数
  12. function *g() {
  13. console.log(1);
  14. yield 'hi~';
  15. console.log(2);
  16. yield 'lethe';
  17. }
  18. const arr = [...g()]; // arr = ['hi~', 'lethe'] ;
  19. // new Set() -- 可以实现数组去重
  20. let set = new Set([1, 2, 2, 3]);
  21. console.log(set); // { 1, 2, 3 }

(2)数组新的方法

  1. // Array.from-- 把类数组(ArrayLike)或者Iterable对象转换成数组形式
  2. const obj1 = {
  3. 0: 1,
  4. 1: 'jj',
  5. 2: false,
  6. length: 3
  7. };
  8. console.log(Array.from(obj, item => item*2)); // 输出 [2, 44]
  9. // Array.of-- 连接为数组
  10. console.log(Array.of(1, 2, 3); // 输出 [1, 2, 3]
  11. // Array#fill-- 用来填充数组值,会覆盖数组原有的值
  12. const arr = new Array(10).fill(0) // 创建一个长度为10并填充为0数组
  13. // Array.includes()-- 用来箭簇数组中包含什么指定的值,成功true,失败false
  14. // Array.find()-- 根据条件(回调)按顺序遍历数组,当回调返回true时,返回的当前遍历到的值
  15. const arr = [1, 2, 3]
  16. const res = arr.find((value, index, arr) => value % 2 === 0 ); // 输出6
  17. // Array.findIndex()-- 根据条件(回调)按顺序遍历数组,当回调返回true时,返回的当前遍历到的下标
  18. const res = arr.findIndex((value, index, arr) => value % 2 === 0 ); // 输出1
  19. // Array.keys-- 返回数组, 需要通过for-of遍历返回自身对应的key(下标)
  20. // Array.values-- 返回数组, 需要通过for-of遍历返回自身对应的value
  21. // Array.entries-- 返回数组, 需要通过for-of遍历每个数组包括key和value
  22. const arr = [1, 2, 3]
  23. console.log(arr.keys());
  24. console.log(arr.values());
  25. console.log(arr.entries());

四、Promise

1、回调与promise