es6之Symbol

本文深入探讨了JavaScript中Symbol数据类型的特点与应用。Symbol是一种不可变的原始数据类型,用于创建唯一的键名,避免属性名冲突。文章详细讲解了Symbol的创建、比较、描述以及与字符串、数字等类型的转换规则,并介绍了Symbol.for()和Symbol.keyFor()的使用场景。

1.Symbol是一个新的基本数据类型 是一个值类型的

1.使用Symbol函数执行得到一个Symbol数据类型
let sym1 = Symbol("foo");
let sym2 = Symbol("foo");
console.log(typeof  sym1);//"symbol"
2.Symbol跟字符串类型相似 但是使用Symbol函数得到一个数据,每一个都是完全不同的
console.log(sym2===sym1);//false  sym1和sym2没有关系
3.Symbol可以接受一个参数() 这个是对Symbol数据的一个描述

即使描述一样 但是值也是不一样的

4.一般当做对象的属性 因为任意一个Symbol()得到的值都是不同的 避免了同名属性被覆盖属性值的情况
let obj = {
    [sym1]:"hello"
};
console.log(obj);//{Symbol(foo): "hello"}
obj[sym2] = "good";
console.log(obj);//{Symbol(foo): "hello", Symbol(foo): "good"}  同名的属性 但是并没有被覆盖掉 说明两个Symbol命名的属性不相干
5.Symbol值不可以跟其他值计算 也不可以进行字符串拼接
6.Symbol值是无法转数字的
console.log(Symbol("1") + 1);//报错: Cannot convert a Symbol value to a number
7.可以转为Boolean值
console.log(!Symbol("1"));//false
8.可以toString变成 显示字符串
console.log(Symbol("good").toString());//"Symbol(good)"
9.Symbol.for() 如果之前有相同描述(参数)的Symbol值,找到这个值返回 如果没有就得到一个包含这个参数的新值

使用Symbol.for() 参数相同 值就相同

let Aq1 = Symbol("hello");
let Aq2 = Symbol.for("hello");
let Aq3 = Symbol.for("hello");
console.log(Aq2 === Aq3);//true
console.log(Aq1 === Aq2);//false 因为Symbol值是完全不同的
10.Symbol.leyFor(Symbol值) 找到使用Symbol.for创建的值的描述(参数)

如果使用的是Symbol()创建的 是无法用keyFor获取的

