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

简介: 编程笔记 html5&css&js 071 JavaScript Symbol 数据类型


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

一、Symbol 数据类型

  1. 唯一性
    每个通过 Symbol() 函数生成的 Symbol 值都是独一无二的,即使它们具有相同的描述符。这意味着即使两个符号使用相同的字符串作为描述,它们也是不同的。
let s1 = Symbol('description');
let s2 = Symbol('description');
console.log(s1 === s2); // 输出:false
  1. 隐式转换阻止
    Symbol 类型不能与其他任何类型的值进行相等性比较,也不能被转换为其他类型。
  2. 不可变性
    一旦创建了一个 Symbol,就无法改变这个值,也无法重新赋值。
  3. 不可枚举性
    当用作对象属性时,默认情况下,Symbol 属性是不可枚举的,这意味着它们不会出现在 for...in 循环、Object.keys()Object.getOwnPropertyNames() 等返回的对象属性列表中。
  4. 描述符
    创建 Symbol 时可以传入一个可选的描述字符串,用于调试目的,但不影响其唯一性。
let s3 = Symbol('unique identifier');
console.log(s3.description); // 在标准 JavaScript 中输出:'unique identifier'
  1. 注意:在最新的规范中,Symbol.prototype.description 已不再是一个标准属性,而是需要通过 toString() 方法间接获取描述信息。
  2. 内置 Symbol 值
    JavaScript 提供了一些内置的 Symbol 值,例如 Symbol.iterator(用于定义迭代器)、Symbol.hasInstance(自定义 instanceof 操作符的行为)、Symbol.toPrimitive(自定义对象到原始值的转换行为)等等。
  3. 作为对象属性
    Symbol 可以安全地用作对象属性名来避免与已有属性冲突。
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 类型且默认不可枚举
}
  1. 若要访问 Symbol 类型的属性,通常使用 Object.getOwnPropertySymbols() 方法。

二、 示例

// 创建一个带有 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 中主要用于实现私有属性、解决命名冲突以及扩展内置对象行为等方面,提供了更多元化的编程方式和更强的封装能力。

相关文章
|
2天前
|
前端开发 JavaScript
uniapp动态修改css样式(通过js来修改css样式)
uniapp动态修改css样式(通过js来修改css样式)
|
10天前
|
Web App开发 前端开发 JavaScript
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
|
8天前
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
|
8天前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
7天前
|
XML JavaScript 前端开发
JavaWeb基础4——HTML,JavaScript&CSS
HTML,JavaScript&CSS、元素、标签、css 选择器、属性、JavaScript基础语法、JavaScript对象、BOM浏览器对象模型、DOM文档对象模型、事件监听、正则对象RegExp/ES6
JavaWeb基础4——HTML,JavaScript&CSS
|
19天前
|
前端开发 JavaScript
JavaScript 动态更新 CSS
【9月更文挑战第01天】
12 2
|
6天前
|
XML 前端开发 JavaScript
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
11 0
|
19天前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML、CSS与JavaScript之旅
在这个数字时代,拥有一个个性化的网络空间已成为许多人的梦想。本文将引导你了解如何从零开始,使用HTML、CSS和JavaScript创建属于自己的博客网站。我们将探索这些技术的基础概念,并通过实际代码示例展示如何将静态页面转变为动态交互式网站。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。【8月更文挑战第31天】
|
4月前
|
JavaScript
JS+CSS3点击粒子烟花动画js特效
JS+CSS3点击粒子烟花动画js特效
36 0
JS+CSS3点击粒子烟花动画js特效
|
前端开发 JavaScript
js css 悬浮动画字体
js css 悬浮动画字体