1、Symbol()相当于第七种数据类型,ES6中为了防止冲突,引入了Symbol()。
凡是用Symbol()引用的属性名都是独一无二的
总结:独一无二,防止冲突
let s1 = Symbol();
let s2 = Symbol();
console.log(s1); //Symbol()
console.log(s2); //Symbol()
console.log(s1===s2); //false,验证独一无二
let s3 = Symbol('name');
let s4 = Symbol('name');
console.log(s1===s2); //false,验证独一无二
//数据类型
console.log(typeof s) //symbol
2、可以用来添加对象的属性值,但是是唯一的,验证独一无二*/
//一般的对象添加的属性名对应的属性值只能是一个,重复添加会覆盖
let obj1={};
obj1.name='ni';
obj1.name='wo';
console.log(obj1); //{name: "wo"}
//利用Symbol()添加的会全部显示出来,因为每一个name属性都是独一无二的,解决了命名冲突的问题
let obj2={};
obj2[Symbol('name')]='ni';
obj2[Symbol('name')]='wo';
console.log(obj2); //{Symbol(name): "ni", Symbol(name): "wo"}
3、不能使用new关键字,否则会报错。
这是因为Symbol()是一个原始类型的值,
不是对象不能添加任何属性
let snew = new Symbol();
console.log(snew); //报错
4、Symbol()可以将字符串作为参数,
* 表示对实例对象的描述,主要作用可以针对不同变量进行区分
* 注意:由于其参数的值是对其的描述,所以可能每次返回的值是不同的
let a = Symbol('a');
console.log(a.toString()); //Symbol(a)
let b = Symbol('B');
console.log(b); //Symbol(B)
console.log(a===b); //false
5、Symbol()不能与其他类型的值进行运算,但是可以返回一个Boolean值
let c = Symbol();
console.log(s+'nihao'); //Cannot convert a Symbol value to a string
console.log(s+'2'); //Cannot convert a Symbol value to a string
console.log(Boolean(c)); //true
6、不能被for in循环遍历
var obj3 = {};
var str1 = Symbol('str1');
var str2 = Symbol('str1');
obj3[a] = '我是刘昊然的女朋友';
obj3[b] = '我承认了';
obj3.c = '妈的,瞒不住了';
obj3.d = '我爱刘昊然';
for( let key in obj3 ){
console.log(key) // c d
}
7、可以通过Object.getOwnPropertySymbols()方法,获取Symbol()属性名
console.log(Object.getOwnPropertySymbols(obj3)); //[Symbol(a), Symbol(B)]
7、set数据集合:类似于数组/*set:是一个集合,类似于数组,与数组的主要区别是没有重复的元素。主要的作用可以进行去重。 * 重点:一个属性,四个方法 1、size属性:返回set数组的长度,类似于lenght 2、四个方法:add,delete,clear,has*/ let set =new Set([1,2,3,4,1]); console.log(set....