/**
* 全局作用域绑定
* let 和 const 和 var 的另一个区别是它们在全局作用域的行为。 当var被作用于全局作用域时,浏览器环境中的
* window对象的属性。 这意味着用var很可能会无意覆盖一个已经存在的全局属性
* */
/* var RegExp = "Hello";
console.log(window.RegExp);
var ncz = "Hi!";
console.log(window.ncz);*/
/**
* ECMAScript6中的Set集合
* Set集合时一种有序列表,其中含有一些相互独立的非重复值,可以通过Set集合快速访问其中的元素
*
* 在set集合中不会对值进行强制的类型转换,数字 5和字符串"5"可以作为两个独立的元素存在
*/
let set = new Set();
set.add(5);
set.add("5");
console.log(set.size); // size : 2
let key1 = {}, key2 = {};
set.add(key1);
set.add(key2);
// 由于key1和key2不会被转换为字符串,所有在set集合中是独立存在的元素
console.log(set.size); // size : 4
// 重复添加会被忽略
set.add(5);
console.log(set.size); // size : 4
let numArray = [1,2,2,3,4,5,5,5];
let arraySet = new Set(numArray);
console.log(arraySet.size); // size: 5 ====> 1,2,3,4,5
// Set集合是否存在
let numSet = new Set();
numSet.add(5);
numSet.add(6);
console.log(numSet.has(5)); // true
console.log(numSet.has(10)); // false
// Set集合移除元素
numSet.delete(5);
console.log(numSet.has(5)); // false
// Set集合清空
numSet.add(5);
numSet.clear();
console.log(numSet.size); // size: 0
// Set集合forEach
numSet.add("javaScript");
numSet.add("java");
numSet.add("python");
numSet.forEach(function(value, key, ownerSet){
console.log(key + " >> " + value); // 输出的键值一样
console.log(ownerSet === numSet); // true
});
// 将Set集合转换为数组
set = new Set([1,2,3,3,3,4,5]);
let paramArray = [...set];
console.log(typeof paramArray); // object
console.log(paramArray);
/**
* Weak Set集合
* 将对象存储在Set集合中与存储在变量中是完全一样的,垃圾回收机制就不能释放该对象的内存空间
*/
let objectKey = new Set();
let person = {
name : "song",
age : 10
}
objectKey.add(person);
// 移除原始索引
person = null;
console.log(objectKey.size); // size : 1
// 重新取回原始引用
person = [...objectKey][0];
console.log([...objectKey][0].name + " >>> " + [...objectKey][0].age);
// 为了解决这个问题,ECMAScript6 引入了WeakSet集合 支持3个方法 add() delete() has()
let weak = new WeakSet();
// 可以向集合中添加引用
weak.add(person);
// 判断是否有指定对象的引用
console.log(weak.has(person));
// 删除引用
weak.delete(person);
// WeakSet与Set类型的区别, WeakSet保存对象的引用
weak.add(person);
weak.has(person); // true
person = null; // 此时weakSet已经移除了弱引用了
/**
* WeakSet集合与普通Set集合的差别
*
* 1. add() 如果传入非对象参数,会报错
* 2. weakSet 不可以迭代,不能 for-of
* 3. weakSet集合不支持forEach方法
* 4. weakSet集合不支持size
* 如果你只需要跟踪对象的引用,应该使用WeakSet集合
* */
// for-of 可以遍历数组和对象
let numStr = ["a","b","c"];
for (let i of numStr) {
console.log(i); // a b c
}