ES6知识整合

字符串扩展:

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

// 普通字符串
let str=`hello'\n'world`;  
// hello
// world
 
// 多行字符串
let str=`hello,
this is a string`;
// hello,
// this is a string
 
// 字符串中嵌入变量和表达式
let a='x',b='y',c=1;
let str=`hello ${a},world ${b},num is ${c+1}`;    // hello x,world y,num is 2
 
// 字符串中调用函数
function func(){
    return 'string';
}
let str=`this is ${func()}`;    // this is string

2.repeat(n)方法返回一个新字符串,表示将原字符串重复n次

var str = 'hello';

console.log(str.repeat(3));  //hellohellohello

 3.includes():返回布尔值,表示是否找到了参数字符串

var str = 'javascript';

console.log(str.includes('scr'));  //true
console.log(str.includes('vaas')); //false


var arr = ['zhangsan', 'lisi', 'wangwu'];

console.log(arr.indexOf('lisi')); //1
console.log(arr.includes('lisi')); //true

4.startsWith():返回布尔值,表示参数字符串是否在源字符串的头部

var str = 'javascript';

console.log(str.startsWith('ja'));  //true
console.log(str.startsWith('javv')); //false

5.endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部

var str = 'javascript';

console.log(str.endsWith('ipt'));  //true
console.log(str.endsWith('t'));  //true
console.log(str.endsWith('tt')); //false

函数的扩展:

1.函数参数默认值

const sum = function(a = 10, b = 10) {
    return a + b;
}

console.log(sum(12, 13)); //25  添加了实参,使用实参
console.log(sum()); //20 没有实参,默认的参数。

//传统的 - 现在还在使用
var sum = function(a, b) {
    var a = a || 10;
    var b = b || 10;
    return a + b;
}

console.log(sum(12, 13));
console.log(sum());

2.箭头函数

        函数的简洁的写法;箭头函数内部的this来自于父级,而且this改变不了。(函数声明时this已经确定了)

    箭头函数的特点:

        1.箭头函数适合于无复杂逻辑纯函数场景下,例如用在map、reduce、filter、foreach的回调函数定义中.

        2.同时函数体内this对象,就是定义时所在的对象,而不是使用时所在的对象。This不会改变了。

        3.箭头函数一定是匿名函数

        4.不要在最外层定义箭头函数,因为在函数内部操作this会很容易污染全局作用域window。最起码在箭头函数外部包一层普通函数,将this控制在可见的范围内;

//箭头函数的应用
const aLi = document.querySelectorAll('li');

for (var i = 0; i < aLi.length; i++) {
    aLi[i].onclick = function() {
        //this:当前点击的li
        setTimeout(() => {
            //this不改变
            this.innerHTML = '22222222222222222222222222222222222';
        }, 2000);
    };
}

数组和对象的扩展:

数组的扩展方法

    1.Array.from() 方法用于将对象转为真正的数组(类数组转数组)

let obj = {
    0: 'zhangsan',
    1: 100,
    2: '男',
    length: 3
}

console.log(Array.from(obj)); //["zhangsan", 100, "男"]

    2.类数组转数组

let arr = [];

arr.name = 'lisi';
arr.age = 200;
arr.sex = '女';
console.log(arr); //length=0  [name: "lisi", age: 200, sex: "女"]

for (var i = 0; i < arr.length; i++) { //length:0,没有数组下标。
    console.log(arr[i]);//不能获取
}

for (var i in arr) { //无序的
    console.log(arr[i]); //可以获取
}

    3.Array.of() 方法用于将一组值, 转换为数组。

console.log(Array.of(1, 2, 3)); //[1, 2, 3]
console.log(Array.of(1)); //[1]
console.log(Array.of('a', 'b', 'c'));//["a", "b", "c"]

    4.fill() 方法使用给定值, 填充一个数组。

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

console.log(arr.fill('hello')); //["hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello", "hello"]
console.log(arr.fill('hello', 3, 5)); //替换区间   参2:开始的索引   参3:结束的索引,不包括。

对象的扩展

    1.对象的简洁表示法

var num = 1;

let obj = {
    num: num, //将变量num赋值给自定义的num属性。
    shownum: function() {
        return this.num;
    }
};


//下面改写
let obj1 = {
    num, //属性名和属性值同一个字符。
    shownum() { //方法省略function
        return this.num;
    }
};

console.log(obj.num); //1
console.log(obj.shownum()); //1
console.log(obj1.num); //1
console.log(obj1.shownum()); //1

    2.Object.assign(目标对象,obj1,obj2,.....)用于对象的合并,将源对象的所有可枚举属性,复制到目标对象。

let obj1 = {
    a: 1,
    b: 2,
    c: 3
};

let obj2 = {
    c: 4,
    d: 5,
    e: 6
};

let obj3 = {
    d: 7,
    e: 8,
    f: 9
}

let obj = {};

Object.assign(obj, obj1, obj2, obj3); //属性相同,后面覆盖前面。

console.log(obj);  //{a: 1, b: 2, c: 4, d: 7, e: 8, f: 9}
console.log(Object.keys(obj)); //键,属性名    (6) ["a", "b", "c", "d", "e", "f"]
console.log(Object.values(obj)); //值,属性值    (6) [1, 2, 4, 7, 8, 9]

遍历器:

1.遍历器(Iterator)它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

Iterator 的作用有三个:

   a.为各种数据结构,提供一个统一的、简便的访问接口;

    b.使得数据结构的成员能够按某种次序排列;

    c. ES6 创造了一种新的遍历命令for...of循环, Iterator 接口主要供for...of消费。

