Symbol 是ES6引入的一种新的原始数据类型,由于Symbol是一个原始类型的值,不是对象,不能添加属性.基本上

是一种类似于字符串的数据类型

概述

Symbol 可以接受一个字符串作为参数,主要是为了容易区分
Symbol 函数的参数只是对当前Symbol的描述,相同参数的Symbol返回值是不相同的
Symbol 值不能与其他类型的值进行运算(字符串的加运算)
Symbol 可以转字符串,布尔值
var sys =Symbol() // Symbol()
sys.toString() // "Symbol()"
Boolean(sys) //true
!sys //false

作为属性名的Symbol

由于每一个Symbol都是不相同的 意味Symbol值可以作为标识符用于对象的属性名,保证不会出现同名的属性
var mySymbol = Symbol()
1.
var a ={}
a[mySymbol]='hello'
2.
var a ={[mySymbol]:'hello'}
3.
var a = {}
object.defineProperty(a,mySymbol,{value:'hello'})
* Symbol值作为属性名的时候,不能使用点选运算符,因为点运算符后面总是字符串,所以实际的属性名是一个字符串
而不是Symbol值.同理,Symbol值在对象里的时候必须放在[]符号内
eg1:
const COLOR_RED =Symbol()
const COLOR_GREEN =Symbol()
function tes1t(color){
switch(color){
case COLOR_RED:
return COLOR_GREEN;
case COLOR_RED:
return COLOR_GREEN;
default:
throw new Error('undefined color')
}
}
eg2:
const obj={
DEBUGGER:Symbol('debugger')
}

魔术字符串

魔术字符串是指在代码中多次出现、与代码形成强耦合的某一个具体字符串或者数值

var shapeType={triangle:'triangle'}
function getArea(shape,options){
var area=0
switch(shape){
case shapeType.triangle:
area=1*options.height*options.width
break
}
return area
}
var shapeType={triangle:Symbol()}
function getArea(shape,options){
var area=0
switch(shape){
case shapeType.triangle:
area=1*options.height*options.width
break
}
return area
}
getArea(shapeType.triangle,{width:10,height:20}) //200
shapeType.triangle //Symbol()

Symbol.for,Symbol.keyFor()

Symbol.for

1.Symbol()[未登记的Symbol值]和Symbol.for()都会生成新的Symbol,区别在于前者会被登记在全局环境中供搜索
2.Symbol.for()不会每次调用都返回一个新的Symbol值,而是会在全局先检查给定的key是否已经
存在,如果不存在就新建一个,如果存在会返回同一个Symbol值
var s1 = Symbol('cat')
var s2 = Symbol('cat')
s1==s2 //false
var s1 = Symbol.for('cat')
var s2 = Symbol.for('cat')
s1==s2 //true

symbol.keyFor()

Symbol.keyFor() 方法返回一个已经登记的Symbol类型的key值
var s1 =Symbol.for('cat')
Symbol.keyFor(s1) //'cat'
var s1 =Symbol('cat')
Symbol.keyFor(s1) //undefined
var test = Symbol()
var test2=Symbol()
test1==test //false
// 使用Symbol.for(),可以重新使用一个Symbol值
var test1 = Symbol.for()
var test2 = Symbol.for()
test1===test2 //true
* Symbol.for 为Symbol值登记名字是全局环境的,可以在不同的iframe或service worker中获取
iframe = document.creatElement('iframe')
iframe.src = String(window.location)
document.body.appendChild(iframe)
iframe.contentWindow.Symbol.for('foo') ==Symbol.for('foo') //true

属性名的遍历

Object.getOwnPropertyNames()只能返回Symbol类型的键名 Reflect.ownkeys可以返回所有类型的键名

