ES6的新特性

Posted 遥岑.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6的新特性相关的知识,希望对你有一定的参考价值。

目录

ES6的新特性

let和const

let

  • 声明变量,但不进行变量提升
  • 声明局部变量,在块级作用域内有效
  • 不可以重复赋值
console.log(a) //undefined 变量提升
var a = 'hello'


console.log(b)  //报错 不进行变量提升
let b = 'hello'
let b = 'hell' //报错,不能重复赋值

const

  • 声明常量,声明后不可以修改,const 在声明时必须被赋值
  • 块级作用域
  • 声明时大写变量
  • 不提升变量
if(true) 
    const m = 'hello'

console.log(m) //报错 块级作用域

模板字符串

基本的字符串格式化,将表达式嵌入字符串中进行拼接。

var name = '邓瑛'
console.log(`name:$name`)

箭头函数

ES6 中,箭头函数就是函数的一种简写形式。
箭头函数不具备this变量指向改变

// ES5
var add = function (a, b) 
    return a + b;
;
// 使用箭头函数
var add = (a, b) => a + b;
//当函数只有一个表达式时,可省略花括号,自带return效果

//箭头函数中没有隐藏的参数argumens
function f1() 
    console.log(arguments)

f1(1,2,3)

let f2 = () => 
    console.log(arguments)

f2(1,2,3)
// ES5
function Person() 
    this.age = 0;

    setInterval(function growUp() 
        // growUp() 函数的 this 指向 window 对象
        this.age++;
        console.log(this.age) //NAN
    , 1000);

var person = new Person();


// ES6
function Person()
    this.age = 0;

    setInterval(() => 
        // this指向 person 对象
        this.age++;
        console.log(this.age)
    , 1000);


var person = new Person();

函数的默认参数值

function fun(name='遥岑',age=20,cb) 
    console.log(name,age)

fun('江絮')

//函数的不定参数:将函数的参数都放在默认的隐藏的参数arguments里面
function fn() 
    console.log(arguments)
    console.log(arguments[1])

fn('遥岑',20,'女')

二进制和八进制的字面量

ES6 支持二进制和八进制的字面量,通过在数字前面添加0o或者0O即可将其转换为八进制值。

let oValue = 0o10;
console.log(oValue); // 8

let bValue = 0b10; // 二进制使用 `0b` 或者 `0B`
console.log(bValue); // 2

解构赋值

对象或数组的解构赋值:

// 对象
const student = 
    name: 'Sam',
    age: 22,
    sex: '男'

// 数组
// const student = ['Sam', 22, '男'];

// ES5
const name = student.name;
const age = student.age;
const sex = student.sex;
console.log(name + ' --- ' + age + ' --- ' + sex);

// ES6
const  name, age, sex  = student;
console.log(name + ' --- ' + age + ' --- ' + sex);

对象字面量的简写

let type = 'quartz';
let color = 'rose';
let carat = 21.29;

const gemstone = 
    type: type,
    color: color,
    carat: carat
;

console.log(gemstone);

for…of和for…in

for…of 用于遍历一个迭代器。

let nicknames = ['1', '2', '3'];
for (let nickname of nicknames) 
    console.log(nickname);

// 1 2 3

for…in 用来遍历对象中的属性。

let map = 
    name:'邓瑛',
    age:27

for(let i in map) 
    console.log(map[i])

// 邓瑛 27

…循环

function foo(...args) 
    console.log(args);

foo( 1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]


function foo(x,y,z) 
    console.log(x,y,z);


let arr = [1,2,3];
foo(...arr);

forEach循环

let mySet = new Set([1, 1, 2, 2, 3, 3]);
mySet.forEach(item=>console.log(item)) //1 2 3

Map

ES6 中新的数据结构集:Map。每个对象都可以看作是一个 Map。
一个对象由多个键值对构成,在 Map 中,任何类型都可以作为对象的 key。

var map = new Map()
map.set('f','foo')
map.set('t','too')
console.log(map.get('f')) //foo
console.log(map.get('t')) //too

Set

let mySet = new Set([1, 1, 2, 2, 3, 3]);
console.log(mySet) //1,2,3
mySet.has(1); // true

mySet.add('strings');
mySet.add( a: 1, b:2 );
console.log(mySet) //1,2,3,'string',a:1,b:2

Symbol

Symbol 是一种新的数据类型,它的值是唯一的,不可变的。
ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,但是访问不到这个标识符

let obj = 
    [Symbol('name')]:'遥岑', //symbol作为属性名不会被for in循环打印返回
    age:20,
    height:'165cm'

for(let key in obj) 
    console.log(key)


var n = Symbol('t')
var s = Symbol('t')
console.log(n === s) //false Symbol是唯一的

对象超类

var parent = 
    foo() 
        console.log("Parent");
    


var child = 
    foo() 
        super.foo();
        console.log("Child");
    


Object.setPrototypeOf(child, parent);
child.foo(); //Parent Child

set get访问器

function Person(name) 
    this.name = name;
    this.age = 20


Person.prototype.fun = function() 
    console.log('ES5类定义')


let p1 = new Person();
p1.fun()


//ES6
class Person 
    constructor(name,myage) 
        this.name = name;
        this.myage = myage
    
    get age()  //访问器
        return this.myage
    
    set age(newage)  //修改器
        this.myage = newage
    
    fn() 
        console.log('ES6')
    

let p1 = new Person('江絮',20)
p1.fn()
console.log(p1.age)

p1.age = 18
console.log(p1.age)

//ES5
function Dad(name,age) 
    this.name = name;
    this.age = age;


function Son(name,age) 
    Dad.call(this,name,age); //对构造方法的继承
    this.height = '178'

Son.prototype.show = function() 
    console.log(this.name)
    console.log(this.age)


let s1 = new Son('遥岑',12)
s1.show()


//ES6
class Dad 
    constructor(name) 
        this.name = name
    
    fun() 
        console.log('父类的成员方法')
    


class Son extends Dad 
    constructor(name) 
        super(name);
    
    hobby() 
        console.log('待到晴空月明日 正是人间相逢时')
    


let s1 = new Son('江絮')
s1.hobby()
console.log(s1.name)

类的静态成员:

//类的静态属性、静态方法为类的所有对象共享,而不属于某个具体的对象
class Person 
    constructor(name,age) 
        this.name = name; //name属性是费静态属性 每个对象都有自己的name
        this.age = age;
    
    static get school() 
        console.log('70')
    ; //不能用static定义静态属性

    static fn()  //静态的成员函数(方法)
        console.log('甲二十六')
    
    show() 
        console.log(this.name)
    


let hxm = new Person('hxm',21);
Person.school
Person.fn()
hxm.show()

以上是关于ES6的新特性的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 学习笔记: ES6 新特性——对象初始器中函数属性简写

JavaScript 学习笔记:ES6 新特性 — 对象初始器中函数属性简写

ES6新特性:函数优化(传参箭头函数简写)

ES6的新特性

es6 语法结构和列子

ES6新特性:对象优化