一、“…”的作用

  • 拓展运算符(多用在解构赋值中)
  • 展开运算符(多用在传递实参中)
  • 剩余运算符(多用在接收实参中)
  1. // 解构赋值
  2. let [n, ...m] = [12, 23, 34];
  3. // n:12
  4. // m:[23, 34]
  5. // 传递实参
  6. let ary = [12, 23, 13, 24, 10, 25];
  7. let min = Math.min(...ary);
  8. // 数组克隆(浅克隆)
  9. let cloneAry = [...ary];
  10. // 对象克隆(浅克隆)
  11. let obj = {name:'园园', age:16};
  12. let cloneObj={...obj, sex:'girl', age:17};
  13. // 接收实参
  14. let fn=(n, ...arg) => {
  15. // n:10
  16. // arg:[20,30]
  17. };
  18. fn(10, 20, 30);

二、class 创建类

  1. // 传统 ES3 / ES5 中创建类的方法
  2. function Fn(){
  3. this.x = 100;
  4. };
  5. Fn.prototype.getX = function(){
  6. console.log(this.x);
  7. };
  8. var f1 = new Fn();
  9. f1.getX();
  10. // 也可以把它当做普通函数执行
  11. Fn();
  12. // 还可以把Fn当做普通的对象设置键值对
  13. Fn.queryX = function(){};
  14. Fn.queryX();
  1. // ES6 中类的创建
  2. class Fn{
  3. // 等价于之间的构造函数体
  4. constructor(n, m){
  5. this.x = 100;
  6. }
  7. // 给实例设置的私有属性
  8. y=200
  9. // 直接写的方法就是加在原型上的 === Fn.prototype.getX...
  10. getX () {
  11. console.log(this.x);
  12. }
  13. // 前面设置 static 的:把当前 Fn 当做普通对象设置的键值对
  14. static queryX () {}
  15. static z = 300
  16. }
  17. // 也可以在外面单独这样写
  18. Fn.prototype.y = 200;
  19. Fn.z = 300;
  20. let f = new Fn(10, 20);
  21. f.getX();
  22. Fn.queryX();
  23. Fn(); // Uncaught TypeError: Class constructor Fn cannot be invoked without 'new' =>
  24. // class 创建的类只能 new 执行,不能当做普通函数执行

三、ES6中的模板字符串

  1. let year = '2019',
  2. month = '08',
  3. day = '09';
  4. // "你好,小伙伴!今天是2019年08月09日,今天天气很糟糕,马上就要下大雨了,呵呵呵~~~"
  5. let res = "你好,小伙伴!今天是" + year + "年" + month + "月" + day + "日,今天天气很糟糕,马上
  6. 就要下大雨了,呵呵呵~~~";
  7. let ID = "box";
  8. let html = '<ul class="list clear" id="'+ID+'">';
  9. // 我们真实项目中会大量进行字符串拼接操作(尤其是需要动态绑定数据:把现有的 HTML 代码拼接成有数据的 HTML 字符串),传统的 ES3 语法模式下字符串拼接是一个非常苦逼的任务 ┭┮﹏┭┮
  1. let year = '2019',
  2. month = '08',
  3. day = '09';
  4. // 反引号(撇) TAB 键上面的 (ES6 模板字符串语法)
  5. // ${} 模板字符串中书写 JS 表达式的方式(凡是有输出结果的都可以被称为JS表达式,一般都是一行搞定的)
  6. let res = `你好,小伙伴!今天是${year}年${month}月${day}日,今天天气很糟糕,马上就要下大雨了,呵呵
  7. 呵~~~`;
  8. let ID = "box";
  9. let HTML = `<ul class="list clear" id="${ID}">
  10. <li><a href="javascript:;">
  11. <img src="img/1.jpg" alt="">
  12. <p></p>
  13. <span>¥3899</span>
  14. </a></li>
  15. </ul>`;
  16. // 传统方式拼接一套 HTML 字符串,还需要一行行的处理,非常麻烦