Symbol作为属性名的时候不会出现在for...in for...of循环中,也不会出现在Object.keys,Object.getOwnPropertyNames
返回,会被Object.getOwnPropertySymbols获取指定对象的所有用作属性名的Symbol值
var obj ={}
var a = Symbol('a')
var b = Symbol('b')
var objProperty = Object.getOwnPropertySymbols(obj)
obj // {Symbol(a): "hello", Symbol(b): "world"}
ObjProperty // [Symbol(a), Symbol(b)]
let obj ={}
let obj ={[Symbol('key')]:1,enum:2,nonEnum:3}
Reflect.ownKeys(obj) //["enum", "nonEnum", Symbol(key)]
以Symbol值作为名称的属性不会被常规遍历方法获得,可以利用这个特性,为独享定义一些私有但又只希望
内部使用的方法
var size = Symbol('size')
class Collection{
constructor(){
this[size]=0
}
add(item){
this[this[size]]=item
this[size]++
}
static sizeOf(instance){
return instance[size] }
}
var x = new Collection() //Collection {Symbol(size): 0}
Collection.sizeOf(x) //0
x.add('foo') // Collection {0: "foo", Symbol(size): 1}
Collection.sizeOf(x) //1
Object.keys(x) // ['0']
Object.getOwnPropertyNames(x) //['1']
Object.getOwnPropertySymbols(x) //[Symbol(size)]

内置的Symbol值

Symbol.hasInstance

对象的Symbol.hasInstance属性指向内部一个方法,对象使用instanceOf运算符时会调用这个方法,判断对象是否是
某个构造函数的实例eg. foo instanceof Foo 在语言内部实际调用的是Foo[Symbol.hasInstance](foo)

Symbol.isConcatSpreadable

对象的Symbol.isConcatSpreadable属性等于一个布尔值,表示该对象使用Array.property.concat()时是否可以展开
let Arr1 = [1,2,3]
let Arr2 = [3,4]
var Arr3 = Arr1.concat(Arr2) //[1, 2, 3, 3, 2]
let Arr4 = [5,6]
Arr4[Symbol.isConcatSpreadable]= false
let Arr5 = Arr1.concat(Arr4) //[1, 2, 3, Array(2)]

Symbol.species

对象的Symbol.species属性指向一个方法对象创造实例的时候会调用this.constructor[Symbol.species]存在
就会使用这个属性作为构造函数来创建新的实例对象
Symbol,species属性默认的读取器如下
static get [Symbol.species](){
return this
}

Symbol.match

对象的Symbol.match属性指向一个函数,当执行str.match(myObject)时,如果改属性存在,会调用它返回该方法的返回值
String.property.macth(regexp)===>regexp[Symbol.macth](this)

Symbol.replace

对象的replace属性指向一个方法,当String.property.replace方法调用时会返回该方法的返回值
String.property.replace(searchValue,replaceValue) ==> searchValue[Symbol.replace](this,replaceValue)

Symbol.search

对象的Symbol.search属性指向一个方法,当对象被String.property.search方法调用时会返回该方法的返回值
String,property.search(regexp) ==> regexp[Symbol.search](this)

Symbol.split

对象的Symbol.split属性指向一个方法,当对象被String.property.split方法调用时会返回该方法的返回值
String,property.search(separator,limit) ==> regexp[Symbol.search](this,limit)

Symbol.iterator

对象的Symbol.split属性指向其默认的遍历器方法,即对象在进行for...of循环时调用这个方法,返回该对象的默认遍历器

Symbol.toPrimitive

对象的Symbol.toPrimitive属性指向一个方法,对象被转为原始类型的时候会调用这个方法,返回该对象对应的原始值

