ES6--Symbol类型

3 篇文章 0 订阅

ES6–Symbol类型

        ES5中包含5种原始类型:字符串(string)、数字(number)、布尔值(boolean)、null和undefined。ES6中引入了第6种原始类型——Symbol。
        Symbol:表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

1、基本用法

symbol 值通过symbol函数生成。

let s1 = Symbol();//创建了一个symbol的实例
console.log(s1);//Symbol()
console.log(typeof s1);//symbol

symbol函数也可以传递一个字符串参数,参数作用是对symbol类型的描述,便于区分这个symbol是哪一个。

let s1 = Symbol("symbol");
console.log(s1);//Symbol(symbol)
console.log(typeof s1);//symbol

symbol类型的值具有唯一性,是一个独一无二的值,每一个 Symbol 的值都不相等。相同参数 Symbol() 返回的值不相等。

let s1 = Symbol("symbol");
let s2 = Symbol("symbol");
console.dir(s1 == s2);//false
2、使用场景
// 定义一个对象

let symbol=Symbol('address'); //  指定属性名

let obj={name:'jack',age:10};

// 假如我们要向对象里额外加个属性

// obj.address='伏虎路' // 以前的写法,不过假如属性很多的时候,可能会出现属性重复

obj[symbol]='伏虎路' // 这样能保证属性不重复

console.log(obj)

symbol类型的值具有唯一性,由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。

let n = Symbol("uname");
let n2 = Symbol("uname");
let obj1 = {};
obj1[n] = "jack";
obj1[n2] = "rose";
console.log(obj1);//{Symbol(uname): "jack", Symbol(uname): "rose"}
3、配置底层的实现原理
  1. Symbol.hasInstance 影响instanceof运算符的结果
 function A(){}
     Object.defineProperty(A,Symbol.hasInstance,{
         value : function(v){
             console.log(v) //A{}
             return false
         }
     })
     const a = new A()
     console.log(a instanceof A)  //false
  1. Symbol.isConcatSpreadable 会对数组concat方法产生影响
  const arr =[3]
     const arr2 = [4,5,6,7];
     arr2[Symbol.isConcatSpreadable] = false;
     const result = arr.concat(99,arr2)
     console.log(result)  // [3, 99, Array(4)]
  1. Symbol.toPrimitive 对数据类型的转换产生影响
 const obj = {
         a : 1,
         b : 2
     }
     obj[Symbol.toPrimitive] = function(){
         return 123
     }
     console.log(obj + 123)    //246
  1. Symbol.toStringTag 可以影响Object.prototype.toString的返回值
 class Person{
         [Symbol.toStringTag] = "Person"
     }
     const p = new Person()
     console.log(p)      //Person {Symbol(Symbol.toStringTag): 'Person'}
     console.log(Object.prototype.toString.call(p))   //[object Person]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值