【ES6】

一、什么是ES6

  ES6(ECMAScript 6),简单来说就是JavaScripe的标准。不在赘述ES5和ES6区别,可以使用Babel将ES6转成ES5,提高可用性。

二、let和const命令

  1、let和const命令声明变量没有变量提升,也就是说这种代码是不能正常执行的。

<script>
console.log(a);
let a = 10;
</script>

  可以看到控制台打印ReferenceError

ReferenceError: Cannot access 'a' before initialization
    at ImportAndExportView.vue:4:13

  2、let和const命令是块级作用域,对于也就是说变量a只在if块中起作用。

<script>
if (1 == 1) {
  let a = 10;
}
console.log(a);
</script>

  可以看到控制台打印ReferenceError

main.js:14 ReferenceError: a is not defined

  3、let和const命令不能重复声明

image

   4、const和let的区别在于const声明常量,声明之后对于基本属性,值不变,对于对象,可以修改属性。

一般来说,const使用的最多,除非确定是个变量,就使用let。

三、模板字符串

  模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量   

<script>
// 自动识别多行数据
console.log(`string text line 1
string text line 2`);

// 字符串中嵌入表达式用$
let name = "Bob",
  time = "today";
console.log(`Hello ${name}, how are you ${time}?`);
</script>

四、解构赋值

  解构赋值是对赋值运算符的一种扩展,它针对数组和对象进行操作。

  1、对对象进行解构赋值

<script>
let cla = {
  type: "12",
  name: "name",
};

// //不使用解构赋值
// let type = cla.type;
// let name = cla.name;

//使用解构赋值
let { type, name } = cla;

console.log(type, name);

//不完全解构
let obj = {
  a: {
    name: "123",
  },
  b: [],
  c: "hello,world",
};
// let { a } = obj;

//省略变量
let { a, ...res } = obj;
console.log(res);

//使用默认值
let { x, b = 30 } = { x: 20 };
</script>

  2、对数组解构赋值

<script>
//对数组解构
let arr = [1, 2, 3];
// let [a, b] = arr;

//可嵌套
let [a, [b]] = [1, [2], 3];
console.log(a, b);
</script>

五、函数

  1、带参数默认值的函数

<script>
//1设置默认参数
function add(a = 10, b = 20) {
  return a + b;
}

console.log(add());
//30
console.log(add(20));
//40

//2设置默认参数为函数
function add2(a = 10, b = getVal(5)) {
  return a + b;
}
function getVal(val) {
  return val + 5;
}

console.log(add2());
//20

//3剩余参数
//必须放在函数形参最后边
let book = {
  title: "eeee",
  auth: "123",
};

let { log } = console;
log(pick(book, "title", "auth"));

function pick(obj, ...keys) {
  console.log(keys);
  let result = Object.create(null);
  for (let i = 0; i < keys.length; i++) {
    result[keys[i]] = obj[keys[i]];
  }
  return result;
}
</script>

六、扩展运算符、箭头函数

<script>
//扩展运算符
//剩余运算符允许把后续剩余参数合并到一个数组中

//扩展运算符
//把一个数组分割,并将各个项作为分离的参数
const arr = [10, 20, 30, 40, 50];
const { log } = console;
// log(Math.max(...arr));
// 50

//箭头函数
//使用=>定义函数  function(){} 等于 () => {}
// let add = (a, b) => {
//   return a + b;
// };

//有些括号可以省略
let add = (val) => val;
log(add(3));
</script>

  关于箭头函数的this指向问题:

  this 永远指向 调用 包含 自己(this本身) 的 函数 对应的对象。举个例子

<script>
function test() {
  var a = 1;
  console.log(this.a);
}

test();
</script>

  函数在最外层直接运行,调用test函数的地方是 window。因为外部window没有变量a,所以会报以下错误:

TypeError: Cannot read properties of undefined (reading 'a')

  再看一个例子

var name = 'China';
var obj = {
    name : 'America',
    show : function() {
        console.log(this.name)
    }
}

obj.show(); // America

  调用函数的是obj对象,所以this指向obj对象,obj对象中有属性‘name’,所以控制台打印America。

  再看一则例子:

var name = 'China';
var obj = {
    name : 'America',
    show : function() {
        return function(){
            console.log(this.name);
        }
    }
}

var a = obj.show();
a(); // China

  当a调用show方法时,a变量变成匿名函数。当调用a方法时,this指向window,那么window中的name值'China',就被打印出来。

  那么箭头函数解决了关于this的什么问题呢?

<script>
let PageHandle = {
  id: 123,
  init: function () {
    document.addEventListener("click", function (event) {
      // this.doSomeThings is not a function
      //   console.log(this);
      this.doSomeThings(event.type);
    });
  },
  doSomeThings: function (type) {
    console.log(`事件类型:${type},当前id:${this.id}`);
  },
};

PageHandle.init();
</script>

  这段代码在点击页面时,会给出

Uncaught TypeError: this.doSomeThings is not a function
    at HTMLDocument.

  这是因为调用this方法的类并非PageHandle,而是document。如果使用箭头函数,就可以消解这个问题

<script>
let PageHandle = {
  id: 123,
  init: function () {
    document.addEventListener("click", (event) => {
      // this.doSomeThings is not a function
      //   console.log(this);
      this.doSomeThings(event.type);
    });
  },
  doSomeThings: function (type) {
    console.log(`事件类型:${type},当前id:${this.id}`);
  },
};

PageHandle.init();
</script>

  这是因为箭头函数没有this指向,它会捕获外部对象,所以this指向PageHandle。

七、迭代器Intertator用法

  迭代器,又叫遍历器,作用是遍历不同数据结构,通常和生成器组合使用。

<script>
const items = ["one", "two", "three"];

//创建新的迭代器
const it = items[Symbol.iterator]();
console.log(it.next()); //{"value": "one","done": false} done 为false表示遍历继续,done为true表示遍历完成
console.log(it.next());
console.log(it.next());
console.log(it.next()); // done 变为 true
</script>

  关于迭代器,在ES6中有语法糖for...of

 

posted @ 2025-11-04 17:02  意外路过的番茄酱骑士  阅读(9)  评论(0)    收藏  举报