Symbol
Symbol简介
ES6引入了一种新的原始数据类型 symbol,表示独一无二
的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。
Symbol特点
- Symbol的
值是唯一
的,用来解决命名冲突的问题 - Symbol值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
Symbol创建
- Symbol()创建
格式:let s = Symbol()
括号内可以传递字符串做参数,但是只是起一个标识作用,不能为赋值起作用。
创建的每一个 Symbol 值都是唯一且不同的。 - Symbol.for()创建
格式:let s = Symbol.for()
括号内可以传递字符串做参数,起标识作用,与Symbol()不同的是,如果两个Symbol.for()的参数一样,那么他们的 Symbol 值也是一样的。
// 创建symbol
let s = Symbol()
console.log(s,typeof(s))
let s2 = Symbol('yang')
let s3 = Symbol('yang')
// Symbol()中传的值表示为谁设置,只是起一个标识作用
console.log(s2,typeof(s2))
console.log(s2===s3)//false
// 每一个Symbol()都是唯一且不同的的
// Symbol.for()创建
let s4 = Symbol.for('yang')
let s5 = Symbol.for('yang')
console.log(s4,typeof(s4))
console.log(s4===s5)//true
输出:
Symbol创建的值是唯一的但是我们是看不到的,它只能显示 Symbol(参数)
,显示不了具体值
- symbol不能与其他数据做运算,比较也不可以
eg:下面这些运算都是不可以的
let s = Symbol()
console.log(s,typeof(s))
let result1 = s + 100;
let result2 = s * 100;
let result3 = s + 'string';
let result4 = s + s;
js数据类型小结(7种)
number,string,object,boolean,null,undefine,symbol
symbol的应用
- 给对象添加属性或方法
场景:如果对象的属性结构非常乱,我们不能确定一个变量名是否存在,如果想要添加新的属性和方法,为了防止重名,属性名就很难确定,这时候我们就可以使用symbol。
法一:添加独一无二的属性——对象定义完添加
let game = {
name:'俄罗斯方块',
up:'上',
down:'下'
}
let methods = {
up:Symbol(),
down:Symbol()
}
game[methods.up] = function (){
console.log('改变形状')
}
game[methods.down] = function (){
console.log('快速下降')
}
console.log(game)
这样添加的up和down方法就是独一无二的了。
法二:添加独一无二的属性——对象定义时添加
let game = {
name:'俄罗斯方块',
[Symbol('up')]:function(){
console.log('改变形状')
},
[Symbol('down')]:function(){
console.log('快速下降')
}
}
console.log(game)
Symbol内置值
除了定义自也使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
Symbol的内置值实际上就是symbol的属性:
属性 | 含义 |
---|---|
Symbol.haslnstance | 当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法 |
Symbol.isConcatSpreadable | 对象的Symbol.isConcatSpreadable属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。 |
symbol.unscopables | 该对象指定了使用with关键字时,哪些属性会被with环境排除。 |
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.species | 创建衍生对象时,会使用该属性 |
symbol.属性
整体有作为对象的属性,通过对这些属性的设置来改变对象在特定场景下的设置。
- Symbol.haslnstance
<script>
class Person{
// 有自己的执行场景,在特定的实际进行执行
static[Symbol.haslnstance](param){
console.log("检测类型")
return false
}
}
let o = {}
console.log(o instanceof Person)
// 使用instanceof触发 static[Symbol.haslnstance](param),进行调用,该函数的返回值就是o instanceof Person的结果
</script>
- Symbol.isConcatSpreadable
表示数组合并的时候是否可以展开:
isConcatSpreadable = false 表示不可以展开
isConcatSpreadable = true 表示可以展开
eg:
const arr = [1,2,3]
const arr2 = [4,5,6]
arr2[Symbol.isConcatSpreadable] = false
console.log(arr.concat(arr2))