ES6入门之Symbol

ES5对象属性名都是字符串容易造成属性名的冲突。

eg:var a = { name: ‘lucy‘};

a.name = ‘lili‘;这样就会重写属性

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

重新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

这里新添加了一种:Symbol

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();

s1 === s2 // false

// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");

s1 === s2 // false

Symbol值不能与其他类型的值进行运算

作为属性名的Symbol

var mySymbol = Symbol();

// 第一种写法
var a = {};
a[mySymbol] = ‘Hello!‘;

// 第二种写法
var a = {
  [mySymbol]: ‘Hello!‘
};

// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: ‘Hello!‘ });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

注意,Symbol值作为对象属性名时,不能用点运算符。

var a = {};
var name = Symbol();
a.name = ‘lili‘;
a[name] = ‘lucy‘;
console.log(a.name,a[name]);             //lili,lucy

Symbol值作为属性名时,该属性还是公开属性,不是私有属性。

这个有点类似于java中的protected属性(protected和private的区别:在类的外部都是不可以访问的,在类内的子类可以继承protected不可以继承private)

但是这里的Symbol在类外部也是可以访问的,只是不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()返回。但有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名

Symbol.for(),Symbol.keyFor()

Symbol.for机制有点类似于单例模式,首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了。

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

s1 === s2 // true

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建

var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

内置的Symbol值

有11个方法,具体可以查看http://es6.ruanyifeng.com/#docs/symbol

时间: 2024-08-21 22:49:17

ES6入门之Symbol的相关文章

ES6中的Symbol类型

前面的话 ES5中包含5种原始类型:字符串.数字.布尔值.null和undefined.ES6引入了第6种原始类型--Symbol ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个他人提供的对象,想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突.如果有一种机制,保证每个属性的名字都是独一无二的,这样就从根本上防止了属性名冲突.这就是ES6引入Symbol的原因,本文将详细介绍ES6中的Symbol类型 创建 Symbol 值通过Symbol函数生成.这就是说,

Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)

1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa-router.mysql 2.课程亮点 1.项目前后端分离开发 Vue+koa2开发一款全栈小程序 2.完整流程,一步不少 注册小程序账号,前后端开发,打包,正式上线 2.小程序环境搭建 1.后台地址: https://mp.weixin.qq.com/ 2.文档地址: https://develo

ES6入门之let和const命令

前言 大家好,我是一只流浪的kk,当你看到这边博客的时候,说明你已经进入了ES6学习的领域了,从本篇博客开始,我将会将自己学习到ES6的相关知识进行整理,方便大家参考和学习,那么我将带你进入第一节的内容学习let和const命令,本篇博客从三个方面进行全方位解析. let命令 首先我们需要学习的是let命令的使用,这个使用非常简单,它其实也是声明变量的一种方式,和var相比我把它的特点总结了如下四点,一起来看看吧! (1):基本用法 <!DOCTYPE html> <html> &

ES6入门之变量的解构赋值(二)

前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进一步深入了解ES6中的相关语法,毕竟未来ES6是主流. 本章目标 学会数组的解构赋值 学会对象的解构赋值 学会字符串的解构赋值 学会数值和布尔值的解构赋值 学会函数参数的解构赋值 学会解构赋值的用途 本人对解构赋值的理解:模式匹配,匹配成功获取值,匹配不成功则为undefined,好比开心消消乐一样

ES6入门十二:Module(模块化)

webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相互加载 模块循环加载 一.webpack4打包配置babel7转码ES6 1.webpack.config.js 在webpack中配置babel转码其实就是在我之前的webpack配置解析基础上添加babel的加载器,babel的具体转码配置在之前也有一篇详细的博客做了解析: webpack安装与

ES6入门九:Symbol元编程

JS第七种数据类型:Symbol Symbol的应用场景 11个Symbol静态属性 Symbol元编程 一.JS第七种数据类型:Symbol 在ES6之前的JavaScript的基本数据类型有undefined.null.boolean.number.string.object,现在Symbol作为第七种基本数据类型.翻译symbol这个单词就是“符号,标志”的意思,顾名思义Symbol的应用场景也就离不开唯一性,想想“符号.标志”都是用来干嘛的?不就是用来标记特定事物的符号嘛,在程序中用来作

es6入门教程完整版

ECMAScript 6入门 <ECMAScript 6入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript 6新引入的语法特性. 作者:阮一峰 授权:署名-非商用许可证 Summary ECMAScript 6入门 ECMAScript 6简介 let和const命令 变量的解构赋值 字符串的扩展 正则的扩展 数值的扩展 数组的扩展 函数的扩展 对象的扩展 Symbol Set和Map数据结构 Proxy和Reflect Iterator和for...of循环 Gen

ES6入门系列三(特性总览下)

0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --Chrome测试不可用 在ES6中,有class的概念,不过这只是语法糖,并没有解决模块化问题.Module功能则是为了解决模块化问题而提出的. 我们可以使用如下方式定义模块: 11_lib.js文件内容 // 导出属性和方法 export var PI = 3.1415926; export fun

《深入理解ES6》之Symbol

ES6在原有的5中原始类型:字符串.数字型.布尔型.null和undefined的基础上,引入了一种原始类型Symbol(可以通过typeof检测变量是否为Symbol类型). Symbol的使用方法 所有使用可计算属性名的地方,都可以使用Symbol. let firstName=Symbol("first name"); let person={ [firstName]:"jia" }; Object.defineProperty(person,firstNam