ES6-Symbol

Symbol

Symbol简介

ES6引入了一种新的原始数据类型 symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似字符串的数据类型。

Symbol特点

  1. Symbol的值是唯一的,用来解决命名冲突的问题
  2. Symbol值不能与其他数据进行运算
  3. 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))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值