前言:
Symbol:英文意思是符号,象征,标记,记号,在js中的意思是独一无二的值,他是js的第七种数据类型
1、创建Symbol类型的值
var s = Symbol();
console.log(typeof s)//symbol
注:在通过Symbol()创建的时候,不能通过new Symbol()创建,因为,这样创建的是一个对象类型的,而不是原始数据类型Symbol()
2、Symbol的特点
- Symbol():接收一个参数表示对生成他的值得描述
var s = Symbol('这是一个symbol');
2、Symbol表示的是独一无二的值,所以带有相同参数的两个symbol值也不相等;
var s = Symbol('a');
var s1 = Symbol('a');
console.log(s == s1);//false
3、Symbol不能进行隐式数据转换
var name = Symbol('a');
console.log('a'+name);
//浏览器报错:Uncaught TypeError: Cannot convert a Symbol value to a string
console.log(`你好,${ name}`);
// 浏览器报错
// Uncaught TypeError: Cannot convert a Symbol value to a string
console.log(name +1;)
// 浏览器报错
// Uncaught TypeError: Cannot convert a Symbol value to a number
4、 Symbol()可以显式转换成字符串
var name = Symbol('a');
console.log(typeof String(name));//string
注: 变量名不重名,不然报错
5、Symbol()不能转换成数值
var num = Symbol(1);
console.log(Number(num))
//浏览器报错:Uncaught TypeError: Cannot convert a Symbol value to a number at Number (<anonymous>)
6、Symbol():可以转换成布尔
var name = Symbol('a');
console.log(Boolean(Symbol));//true
7、Symbol()不能作为缓存的键使用
var name = Symbol('a');
localStorage.setItem(name,'hhh');
//浏览器报错:Uncaught TypeError: Cannot convert a Symbol value to a string
3、Symbol()的应用场景
1、作为对象名:
var name = Symbol();
var user = {
age:12
};
user[name] = '李四';
console.log(user);//{age: 12, Symbol(): '李四'}
注意事项:不能用.运算符,要用方括号;原因:对象.运算符获取的属性名是字符串,.运算符会将属性名识别为字符串,新建一个属性名给对象,无法和Symbol属性区别;中括号中带双引号的属性名表示字符串属性,不带双引号的属性名表示Symbol属性
Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。但是不会出现在 for...in 、 for...of 的循环中,也不会被 Object.keys() 、 Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性,可以通过Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
let sy = Symbol();
let syObject = {};
syObject[sy] = "symbol";
console.log(syObject);
// {Symbol(): "symbol"}
for (let i in syObject) {
console.log(i);
} // 无输出
Object.keys(syObject); // []
Object.getOwnPropertyNames(syObject) // []
Object.getOwnPropertySymbols(syObject); // [Symbol()]
Reflect.ownKeys(syObject); // [Symbol()]
4、方法
1、Symbol.for():用于将值相同的Symbol变量指向同一个Symbol值
let a1 = Symbol.for('a');
let a2 = Symbol.for('a');
a1 === a2 // true
typeof a1 // "symbol"
typeof a2 // "symbol"
let a3= Symbol("a");
a1 === a3 // false
2、Symbol.keyFor():用来检测该字符串参数作为名称的Symbol值是否被登记,返回一个已登记的Symbol类型值的key。
let a1 = Symbol.for("a");
Symbol.keyFor(a1); // "a"
let a2 = Symbol("a");
Symbol.keyFor(a2); // undefined