当前位置: 首页 > news >正文

Symbol

概述

ES6引入新类型Symbol,表示独一无二的值,作为JavaScript语言的第7种类型。

Symbol值通过Symbol()函数生成。

Symbol函数前不能使用new命令,因为生成的Symbol是一个原始类型的值,不是对象。

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

·>symbol

Symbol函数的参数

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述。

let s1=Symbol("foo");
let s2=Symbol("bar")
console.log(s1,s1.toString());
console.log(s2,s2.toString());

·>Symbol(foo) 'Symbol(foo)'
   Symbol(bar) 'Symbol(bar)'

如果Symbol的参数是一个对象,就会调用其 toString方法,将其转换为字符串,然后才生成一个 Symbol值。

const obj = {
    toString() {
        return 'abc';
    }
};
const sym = Symbol(obj);
console.log(sym);

·>Symbol(abc)

Symbol函数的参数只表示当前Symbol值的描述。

相同参数的Symbol函数的返回值是不相等的。

let s1 = Symbol();
let s2 = Symbol();
console.log('s1==s2', s1 == s2);

·>s1==s2 false

let s1 = Symbol('foo');
let s2 = Symbol('foo');
console.log('s1==s2', s1 == s2);

·>s1==s2 false

Symbol值不能与其他类型的值进行运算,否则会报错。

Symbol值可以显式的转换为字符串。

Symbol值可以显式的转换为布尔值,但不能转换为数值。


创建Symbol值的属性

1.直接在对象初始化时通过 [] 语法使用 Symbol 作为属性名

const mySymbol = Symbol('description');

const obj = {
  [mySymbol]: 'Symbol属性值' 
};

console.log(obj[mySymbol]); 

2.动态添加属性

const mySymbol = Symbol('description');
const obj = {};

obj[mySymbol] = '动态添加的Symbol属性';

3.通过属性描述符定义 Symbol 属性Object.defineProperty

const mySymbol = Symbol('description');
const obj = {};

Object.defineProperty(obj, mySymbol, {
  value: '通过描述符定义的Symbol属性',
  writable: true,
  enumerable: true, // 默认 false(Symbol属性默认不可枚举)
  configurable: false
});

console.log(obj[mySymbol]);


作为属性名的Symbol

所有的数据都可以用foreach()/for...of 迭代,因为他们都有一个共同的接口(symbol)。

Symbol作为对象属性名保证不会出现同名的属性。

作用:对一个对象由多个模块构成的情况非常有用,能防止一个键被不小心改写或覆盖。

Symbol值作为属性名时不能使用点运算符。

let proSym = Symbol();
let a = {};
a.proSym='Hello';
console.log(a[proSym]);
console.log(a['proSym']);

·>undefined
    Hello

当使用 a.proSym = ... 语法时,属性名会被强制转换为字符串

在对象内部使用Symbol值定义属性时,Symbol值必须放在方括号中。

let d = {
[proSym](name) {
console.log('hello' + name);
}
};
d[proSym]('xiaohua');

·>helloxiaohua

Symbol类型可以用于定义一组常量,保证这组常量的值都是不相等的。

let log = {};
log.levels = {
DEBUG: Symbol('debug’),
INFO: Symbol('info’),
WARN: Symbol('warn')
};
console.log(log.levels.DEBUG, 'debug message');
console.log(log.levels.INFO, 'info message');

·>Symbol(debug) 'debug message'
   Symbol(info) 'info message'


属性名的遍历

Symbol作为属性名时,该属性不会出现在for…in和 for…of循环中。也不会被Object.keys()、Object.getOwnPropertyNames()返回。

可以使用Object.getOwnPropertySymbols()方法获取指定对象的所有Symbol属性名。

let obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
let objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols);

·>[Symbol(a), Symbol(b)]

Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名。

let o = {
[Symbol('my_key')]: 1,
enum: 2,
nonEnum: 3
};
let r3 = Reflect.ownKeys(o);
console.log(r3);

·>['enum', 'nonEnum', Symbol(my_key)]


Symbol.for( )与Symbol.keyFor( )

Symbol.for( )

Symbol.for方法接受一个字符串,然后搜索有没有以该参数作为名称的Symbol值,若有,则返回这个Symbol值,否则新建并返回一个以该字符串为名称的Symbol值。

Symbol.keyFor( )

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。
s1 = Symbol.for('foo');
s2 = Symbol.for('foo');
console.log(s1 === s2);
console.log(Symbol.keyFor(s1));

·>true
   foo


Symbol.toPrimitive属性

指向一个方法,对象被转换为原始类型的值时会调用这个方法,返回该方法对应的原始类型值。

其他属性使用方式,参考网址:Symbol - JavaScript | MDN

相关文章:

  • C++学习之路,从0到精通的征途:string类的模拟实现
  • 操作系统基础:06 操作系统历史
  • C++ CUDA开发入门
  • VectorBT量化入门系列:第六章 VectorBT实战案例:机器学习预测策略
  • vue3动态路由
  • Cyber Weekly #51
  • C++ 回调函数应用实战:深入理解与高效使用回调函数
  • 网络互连与互联网
  • redis哨兵机制 和集群有什么区别:
  • 用哪个机器学习模型 依靠极少量即时静态数据来训练ai预测足球赛的结果?
  • LeetCode算法题(Go语言实现)_44
  • Linux基本指令2
  • Day 11
  • linux网络设置
  • 协程的原生挂起与恢复机制
  • 【深度学习与大模型基础】第10章-期望、方差和协方差
  • 文献分享: DESSERT基于LSH的多向量检索(Part3.2.外部聚合的联合界)
  • lx2160 LSDK21.08 firmware 笔记 - 0.基于fip.bin 编译流程展开的 makefile 分析
  • DrissionPage详细教程
  • Django3 - 建站基础
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 中疾控专家:新冠感染的临床严重性未发生显著变化
  • 重庆一男大学生掉进化粪池死亡,重庆对外经贸学院:以学校通报为准
  • 5月LPR下调:1年期、5年期以上品种均下调10个基点
  • 特朗普与普京开始进行电话会谈,稍后还将致电泽连斯基
  • 国家外汇管理局:4月货物贸易项下跨境资金净流入649亿美元