四、THIS 和面向对象的深入理解

  1. function sum(){
  2. // ARGUMENTS:内置的实参集合(箭头函数中没有),不是数组是类数组(它不是数组的实例,不能直接使用数组的方法 arguments.__proto__===Object.prototype)
  3. let total = null;
  4. for(let i = 0;i < arguments.length; i++){
  5. total += arguments[i];
  6. }
  7. return total;
  8. }
  9. let total = sum(10, 20, 30, 40);
  1. // ARG:存储传递的实参信息(数组)
  2. // eval:把字符串转换为 JS 表达式执行
  3. let sum = (...arg => eval(arg.join('+'));
  4. let total = sum(10, 20, 30, 40);

如果 ARGUMENTS 是一个数组就好了~~~

  1. ~function () {
  2. function slice (n) {
  3. // n:0 把数组克隆一份新的出来
  4. let newAry = [];
  5. for(let i = 0; i < this.length; i++){
  6. newAry.push(this[i]);
  7. }
  8. return newAry;
  9. }
  10. Array.prototype.slice = slice;
  11. }();
  12. let ary = [10, 20, 30, 40];
  13. let newAry = ary.slice(0); // 数组克隆
  14. //--------------------------
  15. function sum () {
  16. // 把 ARGUMENTS 转换为数组:借用数组原型上的 SLICE 方法,只要让 SLICE 中的 THIS 指向 ARGUMENTS,就相当于把 ARGUMENTS 转换为新数组
  17. // let arg = Array.prototype.slice.call(arguments,0);
  18. let arg = [].slice.call(arguments, 0);
  19. // 数组求和
  20. return eval(arg.join('+'));
  21. }
  22. let total = sum(10, 20, 30, 40);

不仅仅是一个方法可以这样调用,很多数组的方法,类数组都能用~~

  1. function sum () {
  2. let total = null;
  3. [].forEach.call(arguments,item => {
  4. total += item;
  5. });
  6. return total;
  7. }
  8. let total = sum(10, 20, 30, 40);

五、UI 组件库

有结构、样式、功能的库,里面提供很多开发中常用的组件,开发中直接把组件调取过来使用即可,无需从头开发(可能需要二次开发)

六、JSON 格式的数据

我们基于 AJAX 等其它方式从服务器获取的数据结果一般都是:JSON 格式或者 XML 格式

  • JSON 格式的字符串
  • JSON 格式的对象
  1. // 普通对象
  2. let obj = {
  3. name:"珠峰"
  4. };
  5. // JSON 格式对象(其实就是把属性名用双引号包起来)
  6. obj = {
  7. "name":"珠峰"
  8. };
  9. // JSON格式的字符串
  10. let str = '{"name":"珠峰"}';

把 JSON 格式的字符串转换为对象:window.JSON.parse

  1. let str = '{"name":"珠峰"}';
  2. let obj = JSON.parse(str);
  3. // { name:"珠峰" }
  4. // 在IE 低版本浏览器中,全局对象 window中没有 JSON 这个对象,也就没有所谓的 parse 等方法了
  5. obj = eval('('+str+')'); // 基于 eval 可以实现,但是为了保证转换格式正确,我们需要把字符串用小括号包起来转换

把对象转换为JSON格式字符串:JSON.stringify

  1. let obj = {
  2. name:"珠峰"
  3. };
  4. let str = JSON.stringify(obj); // '{"name":"珠峰"}'

七、关于 SORT 排序的

  1. // 把数组中的每一项按照 AGE 进行升序排列
  2. // ORT中传递一个函数,函数中有 A / B
  3. // A当前项的后一项
  4. // B当前项
  5. // 果当前函数返回的是一个小于零的值,让 A 和 B 的位置互换,如果返回的是大于等于零的值,位置保持不变
  6. let ary = [{
  7. id: 1,
  8. age: 25,
  9. name: '张三'
  10. }, {
  11. id: 2,
  12. age: 32,
  13. name: '李四'
  14. }, {
  15. id: 3,
  16. age: 23,
  17. name: '张五'
  18. }];
  19. // 按照 NAME 排序 : localeCompare 能够进行字符串比较
  20. /* ary.sort((a, b) => {
  21. return a.name.localeCompare(b.name);
  22. }); */
  23. // 按照 AGE 升序和降序
  24. /* ary.sort((a, b) => {
  25. return a.age - b.age;
  26. });
  27. ary.sort((a, b) => {
  28. return (a.age - b.age) * -1;
  29. }); */
  30. console.log(ary);