Js-原始数据类型Symbol符号类型


概述

Symbol用来表示独一无二的值, 最大的用法就是用来定义对象的唯一属性名。

基本用法

Symbol函数不能用new新建对象, 因为Symbol是原始数据类型, 不是对象。

Symbol可以接收一个值作为参数, 为新创建的Symbol提供描述, 在控制台输出信息时用来区分。

let sy = Symbol('aaa');
console.log(sy); // Symbol(aaa)
console.log(typeof sy); // "symbol"
// 相同参数的Symbol返回值不同
let sy2 = Symbol('aaa');
console.log(sy2 == sy); // false

使用场景

作为对象的属性名

由于Symbol的值是唯一的, 所以Symbol在作为属性名时, 可以保证属性的唯一。

let sy = Symbol('sy');

// 用法1
let obj = {};
obj[sy] = 'aaa';
console.log(obj); // {Symbol(sy): 'aaa'}

// 用法2,Es6新增语法
let obj2 = {
    [sy] : 'aaa'
}
console.log(obj2); // {Symbol(sy): 'aaa'}

Symbol在作为属性名时不能使用.运算符, 要使用[]方括号。因为在对象的操作中.运算符后面代表的是字符串, 所以取到的是字符串sy的属性值, 而不是作为Symbol值sy的属性。

let sy = Symbol('sy');

let obj = {};
obj[sy] = 'aaa';

console.log(obj[sy]); // 'aaa'
console.log(obj.sy);  // undefined

// .运算符后面代表的是字符串, 所以获取的是对象中字符串'sy'的属性值
obj['sy'] = 'bbb';
console.log(obj.sy); // 'bbb'

console.log(obj); // {sy: 'bbb', Symbol(sy): 'aaa'}

注意点

Symbol值作为属性名是, 该属性是公有属性不是私有属性, 可以在类的外部访问。但是不会出现在for…in循环中, 也不会被Object.keys()获取到。如果要获取一个对象的Symbol值属性, 可以用Object.getOwnPropertySymbols()获取。

let sy = Symbol('sy');

let obj = {};
obj[sy] = 'aaa';
obj['k'] = 'kk';

// for...in 循环用来枚举对象的键
for(let i in obj){
    console.log(i);
} // k 输出一个'k', 因为for...in循环不能获取到Symbol值的属性

console.log(Object.keys(obj)); // ['k']  Object.keys()也不能获取到Symbol值
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(sy)]  只用来获取Symbol值的属性

Symbol.for()

Symbol.for()类似于对象的单例模式, 首先会在全局搜索被登记过的Symbol中是否有该字符串作为值的Symbol, 如果有就返回该Symbol值, 如果没有就新建一个并返回该Symbol值, 并且登记在全局环境中以供搜索。

// 用Symbol函数生成的Symbol值不会注册在全局环境中
let sy = Symbol('sy');
let sy2 = Symbol.for('sy');
console.log(sy == sy2); // false

let sy3 = Symbol.for('sy');
console.log(sy2 === sy3); // true

Symbol.keyFor()

Symbol.keyFor()返回一个已登记的Symbol值的key, 用来检测该字符串作为键的Symbol值是否被注册。

// 这种直接写在Symbol函数的参数里的, 不会登记在全局中
let sy = Symbol('sy');
console.log(Symbol.keyFor(sy)); // undefined

let sy2 = Symbol.for('syaaa');
console.log(Symbol.keyFor(sy2)); // 'syaaa'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python454

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值