关于Symbol()数据类型

Symbol(ES6新增数据类型)属于基本数据类型

Symbol值由Symbol函数生成,由Symbol生成的属性名是独一无二的,不会与其他属性名冲突

Symbol函数不能使用new命令,会报错

Symbol是原始类型的值,不是对象类型,因为不是对象类型,所以不能添加属性,类似于字符串的类型。

Symbol的目的就是当作对象的属性标识符来使用

Symbol不支持隐式转换字符串

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


 let obj3 = Symbol("2021");
 let obj4 = Symbol("2021");
 console.log(obj3===obj4);//false

Symbol不能与其他类型的值进行运算

let abc = Symbol('this is num');
console.log(abc + "Symbol");//TypeError: can't convert symbol to string

Symbol转换字符串

let s = Symbol('this_symbol');
  console.log(String(s)); //'Symbol(this_symbol)'
  console.log(toString(s)); //[object Undefined]
  console.log(s.toString()); //'Symbol(this_symbol)'

能转换为布尔值,但是不能转换为数字

let s = Symbol();
console.log(Boolean(s)); //true
console.log(!s);  //false
console.log(Number(s));  //Uncaught TypeError: Cannot convert a Symbol value to a number

Symbol.for()

如果要重新使用同一个 Symbol 值,可以使用Symbol.for(),接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,如果没有就新建并返回一个以该字符串为名称的 Symbol 值。

Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值。它会登记在全局环境中进行搜索。

Symbol会在每次调用时返回一个新的值。

let s1 = Symbol.for('aaa');
let s2 = Symbol.for('aaa');
s1 === s2 // true
//s1和s2都是 Symbol 值,它们都以同样参数的Symbol.for()方法生成的,所以实际上是同一个值


//Symbol()没有登记机制,所以每次调用都会返回一个不同的值。
let obj1 = Symbol('obj1');
let obj2 = Symbol('obj2');
 console.log(obj1 == obj2);//false


Symbol.keyFor(obj1) // undefined
//变量obj1属于未登记的 Symbol 值,所以返回undefined

Reflect.ownKeys()

返回所有类型的键名,包括常规键名和Symbol键名。

let obj = {
  [Symbol('name')]: 1,
  num_one: 2,
  num_two: 3
};
 
console.log(Reflect.ownKeys(obj));//  ['num_one', 'num_two', Symbol(name)]

Object.getOwnPropertySymbols()

获取指定对象的所有Symbol属性名:

当前对象的所有用作属性名Symbol值以数组的形式被该方法返回

const obj = {};
  let a = Symbol('a');
  let b = Symbol('b');
  obj[a] = 'red';
  obj[b] = 'blue';
  console.log(obj); //{Symbol(a): 'red', Symbol(b): 'blue'}
  console.log(Object.getOwnPropertySymbols(obj)); //[Symbol(a), Symbol(b)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值