2.一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。

let arr = [1, 2, 3, 4];
let str = 'hello';
let obj = {
    a: 1,
    b: 2,
    c: 3
}

console.log(arr[Symbol.iterator]()); //Array Iterator {}
console.log(str[Symbol.iterator]()); //String Iterator {}
console.log(obj[Symbol.iterator]()); // TypeError: obj[Symbol.iterator] is not a function

3.for...of最好的遍历方式

    for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、以及字符串。

//for...of的应用
let arr = [1, 2, 3, 4];
let str = 'hello';
let obj = {
    a: 1,
    b: 2,
    c: 3
}

for (let value of arr) {
    console.log(value);
}

for (let value of str) {
    console.log(value);
}

for (let value of obj) { //报错 TypeError: obj is not iterable
    console.log(value);
}

     for...of与其他遍历语法的比较

        for循环这种写法比较麻烦,因此数组提供内置的forEach方法。

        forEach没有返回值,无法中途跳出forEach循环,break命令或return命令都不能奏效。

        for...in循环有几个缺点。

                数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。

                for...in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。

                某些情况下,for...in循环会以任意顺序遍历键名。

    总之,

       for...in循环主要是为遍历对象而设计的, 不适用于遍历数组 .

       for...of循环相比上面几种做法, 有一些显著的优点。

        有着同for...in一样的简洁语法, 但是没有for...in那些缺点。

       不同于forEach方法, 它可以与break、 continue和return配合使用。

       提供了遍历所有数据结构的统一操作接口。


Symbol

概念和特点

    Symbol--表示独一无二的值,它是js中的第七种数据类型,属于基本类型

    Symbol():首字母大写。

    Symbol 函数前不能使用new, 否则会报错, 原因在于symbol是一个原始类型的值, 不是对象。

let obj = {
    a: 1
};

obj.a = 2;
console.log(obj.a); //2

//由来:自定义对象,对象的属性名很容易被覆盖。
let s1 = Symbol();
let s2 = Symbol();

console.log(s1 == s2); //false
console.log(s1);
console.log(s2);

symbol函数接收一个字符串作为参数,表示对symbol的描述,主要是为了在控制台显示,或者转为字符串的时候,比较容易区分。描述的内容相同仅仅表示的是描述,不代表其他的意义


set和map数据结构:

set结构:

ES6提供了数据结构Set. 它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set 本身是一个构造函数,用来生成 Set 数据结构,数组作为参数

//简单的数组去重
var arr = [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 4, 4, 4, 6, 6, 6];

console.log([...new Set(arr)]);// [1, 2, 3, 4, 5, 6]

set的属性和方法:

    let s1 = new Set(['zhangsan', 'lisi']); //生成一个set结构

// Set类的属性--size(长度)
    console.log(s1.size); //2

// Set类的方法
// Set.add(value) 添加一个数据, 返回Set结构本身, 允许进行链式操作。
    s1.add('wangwu').add('zhaoliu');
// Set.delete(value) 删除指定数据, 返回一个布尔值, 表示删除是否成功。
    console.log(s1.delete('zhaoliu')); //true
// Set.has(value) 判断该值是否为Set的成员, 返回一个布尔值。
    console.log(s1.has('lisi')); //true
    console.log(s1.has('lisi123')); //false
// Set.clear() 清除所有的数据, 没有返回值。
    s1.clear();
// forEach(): 使用回调函数遍历每个成员
    s1.forEach((value, index, set) => {
        console.log(index + '---' + value); //索引和值是相等的。  zhangsan---zhangsan
    });

    console.log(s1); // {"zhangsan", "lisi"}

map结构

JavaScript 的对象(Object),只能用字符串当作键。这给它的使用带来了很大的限制。ES6 提供了 Map 数据结构。它类似于对象,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Symbol类型当作key输出时 无法确认是同一个key.

let m1 = new Map([
    ['name', 'zhangsan'],
    ['age', 100]
]);

console.log(m1);//{"name" => "zhangsan", "age" => 100}

map的属性和方法:

let m1 = new Map([
    ['name', 'zhangsan'],
    [100, 1000],
    [true, 'hehe'],
    [undefined, 'xixi']
]);

//map类的属性--size
    console.log(m1.size); //4

// map.set(key,value) :设置键名key对应的键值value,然后返回整个map结构,如  果key已经有值,则键值会被更新,否则就生成该键,可以链式操作。
    m1.set('age', 100).set('sex', '男');

// map.get(key) get方法读取key对应的键值,如果找不到key,返回undefined
    console.log(m1.get(undefined)); //xixi

// map.delete(key) 删除某个键,返回true.如果删除失败,返回false.
// map.has(key) 方法返回一个布尔值,表示某个键是否在当前map对象之中。
// map.clear() 清除所有数据,没有返回值

// map.entries() 返回键值对的遍历器
    console.log(m1.keys());
    console.log(m1.values());
    console.log(m1.entries());

// map.forEach()   使用回调函数遍历每个成员

构造函数:

function Fn() {}

let f1 = new Fn(); //fn:构造函数。
console.log(typeof Fn); //function

//类:
class Fn {}

let f2 = new Fn(); //fn:类
console.log(typeof Fn); // function

ES6的类是构造函数的语法糖

语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

猜你喜欢

转载自blog.csdn.net/qq_39264561/article/details/107243658
今日推荐