JS中symbol的特点和用法详解

 更新时间:2023年06月05日 08:50:57   作者:施主来了  
在 JavaScript 中,Symbol用于表示独一无二的标识符,它是 ECMAScript 6引入的一个新特性,本文介绍了JS中的symbol的特点和用法,需要的朋友可以参考下

Symbol 的特点如下:

  • 唯一性:每个通过 Symbol 函数创建的 Symbol 值都是唯一的,即使是通过相同的描述符创建的 Symbol,它们也是不相等的。
const symbol1 = Symbol('symbol');
const symbol2 = Symbol('symbol');
console.log(symbol1 === symbol2); // false

在上述示例中,虽然 symbol1symbol2 使用相同的描述符 'symbol' 创建,但它们是不相等的 Symbol 值。

  • 用作对象属性名:Symbol 值可以用作对象属性名,由于每个 Symbol 值都是唯一的,所以可以防止属性名冲突的风险。
const symbolKey = Symbol('key');
const obj = {};
obj[symbolKey] = 'value';
console.log(obj[symbolKey]); // value

在上述示例中,我们使用 Symbol 值作为对象 obj 的属性名,确保了属性名的唯一性。

  • 属性遍历:Symbol 属性默认是不可枚举的,不会出现在常规的对象遍历方法(如 for...inObject.keys()Object.values()Object.entries())中。这可以用于隐藏一些内部实现细节或元数据,使其在遍历对象属性时不可见。
const symbolKey = Symbol('key');
const obj = {
  [symbolKey]: 'value',
  regularProperty: 'regular value'
};
for (let key in obj) {
  console.log(key); // regularProperty
}
console.log(Object.keys(obj)); // ['regularProperty']

在上述示例中,使用 Symbol 定义了一个属性 [symbolKey],它不会在遍历对象属性时被获取到。

  • 预定义的 Symbol 值:JavaScript 提供了一些预定义的 Symbol 值,用于表示语言内部的特殊行为或元数据。其中一些常见的预定义 Symbol 值包括:

    • Symbol.iterator: 用于定义对象的默认迭代器方法。
    • Symbol.toStringTag: 用于自定义对象在调用 Object.prototype.toString() 时返回的字符串标记。
    • Symbol.species: 用于指定构造函数在创建衍生对象时应使用的构造函数。

    这些预定义的 Symbol 值可以在自定义对象或类中使用,以改变其行为或提供额外的元数据。

class MyArray extends Array {
  static get [Symbol.species]() {
    return Array;
  }
}
const arr = new MyArray(1, 2, 3);
const slicedArr = arr.slice(1, 2);
console.log(slicedArr instanceof MyArray); // false
console.log(slicedArr instanceof Array); // true

在上述示例中,通过自定义类 MyArray 并覆盖预定义的 Symbol.species,我们指定了在对数组进行切片操作时返回的构造函数应为 Array,而不是 MyArray。这改变了数组切片操作的行为,使其返回一个标准的数组对象。

Symbol 提供了一种强大的机制来扩展 JavaScript 对象的行为和功能,使我们能更灵活地操作和控制对象的属性、遍历方式和特殊行为。然而,由于 Symbol 的独特性质和某些特定使用场景,需要理解其用途和限制,避免滥用。

到此这篇关于JS中symbol的特性和用法详解的文章就介绍到这了,更多相关JS symbol内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序中实现手指缩放图片的示例代码

    微信小程序中实现手指缩放图片的示例代码

    本篇文章主要介绍了微信小程序中实现手指缩放图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 使用JS获取当前地理位置方法汇总

    使用JS获取当前地理位置方法汇总

    这篇文章主要介绍了使用JS获取当前地理位置方法汇总,需要的朋友可以参考下
    2014-12-12
  • js跨域和ajax 跨域问题的实现思路

    js跨域和ajax 跨域问题的实现思路

    大家都知道js是不能跨域的,但我们有时候就要这么用,怎么办呢?办法总是有的.
    2009-09-09
  • JS制作简单的三级联动

    JS制作简单的三级联动

    本文给大家分享的是使用javascript实现的一个简单的三级联动菜单,非常简单实用,有需要的小伙伴过来参考下吧。
    2015-03-03
  • TypeScript中never 类型的神奇妙用

    TypeScript中never 类型的神奇妙用

    在TypeScript中,never是一个特殊类型,通常用于表示不可能发生的情况,它适用于抛出异常、不返回值的函数或处理逻辑上永远不会出现的分支,下面就来详细的介绍一下如何使用,感兴趣的可以了解一下
    2025-12-12
  • JavaScript函数增强以及额外知识

    JavaScript函数增强以及额外知识

    函数就是封装了一段可以被重复执行调用的代码块,下面这篇文章主要给大家介绍了关于JavaScript函数增强以及额外知识的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 使用egg.js实现手机、验证码注册的项目实践

    使用egg.js实现手机、验证码注册的项目实践

    本文主要介绍了使用egg.js实现手机、验证码注册的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • JS中confirm,alert,prompt函数区别分析

    JS中confirm,alert,prompt函数区别分析

    JS中confirm,alert,prompt函数使用区别有哪些呢?
    2011-01-01
  • JavaScript数组every方法的应用场景实例

    JavaScript数组every方法的应用场景实例

    every方法确定数组中的每一项的结果都满足所写的条件的时候,就会返回true,否则返回false,这篇文章主要给大家介绍了关于JavaScript数组every方法应用场景的相关资料,需要的朋友可以参考下
    2022-12-12
  • 详解ES6中的let命令

    详解ES6中的let命令

    let是ES6里面新的复制命令,let赋值命令只可以在{}代码块中被调用。这篇文章主要介绍了ES6中的let命令,需要的朋友可以参考下
    2016-12-12

最新评论