ES6新增内容1

108 阅读6分钟

写在前面:这一篇主要讲ES6新增的一部分内容,也包含移动this指向、对象的简写语法的一些问题;有问题欢迎各位提出。

this指向

每一个函数内部都有一个关键字 this ,this的值只和函数调用有关,和函数的书写无关。

1,一个普通的全局函数,在正常调用下,this指向为 window;

function fn() {
    console.log(this) ;
}
fn( );  //this指向window

2,将函数放置到对象中,通过对象语法去获取调用,那么this 指向该对象;

var obj = {
    a: 1,
    b: '我是对象obj的属性B',
    c: fn
}
obj.c() ;  //this指向调用的对象 obj

3,将函数作为事件处理函数,触发时内部的this指向 事件源;

 var box = document.getElementById('box')
 box.onclick = fn ;//this指向事件源 div

4,将函数作为定时器执行时的函数,触发时内部this指向全局对象window;

setTimeout(fn, 0)   // this 指向 window
setInterval(fn, 1000)   // this 指向 window
改变this指向方法

准备一个对象,一个函数;

var obj = {
    a: 1,
    b: 2,
    c: '我是对象obj的属性c'
}
​
function fn(x, y) {
    console.log(this, x, y);
}
fn(100, 200);

1,call( ); 函数.call(this指向谁,参数1,参数2,参数3……);第二个位置的参数会传递到函数中;

fn.call(obj, 300, 400);

2,apply( ); 函数.apply(this指向谁,[参数1,参数2,参数3]); 第二个位置的数组内数据会传递到函数内部;

fn.apply(obj, [500, 600]);

3,bind( ); 函数.bind(this指向谁,参数1,参数2,参数3……); 第二个位置的参数开始会传递到函数中;bind方法不会立即执行函数,他返回一个内部this修改完毕的新函数。

var newFn = fn.bind(obj, 700, 800)
newFn();
ES6部分知识

是JS发展过程中的某一个新版本,为了方便记忆,把ES6以后的版本统称为ES6+;

新增两种变量声明:let 和const;

let /const声明和var的差异:

1,let/const 声明的变量不允许出现重复的;使用var声明变量时可以,后一个值会覆盖前一个值;

var a = 1;
var a = 2;
console.log(a);
let b = 1;
let b = 2;
console.log(b);
const c = 1;
const c = 2;
console.log(c);

image-20221109165530611 image-20221109165553704

运行结果显示let/const声明变量不允许重复

2,let/const 声明的变量没有变量提升;var声明的变量有变量提升,值位undefined;

console.log(a);
console.log(b);
console.log(c);
var a = 1;
let b = 100;
const c = 1000;

image-20221109165248074 image-20221109165313224

代码验证let/const声明的b,c没有变量提升。

3,let/const 声明的变量会受限于所有的{ },也就是let/const 声明的变量是块级作用域;var声明的变量只受限于函数内部;

if (true) {
    var a = 1;
    let b = 2;
    const c = 3;
}
for (var i = 0; i <= 1; i++) {
    var a = 1;
    let b = 2;
    const c = 3;
}
console.log(a);
console.log(b);
console.log(c);

image-20221109164805561 可以看到let声明的变量显示未定义;

let与const的差异:

1,let声明的叫做变量(后续可以修改内部的值);const声明的叫做常量(后续不可以修改内部的值,也不能修改内部的引用地址);

let a = 1;
a = 10;
console.log(a);
​
const b = 200;
b = 2000;
console.log(b);
//运行结果 b 会报错

2,因为let后续可以修改变量的值,所以他首次定义时,可以不赋值;但是const声明的常量后续不能重新修改他的值,所以首次定义时,必须赋值。

let a;
a = 100;
console.log(a);
​
const b;
//b报错
新增箭头函数:(书写形参)=> {书写函数调用时执行的代码};是对ES5普通函数的写法上的优化
const fn2 = () => {
    console.log('我是 fn2 箭头函数');
}

箭头函数的优化:

1,箭头函数如果只有一个形参的时候,可以不写前面的小括号(除此之外,必写);

const fn3 = a => {
    console.log(a);
}

2,如果箭头函数的函数体只有一行代码,那么可以省略,大括号(并且会默认将这行代码return);

