ES6新特性

推荐菜鸟教程:菜鸟教程ES6

ES6 数据类型有: Number 、 String 、 Boolean 、 Object、 null 、 undefined 、 Symbol 。

1. Let、Const

两者都拥有块级作用域,没有变量提升,不能重复声明,存在暂时性死区
let用于声明变量
const用于声明常量,一旦声明必须初始化。基本数据类型的常量一旦声明就不改变,但是引用数据类型的常量,比如对象(Object),可以改变里面的属性值(里面的数据结构改变),但建议不要修改,要修改就用let

2.结构赋值

解构赋值是对赋值运算符的扩展,是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
数组解构

//基本操作
let [a, b, c] = [1, 2, 3];//a=1,b=2,c=3
//可嵌套
let [a, [[b], c]] = [1, [[2], 3]];//a=1,b=2,c=3
//可忽略,用‘,’占位
let [, , a] = [1, 2, 3];//a=3
//不完全解构
let [a = 1, b] = []; // a = 1, b = undefined
//剩余运算符...
let [a, ...b] = [1, 2, 3];//a = 1,b = [2, 3]

字符串解构

//基本
let [a, b, c, d, e] = 'hello';// a = 'h',b = 'e',c = 'l',d = 'l',e = 'o'
//解构默认值
let [a = 2] = [undefined]; // a = 2

let [a = 3, b = a] = [];     // a = 3, b = 3
let [a = 3, b = a] = [1];    // a = 1, b = 1
let [a = 3, b = a] = [1, 2]; // a = 1, b = 2
//a 与 b 匹配结果为 undefined ,触发默认值:a = 3; b = a =3
//a 正常解构赋值,匹配结果:a = 1,b 匹配结果 undefined ,触发默认值:b = a =1
//a 与 b 正常解构赋值,匹配结果:a = 1,b = 2

对象解构

//基本
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };// foo = 'aaa',bar = 'bbb'
//解构并重命名,常用是{data:res}:从接口返回数据,利用解构,只拿data,并重命名为res,
let { baz : foo } = { baz : 'ddd' };// foo = 'ddd'
//可嵌套可忽略
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;// x = 'hello',y = 'world'
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, {  }] } = obj;// x = 'hello'
//不完全解构
let obj = {p: [{y: 'world'}] };
let {p: [{ y }, x ] } = obj;// x = undefined,y = 'world'
//剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};// a = 10,b = 20,rest = {c: 30, d: 40}
//解构默认值
let {a = 10, b = 5} = {a: 3};// a = 3; b = 5;
let {a: aa = 10, b: bb = 5} = {a: 3};// aa = 3; bb = 5;

3.Symbol

Symbol是原始数据类型,而不是对象,所以不能用new,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,可以保证属性不重名。
可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

let sy = Symbol("KK");
console.log(sy);   // Symbol(KK)
typeof(sy);        // "symbol"
 
// 相同参数 Symbol() 返回的值不相等
let sy1 = Symbol("kk"); 
sy === sy1;       // false

作为属性名
Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

let sy = Symbol("key1");
// 写法1
let syObject = {};
syObject[sy] = "kk";
console.log(syObject);    // {Symbol(key1): "kk"}
// 写法2
let syObject = {
  [sy]: "kk"
};
console.log(syObject);    // {Symbol(key1): "kk"}
// 写法3
let syObject = {};
Object.defineProperty(syObject, sy, {value: "kk"});
console.log(syObject);   // {Symbol(key1): "kk"}

let syObject = {};
syObject[sy] = "kk";
syObject[sy];  // "kk"
syObject.sy;   // undefined

注意:
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for…in 、 for…of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

let sy = Symbol("key1");
let syObject = {};
syObject[sy] = "kk";
for (let i in syObject) {
  console.log(i);
}    // 无输出
 
Object.keys(syObject);                     // []
Object.getOwnPropertySymbols(syObject);    // [Symbol(key1)]
Reflect.ownKeys(syObject);                 // [Symbol(key1)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值