编程笔记 html5&css&js 071 JavaScrip Symbol 数据类型

编程笔记 html5&css&js 071 JavaScrip Symbol 数据类型

  • [一、Symbol 数据类型](#一、Symbol 数据类型)
  • [二、 示例](#二、 示例)
  • 小结

在JavaScript中,Symbol 是一种基本数据类型,它于 ECMAScript 6(ES6)中引入,用来创建唯一的、不可变的值。这些值可以作为对象属性的键,从而提供了一种防止属性名冲突的方式,并允许开发者隐藏对象中的一些属性或方法,使其对常规操作如 for...in 循环和 Object.keys() 不可见。

一、Symbol 数据类型

  1. 唯一性 :

    每个通过 Symbol() 函数生成的 Symbol 值都是独一无二的,即使它们具有相同的描述符。这意味着即使两个符号使用相同的字符串作为描述,它们也是不同的。

    javascript 复制代码
    let s1 = Symbol('description');
    let s2 = Symbol('description');
    console.log(s1 === s2); // 输出:false
  2. 隐式转换阻止 :

    Symbol 类型不能与其他任何类型的值进行相等性比较,也不能被转换为其他类型。

  3. 不可变性 :

    一旦创建了一个 Symbol,就无法改变这个值,也无法重新赋值。

  4. 不可枚举性 :

    当用作对象属性时,默认情况下,Symbol 属性是不可枚举的,这意味着它们不会出现在 for...in 循环、Object.keys()、Object.getOwnPropertyNames() 等返回的对象属性列表中。

  5. 描述符 :

    创建 Symbol 时可以传入一个可选的描述字符串,用于调试目的,但不影响其唯一性。

    javascript 复制代码
    let s3 = Symbol('unique identifier');
    console.log(s3.description); // 在标准 JavaScript 中输出:'unique identifier'

    注意:在最新的规范中,Symbol.prototype.description 已不再是一个标准属性,而是需要通过 toString() 方法间接获取描述信息。

  6. 内置 Symbol 值 :

    JavaScript 提供了一些内置的 Symbol 值,例如 Symbol.iterator(用于定义迭代器)、Symbol.hasInstance(自定义 instanceof 操作符的行为)、Symbol.toPrimitive(自定义对象到原始值的转换行为)等等。

  7. 作为对象属性 :

    Symbol 可以安全地用作对象属性名来避免与已有属性冲突。

    javascript 复制代码
    let myKey = Symbol();
    let obj = {};
    obj[myKey] = 'secret value';
    console.log(obj[myKey]); // 输出: 'secret value'
    for(let key in obj) {
      console.log(key); // 不会输出 myKey,因为它是 Symbol 类型且默认不可枚举
    }

    若要访问 Symbol 类型的属性,通常使用 Object.getOwnPropertySymbols() 方法。

二、 示例

javascript 复制代码
// 创建一个带有 Symbol 键的简单对象
let id = Symbol('id');
let user = {
  name: 'Alice',
  [id]: 12345 // 使用 Symbol 作为键存储用户 ID
};

console.log(user[id]); // 输出: 12345

// 获取对象的所有 Symbol 属性
let symbols = Object.getOwnPropertySymbols(user);
console.log(symbols); // 输出: [Symbol(id)]

// 内置 Symbol 示例 - 自定义 instanceof 行为
class MyClass {}
MyClass[Symbol.hasInstance] = function(inst) {
  return inst && inst.isMyClass;
};
let instance = { isMyClass: true };
console.log(instance instanceof MyClass); // 根据自定义规则判断是否为 MyClass 实例

小结

总结来说,Symbol 类型在 JavaScript 中主要用于实现私有属性、解决命名冲突以及扩展内置对象行为等方面,提供了更多元化的编程方式和更强的封装能力。

相关推荐
总要学点什么8 小时前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
Agent世界9 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
总要学点什么9 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
程序员大阳9 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半10 小时前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳10 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
曦樂~11 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
码云社区12 小时前
智慧物业系统选型指南:房屋档案、账单管理与报修协作
前端·javascript·vue.js·智慧物业
code_Bo1 天前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen1 天前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能