const fn5 = (a, b) => a + b;

箭头函数与普通函数的区别:

1,箭头函数内部木有this;所以他的this取决于书写的时候;

const fn = () => {
    console.log(this);
}
fn();
var obj = {
    a: 1,
    b: '我是对象obj',
    fn: function () {
        console.log(this);
    },
    // console.log(this)    window
    fn1: () => {
        console.log('我是箭头函数的 this', this);
    }
}
​
obj.fn();    // this === obj
obj.fn1();

2,箭头函数内部没有arguments对象;

const fn1 = () => {
// 箭头函数内部没有 arguments 所以这里打印会报错
    console.log(arguments);
}
fn1(999, 123, 456);
ES6新增解构赋值

快速从数组或对象中取出成员的一种语法;

1,解构数组,赋值号左边必须写中括号,代表是数组的解构赋值;

var arr = [1, 2];
let [num1, num2, num3] = arr

2,解构对象时,赋值号左边必须写大括号,代表对象的解构赋值;大括号内部必须书写对象的key。

var obj = {
    a: 11,
    b: 21,
    c: 31
}
let { a, b, c } = obj
console.log(a, b, c);
ES6新增展开运算符

语法:...数组(或对象); 作用:展开数组或者对象,相当于把数组两侧包裹的中括号去掉;

1,展开数组

var arr = [1, 2, 3];
console.log(arr);
console.log(...arr);

2,展开对象

var obj1 = {
    ...obj,
    c: 3,
    d: 4
}
console.log(obj1);//得到展开的obj
console.log(...obj1);//JS不支持这种写法
ES6新增两种数据结构:Set 和 Map。

1,set数据结构, 类似于数组的一种数据结构,内部按照索引排序(但是不能通过索引获取值);语法:let s = new Set([数据1,数据2,数据3]),特点:天生不支持重复数据。

let s = new Set([3, 4, 5, 5, 5, 4, 4, 3]);
//实际存储的值是[3,4,5]

包含的方法:

1),size方法(类似数组的length);作用,获取当前数据结构中的数据量;

console.log(s.size);

2),add方法 作用,向当前数据结构中 新增数据;

s.add(100);//向数据结构中新增一个100;

3),has方法 作用,查询当前数据结构中是否拥有该数据;找到了返回true,否则返回false;

console.log(s.has(100));

4),delete(数据) 作用,将当前数据结构中的这个数据删除;

s.delete(5);

5),clear( ) 作用,清空当前数据结构;

s.clear();

6),forEach 作用,遍历数据结构,拿到数据结构的每一项;

s.forEach(function(item,key,origin) {
    console.log(item,key,origin);//set数据结构是没有key所以item和key打印出来的值都一样
})

2,Map数据结构, 和set一样也不支持重复数据,类似于对象的一种数据结构,但是map的key可以是任意类型的值;实际开发中,使用map的场景一般为 想要将对象的key用于字符串之外的数据使用。

var m = new Map([[[500], [600]], [arr, arr1], ['arr123', arr1]]);

map数据结构的常用方法:

1),size ,作用:返回当前数据结构的数据长度(多少个);

m.size;

2),set( ), 作用,向当前数据结构中,新增数据;第一个参数为key,第二个参数为value;

m.set('newKey', [1, 2, 3, 4, 5]);

3),get(key), 作用,获取到指定key 对应的value;

m.get(arr);
m.get('newKey');

4),has(key) ,作用,查询数据结构中是否存在当前key;存在返回true,不存在返回false;

console.log(m.has('newKey'));

5),delete, 作用,删除当前数据结构对应的key;

m.delete('newKey');

6)clear, 作用,清空当前数据结构;

m.clear();

7)forEach ,遍历数据结构;

m.forEach(function (item, key, origin) {
    /**
    *  item: 对应的 value
    *  key: 对应的 key
    *  origin: 对应的原始数据结构
    */
    console.log(item, key, origin);
})
对象语法的简写:

当key 和 value 拼写一样,并且value写的是一个变量时,可以少写其中一个;

const obj = {
    name: name,
    age: 18,
}
//可以简写为:
const obj = {
    name,
    age: 18,
}