ES6 Symbol(符号描述)

Symbol是什么

	ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。最大的用法是用来定义对象的唯一属性名。
	Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象
	可以接受一个字符串作为参数,为新创建的 Symbol 提供描述,用来显示在控制台或者作为字符串的时候使用,便于区分。

Symbol的特点

  1. 没有字面量的写法
  2. 新的数据类型,typeof返回的是symbol
  3. 每次去调用Symbol函数得到的符号永远不会相等,不管符号描述是否相同
  4. 符号可以作为对象的属性名使用,这种属性名叫符号属性(Symbol 作为对象属性名时不能用.运算符,要用方括号)
  5. 符号属性不能被枚举
    可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 读取到一个对象的 Symbol 属性

Symbol的基本用法

	const syb1 = Symbol();   //创建了一个符号
	const syb2 = Symbol("asdfsdf");
	const syb3 = Symbol("asdfsdf");
	//是独一无二的
	console.log(syb2 === syb3);//false
	console.log(typeof syb1);//symbol

Symbol.for()

会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

	const a =Symbol('a');
 	const a1 =Symbol.for('a'); // 返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol
 	console.log(a === a1); //  false
  	const a2 =Symbol.for('a');
  	console.log(a1 === a2); //  true

Symbol.keyFor()

Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

	const a =Symbol('a');
	Symbol.keyFor(a);    // undefined
	const a1 =Symbol.for('a'); 
	Symbol.keyFor(a1);    // "a"

Symbol的应用场景

  1. 对象属性名(key)

    	let s_name= Symbol("name");
    	let obj= {
    	    [s_name]: "lilei",
    	    age: 18,
    	    sex:'男'
    	};
    	//查询不到
    	console.log(Object.keys(obj))// ['age','sex']
    	for(let key in obj){
    		console.log(key)  // age sex
    	}
    	Object.getOwnPropertyNames(obj)  // ['age','sex']
    	JSON.stringify(obj)  // {"age":18,"sex":"男"}
    	
    	//可以查询到
    	obj[s_name];//lilei
    	//使用Object的api
    	Object.getOwnPropertySymbols(obj) // [Symbol(name)]
    	//使用新增的反射API
    	Reflect.ownKeys(obj) // ["age", "sex", Symbol(name)]
    	
    
  2. 定义常量

    	const Name = Symbol();
    	const Age = Symbol();
    
  3. 使用Symbol定义类的私有属性/方法

    const speak = Symbol();
    const name= Symbol();
    class Person {
    	constructor(name,type) {
    		this.type = type
    		this[name] = name
    	}
        [speak]() {
        	
             return `${this[name]}喜欢 ${this.type}`
        }
    }
    

Symbol在JS中还有很多应用,可以与很多东西结合使用,比如 迭代器 Iterator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值