首页 > 其他分享 >前端Symbol的常见用法

前端Symbol的常见用法

时间:2024-11-26 22:30:25浏览次数:6  
标签:instanceof const log Symbol 用法 console 前端 属性

文章目录

前端Symbol介绍及其常见用法

Symbol是ES6中新增的一种基本数据类型,它表示独一无二的值。在前端开发中,Symbol具有多种用途,可以用于创建唯一对象属性名、定义对象的迭代行为、自定义instanceof行为等。本文将详细介绍Symbol函数的常见用法。

一、Symbol函数的创建

Symbol函数的基本语法是Symbol([description]),其中description是一个可选的字符串参数,用于描述这个Symbol值的信息,便于调试和理解。需要注意的是,创建Symbol值时不能使用new关键字,否则会抛出TypeError错误。

let s1 = Symbol();
let s2 = Symbol("description");
console.log(s1); // Symbol()
console.log(s2); // Symbol(description)

通过Symbol函数创建的每个Symbol实例都是唯一的,即使使用相同的描述信息,它们之间也是不相等的。

let s1 = Symbol("foo");
let s2 = Symbol("foo");
console.log(s1 === s2); // false
二、Symbol的常见用法
  1. 创建唯一对象属性名

在对象中,我们通常使用字符串或数字作为属性名,但这可能导致意外的命名冲突。Symbol的独特性使其成为创建唯一属性的绝佳选择。

const id = Symbol('id');
const user = {
    name: "Alice",
    [id]: 123 // 使用Symbol作为属性名
};

在这个例子中,即使有另一个属性名为id,它也不会和Symbol('id')冲突。这样可以保护一些私有属性,不被外部轻易访问和修改。

  1. 定义对象的迭代行为

Symbol.iterator是一个预定义好的Symbol值,表示对象的默认迭代器方法。通过定义Symbol.iterator属性,可以自定义一个对象的迭代行为。

const myObject = {
    items: [1, 2, 3],
    [Symbol.iterator]: function*() {
        for (let item of this.items) {
            yield item;
        }
    }
};

for (let item of myObject) {
    console.log(item); // 输出 1, 2, 3
}
  1. 自定义instanceof行为

Symbol.hasInstance是一个预定义好的Symbol值,用于定义对象的instanceof操作符行为。通过定义Symbol.hasInstance方法,可以自定义一个对象的instanceof行为。

class Foo {
    static [Symbol.hasInstance](obj) {
        return obj instanceof Array;
    }
}

console.log([] instanceof Foo); // true
console.log({} instanceof Foo); // false
  1. 防止魔法字符串带来的问题

在一些条件判断中,使用字符串容易引入魔法字符串的问题。通过Symbol可以定义常量,避免使用魔法字符串,让代码更易维护。

const actionTypes = {
    CREATE: Symbol('CREATE'),
    UPDATE: Symbol('UPDATE'),
    DELETE: Symbol('DELETE')
};

function handleAction(action) {
    switch (action) {
        case actionTypes.CREATE:
            console.log("创建操作");
            break;
        case actionTypes.UPDATE:
            console.log("更新操作");
            break;
        case actionTypes.DELETE:
            console.log("删除操作");
            break;
    }
}

handleAction(actionTypes.CREATE); // 输出: 创建操作
  1. 使用Symbol.for和Symbol.keyFor

Symbol.for()方法会根据给定的字符串key返回一个已经存在的symbol值。如果不存在,则会创建一个新的Symbol值并将其注册到全局Symbol注册表中。而Symbol.keyFor()方法会返回一个已经存在的Symbol值的key,如果给定的Symbol值不存在于全局Symbol注册表中,则返回undefined。

const symbol1 = Symbol.for('foo');
const symbol2 = Symbol.for('foo');
console.log(symbol1 === symbol2); // true

const key1 = Symbol.keyFor(symbol1);
console.log(key1); // 'foo'

const symbol3 = Symbol('bar');
const key2 = Symbol.keyFor(symbol3);
console.log(key2); // undefined
三、Symbol的注意事项
  1. Symbol类型值需通过Object.getOwnPropertySymbols()获取

