目录
声明方式
Symbol.for()全局定义Symbol
Symbol.keyFor()
应用场景
作为属性名
属性遍历
消除魔术字符串
首页 web前端 js教程 javascript数据类型学习之浅析Symbol类型

javascript数据类型学习之浅析Symbol类型

Mar 18, 2022 am 11:01 AM
es6 javascript symbol类型 数据类型

本篇文章带大家了解一下ES6新增的数据类型:Symbol,聊聊Symbol类型的声明方式和使用方法,希望对大家有所帮助!

javascript数据类型学习之浅析Symbol类型

Symbol一种新的原始数据类型,表示独一无二的。是javascript中第七种数据类型。另外六种分别是:undefined、null、String、Number、Object

声明方式

Symbol值通过Symbol函数生成。对象的属性名可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。属性名属于 Symbol 类型的,都是独一无二的,可以保证不会与其他属性名产生冲突。【相关推荐:javascript学习教程

let s1=Symbol()
let s2=Symbol()
console.log(s1)
//Symbol()
console.log(s2)
//Symbol()
console.log(s1===s2)
//false

//Symbol函数能接受字符串作为参数,表示对Symbol实例的描述
let s1=Symbol('xxx')
let s2=Symbol('hhh')
console.log(s1)
//Symbol(xxx)
console.log(s2)
//Symbol(hhh)
console.log(s1===s2)
//false复制代码
登录后复制

Symbol函数前不能使用new命令,会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。相当于是一种特殊的字符串。

Symbol.for()全局定义Symbol

Symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。

let s1 = Symbol.for('xxx')
let s2 = Symbol.for('xxx')
console.log(s1 === s2) // true


function foo(){
    return Symbol.for('hello')
}
const x=foo()
const y=Symbol.for('hello')
console.log(x === y)//true
登录后复制

Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。区别是,前者会被登记在全局环境中供搜索,后者就不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,不存在才会新建一个值。

Symbol.keyFor()

Symbol.keyFor()方法返回一个已经登记的 Symbol 类型值的key。

const s1 = Symbol('foo')
console.log(Symbol.keyFor(s1)) // undefined

const s2 = Symbol.for('foo')
console.log(Symbol.keyFor(s2)) // foo
登录后复制

应用场景

作为属性名

由于 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用在对象的属性名,就能保证不会出现同名的属性。这对于一个对象由多个模块构成的情况非常有用,防止某一个键被不小心改写或覆盖。

const grade={
    张三:{address:'qqq',tel:'111'},
    李四:{address:'aaa',tel:'222'},
    李四:{address:'sss',tel:'333'},
}
console.log(grade)
//张三: {address: "qqq", tel: "111"} 李四: {address: "sss", tel: "333"}
//对象的key值不能重复 如果有重复 后面的value值就会覆盖前面的


//使用Symbol解决,相当于一个独一无二的字符串
const stu1=Symbol('李四')
const stu2=Symbol('李四')
console.log(stu1===stu2)
//false
const grade={
    [stu1]:{address:'aaa',tel:'222'},
    [stu2]:{address:'sss',tel:'333'},
}
console.log(grade)
//李四:{address:'sss',tel:'222'} 李四:{address:'sss',tel:'333'}
console.log(grade[stu1])
//李四:{address:'sss',tel:'222'}
console.log(grade[stu2])
//李四:{address:'sss',tel:'333'}
登录后复制

属性遍历

const sym=Symbol('imooc')
class User{
    constructor(name){
        this.name=name
        this[sym]='imooc.com'
    }
    getName(){
        return this.name+this[sym]
    }
}
const user=new User('www')

//for in的方法不能遍历到Symbol属性 像被隐藏了
for(let key in user){
    console.log(key)//name 
}

//Object.keys(obj)方法也不能遍历到Symbol属性
for(let key of Object.keys(user)){
    console.log(key)//name 
}

//Object.getOwnPropertySymbols(obj)只能获取到Symbol属性
for(let key of Object.getOwnPropertySymbols(user)){
    console.log(key)//Symbol(imooc) 
}

//Reflect.ownKeys(obj)对象的属性都能获取到
for(let key of Reflect.ownKeys(user)){
    console.log(key)
    //name 
    //Symbol(imooc) 
}
登录后复制

消除魔术字符串

魔术字符串指的是,在代码中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改成一些含义清晰的变量代替。

function getArea(shape) {
    let area = 0
    switch (shape) {
        case 'Triangle':
            area = 1
            break
        case 'Circle':
            area = 2
            break
    }
    return area
}
console.log(getArea('Triangle'))
//Triangle和Circle就是魔术字符串。多次出现,与代码形成了“强耦合”,不利于后面的修改和维护。

const shapeType = {
    triangle: Symbol(),
    circle: Symbol()
}