console.log(Symbol.keyFor(Aq2));//"hello"
console.log(Symbol.keyFor(Aq1));//undefined 看来只能找到用Symbol.for() 创建的值的描述
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现扩展应用。; 适合人群:具备电力系统基础知识Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
<think>嗯,用户想了解ES6中的Symbol类型,需要详细解释使用方法。根据系统指令,所有行内数学表达式要用$...$格式,独立公式用$$...$$,但这个问题不涉及数学公式,所以重点在中文解释代码示例。用户提供的引用资料提到Symbol是独一无二的数据类型,适合作为对象键值防止覆盖,还有内置SymbolSymbol.iteratorSymbol.keyFor方法。这些信息很关键,需要整合进回答。首先考虑设计回答结构:从基本概念切入,解释Symbol的核心特性(唯一性避免属性冲突),然后展示基础用法。用户引用中强调Symbol.for()Symbol.keyFor()的区别,这部分要详细说明,用代码示例对比全局注册非全局Symbol的不同行为。 内置Symbol部分需要重点展开,特别是Symbol.iterator,因为引用[1]提到它非常重要。可以举例说明如何用Symbol.iterator让普通对象可迭代,这样能衔接后续迭代器模式的讲解。其他内置Symbol如toStringTagspecies也要简要说明应用场景。使用注意事项部分准备补充两个易错点:类型转换限制属性遍历时的特殊处理。用户引用[3][4]都提到keyFor对未注册Symbol返回undefined,这个细节要强调。 最后生成相关问题考虑知识延伸:Symbol的实际应用案例(如框架开发)、与WeakMap的对比、polyfill可行性等。这些问题能帮助用户深化理解。代码示例需要严格验证:确保Symbol()创建、对象字面量使用、for/keyFor对比、iterator实现等片段都能直接运行。特别要注意Symbol在对象属性中的两种写法:方括号语法定义后赋值。</think>### ES6 Symbol 类型详解及使用方法 #### 一、核心概念 1. **独一无二的值** SymbolES6 新增的**原始数据类型**,表示唯一标识符。每次创建都生成新值,即使描述相同: ```javascript const s1 = Symbol('id'); const s2 = Symbol('id'); console.log(s1 === s2); // false ``` 2. **解决属性冲突** 作为对象属性键时,可避免属性名覆盖(传统字符串键可能被意外修改)[^1]: ```javascript const user = {}; const id = Symbol('id'); user[id] = 'abc123'; user.id = '常规属性'; // 不会冲突 ``` #### 二、基础用法 ```javascript // 1. 创建Symbol const sym1 = Symbol(); const sym2 = Symbol('描述文本'); // 描述仅用于调试 // 2. 作为对象属性 const obj = { [sym1]: '私有值', // 需用[]语法 publicKey: '常规值' }; // 3. 访问属性 console.log(obj[sym1]); // '私有值' console.log(Object.getOwnPropertySymbols(obj)); // [Symbol()] ``` #### 三、全局注册表 通过 `Symbol.for()` 在全局注册表中复用 Symbol: ```javascript // 创建或获取全局Symbol const gSym1 = Symbol.for('global_key'); const gSym2 = Symbol.for('global_key'); console.log(gSym1 === gSym2); // true // 查询全局Symbol的key console.log(Symbol.keyFor(gSym1)); // "global_key" [^2][^4] const localSym = Symbol('local'); console.log(Symbol.keyFor(localSym)); // undefined [^2][^4] ``` #### 四、内置Symbol值(常用) | 内置Symbol | 作用 | 示例场景 | |------------------|-------------------------------|----------------------------| | `Symbol.iterator`| 定义对象的默认迭代器 | 使对象支持 `for...of` 循环 | | `Symbol.toStringTag`| 定制 `Object.prototype.toString()` 返回值 | 自定义对象类型标识 | | `Symbol.species` | 指定派生对象的构造函数 | 控制数组方法返回的实例类型 | **迭代器示例**: ```javascript const myIterable = { [Symbol.iterator]: function* () { yield 1; yield 2; } }; console.log([...myIterable]); // [1, 2] [^1] ``` #### 五、使用注意事项 1. **类型转换限制** Symbol 不能隐式转换为字符串或数字,需显式转换: ```javascript const sym = Symbol('desc'); console.log(String(sym)); // "Symbol(desc)" console.log(sym + ''); // TypeError ``` 2. **属性遍历** Symbol 属性不出现在以下遍历中: - `for...in` - `Object.keys()` - `Object.values()` 需用 `Object.getOwnPropertySymbols()` 单独获取。 --- ### 相关问题 1. Symbol 属性如何实现真正的“私有”?它与闭包私有变量的优劣对比是什么? 2. 在实际项目中,内置 Symbol (如 `Symbol.replace`) 如何扩展对象的内置行为? 3. Symbol 与 WeakMap 在实现私有属性时的区别是什么?各自适用场景有哪些? 4. 如何通过 `Symbol.species` 自定义派生类(如继承 Array)的构造函数? 5. 在不支持 Symbol 的旧浏览器中,有哪些兼容方案或 Polyfill 实现思路? > 参考资料: > [^1]: Symbol 作为对象键值可防止属性覆盖,`Symbol.iterator` 是实现迭代器的关键。 > [^2]: `Symbol.keyFor()` 仅返回全局注册 Symbol 的描述键,未注册的返回 `undefined`。 > [^3]: Symbol 是 JavaScript 的第 7 种原始数据类型。 > [^4]: 通过 `Symbol.for()` 注册的 Symbol 才可通过 `Symbol.keyFor()` 查询键名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值