js ES6新数据类型 Symbol - Kaiqisan

js ES6新数据类型 Symbol

ヤッハロー、Kaiqisanすうう、一つふつうの学生プログラマである,这一篇文章又是全新的内容,咱来聊聊ES6的新数据类型Symbol

这个是es6推出的继 undefined null boolean number string object后推出的新的数据类型

在输入数据的时候,尤其是学生或者用户管理的时候,我们不可避免会遇到同名的情况,如果按照以前的写法的话,后面的重名参数会覆盖前面的重名参数,会造成不必要的麻烦。

const list [
	'kaiqisan': {
    
     id: 10001, gender: "male" },
	'lily': {
    
     id: 10002, gender: 'female' },
	'lily': {
    
     id: 10003, gender:'female' },
]
// 在打印输出的时候,后面的'lily'会吧前面的'lily'覆盖掉

在这种尴尬的情况下,我们便引入了symbol.

num = Symbol(12)// 定义一个Symbol数据类型并取值,(控制台输出为 Symbol(12))
num2 = Symbol(12)
// 由于Symblo数据类型的唯一性,num === num2 和 num == num2 都是false的

面对上面的对象重名的尴尬,我们就可以使用Symbol就可了

const list {
    
    
	'kaiqisan':{
    
    id:10001,gender:"male"},
	[Symbol('lily')]:{
    
    id:10002,gender:'female'},
	[Symbol('lily')]:{
    
    id:10003,gender:'female'},
}

于是就不会产生冲突了

这个Symbol拥有两个方法

Symbol.for(val): 更根据Symbol的值去查找Symbol注册表中是否有该值,如果有,就返回该值,如果没有就新创建一个新的Symbol并返回

let a = Symbol('app')
let b = Symbol('app')
console.log(Symbol.for('app')); // Symbol(app)
let a = Symbol('app')
let b = Symbol('app')
console.log(Symbol.for('app2')); // Symbol(app2) 是临时创建的

所以也有

Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol
Symbol.for("bar") === Symbol.for("bar"); 
// true 第一个Symbol.for("bar")创建一个新的Symbol数据,
// 第二个Symbol.for("bar")查找到之前那个已经被注册的键为'bar'的Symbol数据,并直接引用返回,
// 由于两者的储存地址是一致的,所以返回true。

Symbol.keyFor(val): 返回已经被登记的Symbol数据的

let s1 = Symbol.for("app");
Symbol.keyFor(s1) // "app"

注意点1

由于这个数据类型是新的数据类型,for in循环遍历就无法获取相应的数据(也不会报错),无论是直接获取还是使用Object的getOwnPropertyNames都无法获取。

for(key in lists){
    
    
	//无法在console窗口获取Symbol数据
}

就是因为这样,所以在使用JSON.stringify()方法的时候,Symbol会被孤立排除在外的

为了解决这个问题,ES6又引出相应的解决方法

const result = Object.getOwnPropertySymbols(list).map(cons =>list[cons])
//使用getOwnPropertySymbols方法就可以获取Symbol数据,但为了转化成数组,所以使用map方法
//

PS:该方法不会获取非Symbol数据类型的数据

注意点2

Symbol可以与其他数据类型相互转换。但是无法转化到数字类型,这样必报错。

let a = Symbol('app')
console.log(String(a)); // 'Symbol(app)' 是字符串
let a = Symbol('app')
console.log(Number(a)); // 必报错
let a = Symbol('app')
console.log(Boolean(a)); // 永远为 true
let a = Symbol('app')
console.log(Object(a)); // a = { description: 'app' }

总结

Symbol不会被轻易遍历,所以可以作为私有属性在内部使用。

猜你喜欢

转载自blog.csdn.net/qq_33933205/article/details/108025683