function getArea(shape) {
    let area = 0
    switch (shape) {
        case shapeType.triangle:
            area = 1
            break
        case shapeType.circle:
            area = 2
            break
    }
    return area
}
console.log(getArea(shapeType.triangle))
登录后复制

一个前端小白,若文章有错误内容,欢迎大佬指点讨论!

【相关视频教程推荐:web前端

以上是javascript数据类型学习之浅析Symbol类型的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MySQL数据库中性别字段应该使用什么数据类型? MySQL数据库中性别字段应该使用什么数据类型? Mar 14, 2024 pm 01:21 PM

在MySQL数据库中,性别字段通常可以使用ENUM类型来存储。ENUM是一种枚举类型,它允许我们在一组预定义的值中选择一个作为字段的值。在表示性别这样一个固定且有限的选项时,ENUM是一个很好的选择。让我们来看一个具体的代码示例:假设我们有一个名为"users"的表,其中包含了用户的信息,包括性别。现在我们要为性别创建一个字段,我们可以这样设计表结构:CRE

MySQL中最适合用于性别字段的数据类型是什么? MySQL中最适合用于性别字段的数据类型是什么? Mar 15, 2024 am 10:24 AM

在MySQL中,最适合用于性别字段的数据类型是ENUM枚举类型。ENUM枚举类型是一种允许定义一组可能取值的数据类型,性别字段适合使用ENUM类型是因为性别通常仅有两个取值,即男和女。接下来,我将通过具体的代码示例来展示如何在MySQL中创建一个性别字段并使用ENUM枚举类型存储性别信息。以下是操作步骤:首先,在MySQL中创建一个名为users的表格,包括

Python 语法的思维导图:深入理解代码结构 Python 语法的思维导图:深入理解代码结构 Feb 21, 2024 am 09:00 AM

python凭借其简单易读的语法,广泛应用于广泛的领域中。掌握Python语法的基础结构至关重要,既可以提高编程效率,又能深入理解代码的运作方式。为此,本文提供了一个全面的思维导图,详细阐述了Python语法的各个方面。变量和数据类型变量是Python中用于存储数据的容器。思维导图展示了常见的Python数据类型,包括整数、浮点数、字符串、布尔值和列表。每个数据类型都有其自身的特性和操作方法。运算符运算符用于对数据类型执行各种操作。思维导图涵盖了Python中的不同运算符类型,例如算术运算符、比

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

MySQL中性别字段最佳数据类型选择是什么? MySQL中性别字段最佳数据类型选择是什么? Mar 14, 2024 pm 01:24 PM

在设计数据库表时,选择合适的数据类型对于性能优化和数据存储效率非常重要。在MySQL数据库中,存储性别字段的数据类型真是没有所谓的最佳选择,因为性别字段一般只有两个取值:男或女。但是为了效率和节省空间,我们可以选择合适的数据类型来存储性别字段。在MySQL中,存储性别字段最常用的数据类型是枚举类型。枚举类型是一种能够把字段的值限定在一个有限的集合内的数据类型

MySQL中布尔类型的使用方法详解 MySQL中布尔类型的使用方法详解 Mar 15, 2024 am 11:45 AM

MySQL中布尔类型的使用方法详解MySQL是一种常用的关系型数据库管理系统,在实际应用中经常需要使用布尔类型来表示逻辑上的真假值。MySQL中布尔类型有两种表示方式:TINYINT(1)和BOOL。本文将详细介绍MySQL中布尔类型的使用方法,包括布尔类型的定义、赋值、查询和修改等操作,同时结合具体的代码示例进行说明。1.布尔类型的定义在MySQL中,可

C语言的基本语法和数据类型介绍 C语言的基本语法和数据类型介绍 Mar 18, 2024 pm 04:03 PM

C语言是一种广泛使用的计算机编程语言,具有高效、灵活和强大的特点。要想熟练使用C语言进行编程,首先需要了解其基本语法和数据类型。本文将介绍C语言的基本语法和数据类型,并举例说明。一、基本语法1.1注释在C语言中,可以使用注释来对代码进行说明,以便于理解和维护。注释可以分为单行注释和多行注释。//这是单行注释/*这是多行注释*/1.2关键字C语

Python 入门到精通:从零基础到项目开发 Python 入门到精通:从零基础到项目开发 Feb 20, 2024 am 11:42 AM

1.Python简介python是一种简单易学、功能强大的通用编程语言,由GuidovanRossum于1991年创建。Python的设计理念是强调代码的可读性,并为开发人员提供丰富的库和工具,以帮助他们快速、高效地构建各种应用程序。2.Python基础语法Python的基础语法与其他编程语言类似,包括变量、数据类型、运算符、控制流语句等。变量用于存储数据,数据类型定义了变量可以存储的数据类型,运算符用于对数据进行各种操作,控制流语句用于控制程序的执行流程。3.Python数据类型Python中

See all articles