es6-symbol数据类型
Symbol
es6中引入了一种新的原始数据类型,Symbol 表示独一无二的值,是类似于字符串的数据类型
特点
- 值是唯一的,用来解决命名冲突的问题
- 值不可以与其他数据类型进行运算
- 定义的对象属性不能使用 for in 循环遍历,但是可以使用 Reflect.ownkeys 来获取对象的所有键名
七种数据类型
- u:undefined
- s:string
- o:object
- n:num
- b:boolean
使用方法
- 创建Symbol
let s = Symbol(); console.log(s, typeof s);
- 括号中的字符串
// 下面括号中的字符串是一个描述字符串,就是一个标志 let s2 = Symbol('lmk'); //括号里面的是一个标志,并不是输出的值 let s3 = Symbol('lmk') //括号里面的是一个标志,并不是输出的值 console.log(s2 === s3); // false
- 通过括号中的字符串得出相同的Symbol值
// 下面创建的,可以通过括号中提供的字符串得出相同的symbol值 let s4 = Symbol.for('lmk'); // 函数对象 console.log(s4, typeof s4); let s5 = Symbol.for('lmk'); console.log(s4 === s5); // true
注意
- 不能和其他数据进行运算
应用
给对象创建属性和方法
定义一个对象
let game = { name: 'lmk', up: function() { console.log('kml'); }, down: function() { console.log('kkk'); } }
声明一个新的对象
// 声明一个对象 let methods = { up: Symbol(), down: Symbol() };
通过Symbol给对象快速添加 up 和 donw 方法
如果不通过这种方法,之前的 up 和 donw 会被覆盖
// 来给game对象快速添加 up 和 down 这个方法
game[methods.up] = function() {
console.log('我可以改变形状');
}
game[methods.down] = function() {
console.log('我可以快速下降');
}
console.log(game); // 可以看到最后添加的两个方法
// 调用的话只需要调用 methods中的方法就可以了
- 在对象中另一种添加方式
let yx = { name: '守望先锋', [Symbol('logo')]: function() { console.log('这个世界需要更多的英雄'); } } console.log(yx); // 调用需要为这个方法定义变量 // 例如 : let logo = [Symbol('logo')] // logo : function() { // console.log('这个世界需要更多的英雄'); // }
内置属性
属性值 | 作用 |
---|---|
Symbol.hasInstance | 用来定义一个构造对象/类如何识别是否是它的实例 |
Symbol.isConcatSpreadable | 用来配置一个数组对象,能否被展开,值为true时可以,值为false时不可以 |
Symbol.iterator | 用来声明一个对象的默认遍历器 会遍历那些可遍历的对象 |
Symbol.match | 定义了该属性后,在执行 *.match(obj)时,会调用这个属性的对应的函数,如果不是函数会报错 |
Symbol.replace | 和match属性类似 在执行string.replace时,会调用这个属性对应的函数,如果不是函数会报错 |
Symbol.search | 定义了该属性的对象 在执行String.prototype.search方法时,会调用Symbol.search指向的函数 |
Symbol.species | Symbol.species指向一个构造函数。创建衍生对象时,会使用该函数返回的属性 |
Symbol.split | 对象的Symbol.split属性,指向一个方法,当该对象被String.prototype.split方法调用时,会返回该方法的返回值 |
Symbol.toPrimitive | 用于声明一个值为函数的属性,当一个对象要转换为一个相应的原始(primitive)值时,会调用该函数,该函数接收一个字符串参数(Number,String,Default),Default是可以转成数值,也可以转成字符串 |
Symbol.toStringTag | 对象的Symbol.toStringTag属性,指向一个方法。在该对象上面调用 |
参考博客 | https://www.jianshu.com/p/497764b785ab |
本博客所有文章是以学习为目的,如果有不对的地方可以一起交流沟通共同学习 邮箱:1248287831@qq.com!