symbol的特点
基本使用
创建symbol:
let s = Symbol()
console.log(s,typeof s);
// Symbol() 'symbol'
let s2 = Symbol("小刘同学")
let s3 = Symbol("小刘同学")
console.log(s2==s3);
// false
// /Symbol.for 创建
let s4 = Symbol.for("小刘同学")
let s5 = Symbol.for("小刘同学")
console.log(s4==s5);
// true
不能与其他数据进行运算
let result = s+100
let result = s > 100
let result = s + s
// 报错: Cannot convert a Symbol value to a numberat
七种数据类型 USONB
u undefined s string Symbol o object n null number b Boolean
- 1
- 2
- 3
- 4
- 5
Symbol创建对象属性:
let block = {
name:"俄罗斯方块",
up:function(){console.log("改变形状");},
down:function(){console.log("向下移动");}
}
// 我们要往game对象里面添加方法,但是怕game对象中已经存在同名的方法,所以我们这是就可以使用Symbol
let methdos = {
up:Symbol(),
dawn:Symbol()
}
block[methdos.up]=function(){
console.log("我可以改变形状");
}
block[methdos.dawn]=function(){
console.log("我可以快速下降");
}
console.log(block);
// {name: '俄罗斯方块', up: ƒ, down: ƒ, Symbol(): ƒ, Symbol(): ƒ}
// 方法二:
let game = {
name:"狼人杀",
[Symbol("say")]:function(){
console.log("可以开始发言");
},
[Symbol("zibao")]:function(){
console.log("自爆");
}
}
console.log(game);
// object
调用方法:
let say = Symbol("say")
let youxi1 = {
name:"狼人杀",
[say]: function(){ console.log("我可以发言") },
[Symbol('zibao')]: function(){ console.log('我可以自爆'); }
}
youxi1[say]();
// 我可以发言
Symbol内置值:
除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法。可以称这些方法为魔术方法,因为它们会在特定的场景下自动执行;
内置Symbol的值 | 调用时机 |
---|---|
Symbol.hasInstance | 当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法 |
Symbol.isConcatSpreadable | 对象的 Symbol.isConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。 |
Symbol.species | 创建衍生对象时,会使用该属性 |
Symbol.match | 当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。 |
Symbol.replace | 当该对象被 str.replace(myObject)方法调用时,会返回该方法的返回值。 |
Symbol.search | 当该对象被 str. search (myObject)方法调用时,会返回该方法的返回值。 |
Symbol.split | 当该对象被 str. split (myObject)方法调用时,会返回该方法的返回值。 |
Symbol.iterator | 对象进行 for…of 循环时,会调用 Symbol.iterator 方法,返回该对象的默认遍历器 |
Symbol.toPrimitive | 该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。 |
Symbol. toStringTag | 在该对象上面调用 toString 方法时,返回该方法的返回值 |
Symbol. unscopables | 该对象指定了使用 with 关键字时,哪些属性会被 with环境排除 |
特别的: Symbol
内置值的使用,都是作为某个对象类型的属性去使用;
演示:
class Person{
static [Symbol.hasInstance](param){
console.log(param);
console.log("我被用来检测类型了");
return false;
}
}
let o = {};
console.log(o instanceof Person);
const arr = [1,2,3];
const arr2 = [4,5,6];
// 合并数组:false数组不可展开,true可展开
arr2[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr2));
// 运行结果数组没有展开