Symbol创建的值是不可枚举的,以下方式遍历对象的结果都不会包含Symbol内容:

  • for...in循环:会遍历对象的可枚举属性,但会忽略不可枚举的属性。
  • Object.keys():返回一个数组,其中包含对象的所有可枚举属性的名称,不可枚举的属性不会被包含在返回的数组中。
  • JSON.stringify():只会序列化对象的可枚举属性,而不会包含不可枚举属性。

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

  1. Symbol在JSON.stringify中的问题

JSON.stringify转换和Symbol相关的数据时,会忽略掉Symbol类型的key或value。

const obj = {
    [Symbol('foo')]: 'bar'
};

console.log(JSON.stringify(obj)); // {}

标签:instanceof,const,log,Symbol,用法,console,前端,属性
From: https://blog.csdn.net/qq_63447955/article/details/143984291

相关文章

  • 前端技术中对JavaScript对象的学习
    对象目录对象创建对象使用循环遍历对象属性对象中的方法创建对象创建新对象有两种不同的方法:使用Object定义并创建对象的实例。使用函数来定义对象,然后创建新的对象实例。newObject在JavaScript中,几乎所有的对象都是Object类型的实例,它们都会从Object.prototype......
  • mysql基础用法
    1、数据库操作、表操作#显示所有数据库showdatabases#创建数据库:createdatabase数据库名CREATEdatabasestudy_mysql#使用数据库usestudy_mysql#创建表:createtable表名()comment注释CREATETABLEcreate_table_test(#字段名字段类型comment注释......
  • 前端技术学习路线图
    以下Web开发人员学习路线图是来自Githubdeveloper-roadmap项目,目前已经有繁体版翻译developer-roadmap-chinese。主要有三个方向,分别为前端开发、后端开发和运维。图片中不同颜色的意义:黄色:推荐;灰色:尽可能学习;橙色:任选其一。可以看到,作为Web开发者,不管从事什么职位,下......
  • 【前端】vue引入tinymce富文本编辑器上传视频自动转img问题
    近期遇到了一个问题,前端项目引入tinymce富文本编辑器后有一个上传视频的需求,可是放入了视频以后,在预览时发现,视频标签未能正确展示,被替换为了img标签找了很多解决办法,都没有解决这个问题,最后找到了一个办法,特此记录。解决办法:1.找到node_modules下tinymce插件里面的media文......
  • asp.net实现微信支付综合管理平台前端页面(支付、订单查询、退款、退款查询)
    <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index4V2.aspx.cs"Inherits="WXPayDemo.index4V2"%><!DOCTYPEhtml><htmlxmlns="http://www.w3.org/1999/xhtml"><headrunat=&q......
  • MINIMAX稀宇科技 爬虫AI-API复用-海螺前端JS代码的动态调试
    海螺前端JS代码的动态调试环境准备chrome浏览器,burpsuit,实际操作主要操作在chrome浏览器中进行:第零步:通过burpsuit抓包,在重放中改变requestheader参数,定位关键参数第一步:进入需要自动化发包的页面,在js代码中寻找关键参数.第三步:对关键参数的js文件进行分......
  • C++,引用的讲解,本质,用法,注意事项
    1.引用的语法引用实际上就是给变量起别名,语法:数据类型&别名=原名,代码举例如下:#include<iostream>usingnamespacestd;intmain(){ inta=10; int&b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<end......
  • 【C知道】前端未来的技术趋势
    C知道你对前端未来的技术趋势有何看法?例如WebAssembly、WebXR、PWA等。 前端技术的发展正在不断加速,未来的趋势包括: WebAssembly(WASM):随着性能需求的增长,WASM将越来越重要,它允许在浏览器环境中运行高性能原生代码,这将极大地提升网页应用的响应速度和复杂度处理能力。......
  • 【C语言】前端项目故障处理。
    在前端项目中,如何处理错误和异常的? 在前端项目中,处理错误和异常通常涉及以下几个步骤: 捕获错误:JavaScript提供try...catch语句用于捕获运行时可能出现的错误。将可能会出错的代码放在try块内,如果发生错误,程序会立即跳转到相应的catch块,其中可以处理错误。     ......
  • 前端的性能统计有哪些指标?
    前端性能统计指标有很多,可以大致分为以下几类:1.加载时间相关:这组指标主要关注页面加载速度的各个阶段。FP(FirstPaint):首次绘制的时间,浏览器开始将像素绘制到屏幕上的时间点,用户可以看到任何内容,即使只是一些背景色。FCP(FirstContentfulPaint):首次内容绘制,浏览......