ES6的部分知识

var,Let,const 三个的区别

Let

1.let 声明的变量只在 let 命令所在的代码块内有效。
2.let 只能声明一次 var 可以声明多次:
3.不存在变量提升
4.不影响作用域
注:通常与循环一起使用

const

 1.const 声明一个只读的常量,一旦声明,常量的值就不能改变。
2.声明必须赋初始值
3.标识符一般为大写
4.只能声明一次
5.块级作用域
注:对象和数组修改不会触发const错误
(一)块级作用域: 块作用域由 { }包括,let和const具有块级作用域,
     var不存在块级作用域。块级作用域解决了ES5中的两个问题.
     1.内层变量可能覆盖外层变量。
     2.用来计数的循环变量泄露为全局变量
(二)变量提升: var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。
(三)重复声明: var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。
     const和let不允许重复声明变量。
(四)暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,
     称为暂时性死区。使用var声明的变量不存在暂时性死区。
(五)初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。

结构赋值的含义:

他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

…剩余运算符|扩展运算符
注:通常写在最后

静态方法给对象添加一个新属性

示例写法

Let a = {};
Object.defineProperty(a, ‘num’, {
Value:”1”,
Writable:true,
Configurable:false,
Enumerable:”true”
})

含义:
Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。
Object.defineProperty(操作的对象, 键名, {value:键值})
writable 设置为false不允许修改defineProperty对象添加的值,true允许修改
enumerable设置为true允许被循环(枚举)拿取值,false不予许
configurable false不可被删除,true可以删除

ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,

还新增了 Symbol 。

基本用法

Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。可以接受一个字符串作为参数,
为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

使用场景

作为属性名
用法
由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。

示例:
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"}

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

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() 取到。

Symbol.for()

含义:
Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中
是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值 ,
若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

示例:
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1;      // false
 
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2;     // true

Symbol.keyFor()

含义:

示例:
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1);    // "Yellow"

Map 对象

含义:
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Map 中的 key

key 是字符串

var myMap = new Map();
var keyString = "a string"; 
myMap.set(keyString, "和键'a string'关联的值");
myMap.get(keyString);    // "和键'a string'关联的值"
myMap.get("a string");   // "和键'a string'关联的值"
                         // 因为 keyString === 'a string'

key 是对象

示例:
var myMap = new Map();
var keyObj = {}, 
myMap.set(keyObj, "和键 keyObj 关联的值");
myMap.get(keyObj); // "和键 keyObj 关联的值"
myMap.get({}); // undefined, 因为 keyObj !== {}

key 是函数

示例:
var myMap = new Map();
var keyFunc = function () {}, // 函数
myMap.set(keyFunc, "和键 keyFunc 关联的值");
myMap.get(keyFunc); // "和键 keyFunc 关联的值"
myMap.get(function() {}) // undefined, 因为 keyFunc !== function () {}

key 是 NaN

var myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN); // "not a number"
var otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"

虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),NaN作为Map的键来说是没有区别的。

for…of

for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}

注意点:
这个 entries 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [key, value] 数组。
这个 keys 方法返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键。

forEach()

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
 
// 将会显示两个 logs。 一个是 "0 = zero" 另一个是 "1 = one"
myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)

Map 对象的操作

Map 与 Array的转换

var kvArray = [["key1", "value1"], ["key2", "value2"]];
 
// Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
var myMap = new Map(kvArray);
 
// 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
var outArray = Array.from(myMap);

Map 的克隆

var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
var myMap2 = new Map(myMap1);
 
console.log(original === clone); 
// 打印 false。 Map 对象构造函数生成实例,迭代出新的对象

Map 的合并

var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
var second = new Map([[1, 'uno'], [2, 'dos']]);
// 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
var merged = new Map([...first, ...second]);

Set 对象

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set 中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。

Set 对象作用

1.数组去重
var mySet = new Set([1, 2, 3, 4, 4]);
[…mySet]; // [1, 2, 3, 4]
2.并集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([…a, …b]); // {1, 2, 3, 4}
3.交集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([…a].filter(x => b.has(x))); // {2, 3}
4.差集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([…a].filter(x => !b.has(x))); // {1}

Map的特性

	// Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
	// Map 对象记得键的原始插入顺序。
	// Map 对象具有表示映射大小的属性。
	// Map 对象的几个常用方法和属性
	// new Map() 创建新的 Map 对象。
	// set() 为 Map 对象中的键设置值。
	// get() 获取 Map 对象中键的值。
	// entries() 返回 Map 对象中键/值对的数组。
	// keys() 返回 Map 对象中键的数组。
	// values() 返回 Map 对象中值的数组。

map对象与object区别

共同点

	// 二者都是以key-value的形式对数据进行存储;

不同点

	// key的数据类型范围不同
	// obj可以作为key的仅有number、string、symbol。
	// map均可以。
	
	// key的顺序不同。
	// obj通过obj.keys()打印出来的属性顺序是 number–字符串
	// map的key顺序是声明顺序。
	
	// 创建方式不同。
	// obj有三种创建方式 字面量{}、new Object() 、构造函数。
	// map仅支持new Map()
	
	// key的调用不同。
	// map只能用原生的get方法调用。
	
	// 设置属性的方式不同
	// map只能使用set(key,val)方法设置属性。
	
	// Size属性
	// map有size属性,对象没有。Map.size 返回 Map 中元素的数量,而 Object 的键值对个数只能手动计算

set对象的特性和常用方法


Set 对象的几个常用方法和属性

new Set() 创建新的 Set 对象。
add() 向 Set 添加新元素。
clear() 从 Set 中删除所有元素。
delete() 删除由其值指定的元素。
has() 如果值存在则返回 true。
forEach() 为每个元素调用回调。
keys() 返回 Set 对象中值的数组。
size 返回元素个数。

.set对象与map对象的区别

Set对象可以接收一维数组和字符串类型添加值
Set对象只有value值
Set对象可以对数组去重

arguments

含义:arguments没有形参接收时,在函数体内部可接受所有传入的实参,以数组形式存储

let f = ()=>{
// console.log(arguments);
//会报错,Es6箭头函数没有arguments
// }

箭头函数里面没有 this 对象,此时的 this 是外层的 this 对象,即 Window

最后重点!!!

改变this指向的方法

1.取一个变量 var _this=this;
2.使用箭头函数
3.使用setTimeout延时器
4.call
5.apply
6.bind
7.function.prototype

箭头函数的特性

1.不绑定arguments,用rest参数…解决
2.本身没有this的概念,捕获其所在上下文的 this 值,作为自己的 this 值,this指向全局
3.箭头函数不能使用new(会报错)
4.箭头函数没有原型属性(prototype)
5.箭头函数不能当做Generator函数,不能使用yield关键字
6.箭头函数不能换行
7.箭头函数有constructor、length属性
8.箭头函数可以立即执行

call,applay bind 的区别

1.applay、call、bind他们三个都能改变函数this的指向问题;
2.applay、call这两个方法的主动调用,bind返回的是改变this指向后的新函数;
3.传参的问题区别,call和bind都是直接传递参数,applay传递的是数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值