文档章节

ECMAScript6 Symbol

罗布V
 罗布V
发布于 2016/10/10 22:53
字数 924
阅读 18
收藏 0

es6之前所有的属性名都是字符串类型,容易造成属性名的冲突。所以在es6新增了一种数据类型Symbol,表示独一无二的值。Symbol并不是一个对象,所以不能通过new的方法进行创建,同时也不能添加属性。

let s=Symbol();
console.log(typeof s)//out:symbol

Symbol与字符串处理

var s1=Symbol('foo');通过字符串进行构造
var s2=Symbol('bar');
console.log(s1)//out:symbol(foo)
console.log(s2)//out:symbol(bar)
console.log(s1.toString())
console.log(s2.toString())

Symbol函数的参数只表示对当前Symbol值的描述,即使两个Symbol的参数相同也并不相等.

var s1=Symbol();
var s2=Symbol();
console.log(s1==s2);//out:flash

var s1=Symbol("foo");
var s2=Symbol("foo");
console.log(s1==s2);//out:flash

Symbol通过Object.getOwnPropertySymbols来返回一个数组 Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名。

Symbol.for(name),接受一个字符串,搜索是否存在着为name的Symbol的对象,如果有返回这个Symbol值,否则创建一个以该字符串为名称的Symbol字符。

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');

s1 === s2 // true

利用Symbol创建单例模式

//mod.js文件
function A(){
    this.foo='hello';
}
if(!global._foo){
    global._foo=new A();
}
module.exports=global._foo;

因为global._foo是可写的对象,一旦其他改写了该对象就会使其他的加载mod.js模块失效

//main.js
var mod=require('./mod.js');
console.log(mod.foo);

下面采用Symbol的方式FOO_KEY本身不可必定,通过Symbol.for可能保证获取到的foo对应的Symbol对象是唯一的。但同样存在着一个问题就是用户一旦清空缓存的时候会重新加载致使该模块失效 。

//mod2.js
const FOO_KEY=Symbol.for('foo');
function A(){
    this.foo='hello';
}
if(!global[FOO_KEY]){
    global[FOO_KEY]=new A();
}
module.exports=global[FOO_KEY];

//main2.js
var a=require('./mod2.js');
global[Symbol.for('foo')]=123;
console.log(global[Symbol.for('foo')]);

属性及方法

属性
Symbol.length
长度属性值为1。
Symbol.name
仅Chrome/v8。返回符号描述。
Symbol.prototype
描述符号构造函数的原型。
众所周知的符号
除了你自己的符号,JavaScript还内建了一些在ECMAScript 5 之前没有暴露给开发者的符号,它们代表了内部语言行为。这些符号可以使用以下属性访问:
迭代 symbols
Symbol.iterator
一个返回一个对象默认迭代器的方法。使用 for...of.
正则表达式 symbols
Symbol.match
一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。使用 String.prototype.match().
Symbol.replace
一个替换匹配字符串的子串的方法. 使用 String.prototype.replace().
Symbol.search
一个返回一个字符串中与正则表达式相匹配的索引的方法。使用String.prototype.search().
Symbol.split
一个在匹配正则表达式的索引处拆分一个字符串的方法.。使用 String.prototype.split().
其他 symbols
Symbol.hasInstance
一个确定一个构造器对象识别的对象是否为它的实例的方法。使用 instanceof.
Symbol.isConcatSpreadable
一个布尔值,表明一个对象是否应该flattened为它的数组元素。使用Array.prototype.concat().
Symbol.unscopables
拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。
Symbol.species
一个用于创建派生对象的构造器函数。.
Symbol.toPrimitive
一个将对象转化为基本数据类型的方法。
Symbol.toStringTag
用于对象的默认描述的字符串值。使用Object.prototype.toString(). 方法
Symbol.for(key)
使用给定的key搜索现有符号,如果找到则返回符号。否则将得到一个新的使用给定的key在全局符号注册表中创建的符号。
Symbol.keyFor(sym)
为给定符号从全局符号注册表中检索一个共享符号键。

© 著作权归作者所有

罗布V
粉丝 13
博文 60
码字总数 47114
作品 0
温州
程序员
私信 提问
ECMAScript6知识点2

1.函数 1.1 参数默认值 注意这个默认参数必须是尾参数,否则会有匹配的问题。 1.2 rest参数列表 同默认值一样是尾参数。 1.3 扩展运算符 扩展运算符也是要有遍历接口的。是rest的逆运算 1.4箭...

明了
2016/06/04
28
0
Node.js进阶教程第五步:用VUE.JS学习ES6-何韬-专题视频课程

Node.js进阶教程第五步:用VUE.JS学习ES6—10085人已学习 课程介绍 全面学习vue.js配置,es6命令,解构赋值,symbol类型,set,weakSet,Map,WeakMap,Iterator遍历器,Generator函数结构,Promi...

pkutao
2016/12/05
0
0
JavaScript基础知识

数据类型 六种基本类型 Undefined Null Boolean Number String Symbol(ECMAScript6新加类型) 一种引用类型 Object 注: 值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们...

woodens
2016/12/22
9
0
针对于ECMA5Script 、ECMAScript6、TypeScript的认识

什么是ECMAScript、什么又是ECMA? Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Ass...

赵_俊明
2016/07/27
947
4
浅谈Javascript模块化开发

*** 自己接触过的几种javascript模块开发,由于水平有限,只能简单谈一谈。 *** 立即执行匿名函数 由于javascript的函数作用域,将模块代码放入立即执行匿名函数中,防止污染全局变量。将需要...

jackzlz
2015/08/17
231
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue warn]: Computed property "activeNames" was assigned to but it has no setter.

在使用 vue,element-ui时,如下代码 <template> <el-form :model="numberValidateForm" ref="numberValidateForm"> <el-form-item> <el-tabs v-model="activeNames" @tab-cl......

牧云橙
11分钟前
2
0
重构-改善既有代码的设计-6.2内联函数

6.2内联函数 动机 本书经常以简短的函数表现动作意图,这样会使代码更清晰易读。但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你充够了该函数的内部实现,使其内容和...

还仙
12分钟前
2
0
Less 混入

混合类似于编程语言中的函数。 Mixins 是一组CSS属性,允许我们将一个类的属性嵌套于另一个类,被嵌入的类可以看作是变量,并且包含类名作为其属性,也就是说我们可以用一个类定义样式然后把...

凌兮洛
15分钟前
3
0
频繁FGC的真凶原来是它

频繁FGC的真凶原来是它 上周排查了一个线上问题,主要现象是CPU占用过高,jvm old区占用过高,同时频繁fgc,我简单排查了下就草草收场了,但是过后我对这个问题又进行了复查,发现问题没有那...

每天晒白牙
15分钟前
3
0
简单的树形菜单如何写

业务需求 数据结构中含有图片、名称、children的树形结构,需要展示出每一级的图片名称和图片,找了些树形图的插件,都没有展示大的图片的,一般都是小图标,就自己试着写一个包含图的简单的...

tianyawhl
17分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部