ES6新特性——symbol数据类型

发布于:2022-12-25 ⋅ 阅读:(671) ⋅ 点赞:(0)

一、Symbol的介绍和创建

ES6引入了一种新的原始数据类型symbol,表示独一无二的值;给对象添加属性和方法的

它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。

Symbol特点:

1)Symbol的值是唯一的,用来解决命名冲突的问题

2)Symbol值不能与其他数据进行运算或比较

3)Symbol定义的对象属性不能使用for...in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名。

//创建Symbol
let s1 = Symbol();
console.log(s1,typeof s1); //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

Symbol值不能与其他数据进行运算或比较:

let s = Symbol();

let result = s + 100; //报错
let result = s > 100; //报错
let result = s + s  //报错

补充:JavaScript的七种基本数据类型:string number boolean null undefined object symbol ;

也可以这样快速记忆:USONB(You are so NB)

//  u undefined

//  s string symbol

//  o object

//  n null numbel

//  b boolean

二、对象添加Symbol类型的属性

需求:向对象game中添加方法up down

但是如果直接添加game.up = function(){...},担心game对象中已有这个属性,所以可以添加symbole类型的属性,下面是添加symbol类型属性的代码:

方法一:

let game = {
    name: '玛利亚',
    up(){
    console.log('向上')
   },
    down(){
    console.log('向下')
  }
}
//声明一个对象
let methods = {
    up:Symbol(),
    down:Symbol()
}

game[methods.up] = function(){
    console.log("我可以改变形状")
}
game[methods.down] = function(){
    console.log("我可以快速下降")
}

console.log(game);

看结果:

方法二:

let youxi = {
    name:"狼人杀",
    [Symbol('say')]:function(){
      console.log("我可以发言")
  },
    [Symbol('zibao')]:function(){
      console.log("我可以自爆")
  }
}

console.log(youxi)

 看结果:

这样就能避免对象属性命名冲突的问题!!

三、Symbol内置值

除了定义自己使用的Symbol值以外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。

下面简单举个例子来讲:

class Peson{
    static [Symbol.hasInstance](params){
      console.log(params);
      console.log("我被调用了,被用来检测类型了")
      return false
  }
}

let o = {}

console.log(o instanceof Peson);

 当Penson被检测类型时,就是使用instanceof时,就会调用Symbol的hasInstance方法;并且将检测对象o参数传入hasInstance函数中,即代码中的params;检测的结果就是hasInstance方法的执行结果;

再举个例子:

const arr = [1,2,3];
const arr2 = [4,5,6];
arr2[Symbol.isConcatSpreadable] = false;
console.log(arr.concat(arr2));

 从代码中可以看出symbol的isConcatSpreadable方法的设置,可以让数组不能直接合并;

总结:以上举了symbol的两个内置值的例子,也不难看出hasInstance、isConcatSpreadable是symbol的自带的方法属性。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到