symbol的api总结

 //symbol
//1.字符串作为参数
var s1=Symbol("foo")
var s2=Symbol("bar")
console.log(s1,"s1")//Symbol("foo")
console.log(s2,"s2")//Symbol("bar")

//2.对象作为参数
var obj={
   toString:function(){
       return "abc"
   }
}
var s3=Symbol(obj)
console.log(s3,"s3")//Symbol(abc)

//3.相同参数Symbol的返回值不相同
var s4=Symbol("a")
var s5=Symbol("a")
var s4=Symbol()
var s5=Symbol()
console.log(s4===s5,"s4==s5")//false

//4.symbol值不能与其他类型的值进行运算否则报错
var sym=Symbol("my symbol")
console.log("you are "+sym)
typeerro Cannot convert a Symbol value to a string
//无法将符号值转换为字符串

//5.显示的转为字符串
var symstr=sym.toString()
console.log("you are"+symstr)
you areSymbol(my symbol)

//6.symbol可以转为布尔值,但是不能转为数值
console.log(Boolean(sym)) //true 默认为true

//7.作为对象属性名的symbol
var mySymbol=Symbol()
var a={}
Object.defineProperty(a,mySymbol,{value:"hello"})
console.log(a[mySymbol])//hello
console.log(a[mySymbol],mySymbol===mySymbol)hello true

//8.Symbol作为对象属性名时不可以用点运算符
var mySymbolTwo=Symbol()
var a={}
a.mySymbolTwo="hello"
console.log(a[mySymbolTwo],"mySymbolTwo")//undefined
console.log(a["mySymbolTwo"],"mySymbolTwo")//hello

//9.在对象中使用symbol时必须放在[]内
var s=Symbol()
let obj={
    [s](){
        return "a"
    }
}
console.log(obj[s](123),"obj")//a

//10.symbol定义常量
let levels={
    DEBUG:Symbol("debug"),
    INFO:Symbol("info")
}
console.log(levels.DEBUG,"debug")

//11.消除魔术字符串
const shapeType={
    triangle:Symbol(),
    name:Symbol()
}
function getArea(shape,option){
    var are=0;
    switch(shape){
        case shapeType.triangle:
            are=.5*option.width*option.height;
            break
        case shapeType.name:
            are=10
            break
    }
    return are
}
console.log(getArea(shapeType.name,{width:100,height:100}))//500

//12获取属性以及属性的遍历
  var obj={}
  var a=Symbol("a")
  var b=Symbol("b")
  obj[a]="hello"
  obj[b]="worde"
  var objectSymbols=Object.getOwnPropertySymbols(obj)
  console.log(objectSymbols,"objectSymbols")// [Symbol(a), Symbol(b)] 

/*
 *  Reflect.ownKey返回所有类型的键名包括常规键名与symbol()
*/
 let obj={
     [Symbol("my_key")]:1,
     enum:2,
     nonEnum:3
 }
 console.log(Reflect.ownKeys(obj),"Reflect")

/*
*   class 的构造运用symbol
*/
var size=Symbol("size")
class Collection{
    constructor(){//构造方法
        this[size]=0
    }
    add(itme){
      this[this[size]]=itme
      this.size++
    }
    static sizeOf(instance){
        return instance[size]
    }
}
var x=new Collection()
console.log(Collection.prototype)//constructor与add与
console.log(Collection===Collection.prototype.constructor)
// constructor 类本身就指向构造函数

/*
 * es5的构造函数constructor不可枚举
*/
var Point=function(x,y){}
Point.prototype.toString=function(){}
console.log(Object.keys(Point.prototype),"Point")
    // ["toString"]0: "toString"length: 1__proto__: Array(0)   
     //constructor不可枚举
console.log(Object.getOwnPropertyNames(Point.prototype),"Point")
    // ["constructor", "toString"] "Point"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值