ES6-symbol

ES6

什么是ES6?ES6和js的关系
概念:JS是由ES(ECMAScript)DOM(浏览器文档对象)BOM(浏览器对象模型)组成

ES6中的类型-symbol

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它属于 JavaScript 语言的原生数据类型之一,其他数据类型是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、大整数(BigInt)、对象(Object)。

Symbol个人的理解概念

1. Symbol作为属性名时不重复
当Symbol作为属性名的时候,每个Symbol都表示的时独一无二的值,就保证了不会出现重名的情况。这就是说,现在的对象可以有两种属性名,一种时ES6中的Symbol创建的名称,一种时字符串类型。

在JS中,对象的属性名字只能是 String型 和 Symbol(es6中),如果属性的名字不是这两种类型的话,就会自动转成字符串String型。

		let sy1 = Symbol();
		let sy2 = Symbol();
		//后台打印false,sy1不等于sy2
		console.log(sy1===sy2);

2.Symbol()函数后参数有什么用
let s = Symbol(’red‘);
(如果不加上参数,你在后台看到的Symbol属性名都是Symbol(),不利于区分,所以可以在括号内填入一个参数对你创建的这个Symbol属性名进行描述)

		let sy1 = Symbol("color");
		let sy2 = Symbol("fruit");
		let obj = {};
		obj[sy1] = "red";
		obj[sy2] = "apple";
		console.log(obj);

基本用法

一.Symbol()作为属性名时的创建方法

		let sy1 = Symbol("color");
		let sy2 = Symbol("fruit");
		//第一种方法
		let obj1 = {};
		obj1[sy1] = "red";
		obj1[sy2] = "apple";
		console.log(obj1);
		// 第二种方法
		let obj2 = {
			[sy1] : "red",
			[sy2] : "apple"
		}
		console.log(obj2);
		// 第三种方法
		let obj3 = {};
		Object.defineProperty{obj3,sy1,(value:'red')};
		Object.defineProperty{obj3,sy2,(value:'apple')};
		//第四种方式
		Symbol.for();//应该也算一种创建方式吧,先在全局中搜索,没有则创建

二.由于每个symbol的值都是不相等的,所以symobol作为对象的属性名,可以保证不重名。

三.symbol作为属性名时,不能像往常一样用对象点上属性名。要用方括号 [ ]。

let name = Symbol();
let syObject = {
			'name':'lzy',
			[name]:'lzy'
		};
		之前学习直接对象.属性名获取里面的值
		console.log(syObject.name);//打印lzy
		但是symbol作为对象属性名时要用方括号[]
		console.log(syObject[name]);//打印lzy

四.属性名的遍历
Symbol 值作为属性名,遍历对象的时候,该属性不会出现在for…in、for…of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()返回。
使用以下方式可以取到对象中

  • Object.getOwnPropertySymbols( 对象名 ) //只能取到以Symbol作为属性的值
  • Reflect.ownKeys( 对象名 ) //会取到所有对象中的属性名(包括Symbol)

五.Symbol属性名和值的查询

  • Symbol.for()

借鉴作者阮一峰,很详细
有时,我们希望重新使用同一个 Symbol 值,Symbol.for()方法可以做到这一点。它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。
Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如果不存在才会新建一个值。比如,如果你调用Symbol.for(“cat”)30 次,每次都会返回同一个 Symbol 值,但是调用Symbol(“cat”)30 次,会返回 30 个不同的 Symbol 值。

  • Symbol.keyFor()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值