//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"
symbol的api总结
最新推荐文章于 2022-06-07 21:36:31 发布