Symbol类型的更多相关文章

  1. 用vue.js学习es6(四):Symbol类型

    一.Symbol类型: 1.ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null. 布尔值(Boolea ...

  2. ES6笔记(4)-- Symbol类型

    系列文章 -- ES6笔记系列 Symbol是什么?中文意思是标志.记号,顾名思义,它可以用了做记号. 是的,它是一种标记的方法,被ES6引入作为一种新的数据类型,表示独一无二的值. 由此,JS的数据 ...

  3. ES6中的Symbol类型

    前面的话 ES5中包含5种原始类型:字符串.数字.布尔值.null和undefined.ES6引入了第6种原始类型——Symbol ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个 ...

  4. JavaScript 为什么要有 Symbol 类型?

    Symbols 是 ES6 引入了一个新的数据类型 ,它为 JS 带来了一些好处,尤其是对象属性时. 但是,它们能为我们做些字符串不能做的事情呢? 在深入探讨 Symbol 之前,让我们先看看一些 J ...

  5. ES6中关于数据类型的拓展:Symbol类型

    ES5中包含5种原始类型:字符串.数值.布尔值.null.undefined.ES6引入了第6种原始类型——Symbol. ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个他人提供 ...

  6. ES6学习----let、const、解构赋值、新增字符串、模板字符串、Symbol类型、Proxy、Set

    这篇es6的学习笔记来自于表哥 表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 ES6就是JS6,JS的第 ...

  7. Symbol类型是不可枚举的

    const info = { [Symbol('a')]: 'b' } console.log(info)//{Symbol('a'): 'b'} console.log(Object.keys(in ...

  8. Symbol类型的应用

    应用场景1:使用Symbol来作为对象属性名(key) 在这之前,我们通常定义或访问对象的属性时都是使用字符串,比如下面的代码: let obj = { abc: 123, "hello&q ...

  9. 详解 Symbol 类型

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证 ...

  10. es6 Symbol类型

    es6 新增了一个原始类型Symbol,代表独一无二的数据 javascript 原来有6中基本类型, Boolean ,String ,Object,Number, null , undefined ...

随机推荐

  1. AtCoder Beginner Conest 284 解题报告

    AtCoder Beginner Conest 284 解题报告 \(\text{By DaiRuiChen007}\) \(\text{Contest Link}\) A. Sequence of ...

  2. swift中cocoapods问题

    设置完Podfile后,pod install出现   终端   pod repo add master https://github.com/CocoaPods/Specs.git 出现如下提示   ...

  3. 【公式详解】【优秀论文解读】EDPLVO: Efficient Direct Point-Line Visual Odometry

    前言 多的不说哈 2022最佳优秀论文 来自美团无人机团队 作者提出了一种使用点和线的高效的直接视觉里程计(visual odometry,VO)算法-- EDPLVO .他们证明了,2D 线上的 3 ...

  4. Ubuntu 22.04 GCC Arm 12.2.rel1编译 DAPLink

    ARMmbed / DAPLink 项目 仓库地址 https://github.com/ARMmbed/DAPLink Arm Mbed 应该属于Arm的机构或者是Arm资助的机构. 常用的 DAP ...

  5. Sundial(一)

    Sundial 源码梳理 - v2.5.6 代码目录一览 通过入口点说明 实现IServiceCollection,并返回IServiceCollection(Extensions/ScheduleS ...

  6. 如何在WSL下交叉编译openwrt

    首先我们需要准备一个大小写敏感的文件夹. 然后拉取代码,并且执行代码的先决条件脚本. 注意,如果过程中某项条件不符,你可能要临时修复. 假如下图的组件判定失败(即出现ok=>fail) 那么你就 ...

  7. ‘mongo‘不是内部或外部命令,也不是可运行的程序或批处理文件

    出现问题原因: MongoDB环境变量未配置 解决办法: 1)右击我的电脑-->属性,进入系统属性界面,点击如下图所示位置的[高级系统设置],在弹窗的[系统属性]的[高级]选项卡右下角点击[环境 ...

  8. 如何优化线上WebAssembly

    如何优化线上WebAssembly WebAssembly部署使用 HTTPS : 为什么?我可以通过一个案例查看 ,下面我们会通过masa docs站点进行测试 打开 http://docs.mas ...

  9. async异步编程屏蔽凡人

    为提高效率与增加逼格,墙裂建议引入async异步编程,这不比基于threading的线程.基于multiprocessing的进程香?这些大家伙太重量级了,代码又啰里啰唆的一点也不pythonic,只 ...

  10. [POI2014]HOT-Hotels 加强版

    长链剖分优化 \(dp\) 模板 不过这 \(dp\) 真毒 \(\text{Code}\) #include <cstdio> #define RE register #define I ...