JS—Symbol数据类型

前言:

Symbol:英文意思是符号,象征,标记,记号,在js中的意思是独一无二的值他是js的第七种数据类型

1、创建Symbol类型的值

var s = Symbol();
console.log(typeof s)//symbol

:在通过Symbol()创建的时候,不能通过new Symbol()创建,因为,这样创建的是一个对象类型的,而不是原始数据类型Symbol()

2、Symbol的特点

  1.  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

         

猜你喜欢

转载自blog.csdn.net/weixin_65565362/article/details/124477889
今日推荐