一:Symbol的基本概述
- ES5对象的属性都是字符串,这容易造成属性名的冲突。而ES6引入类型·Symbol就是从根本上防止属性名冲突。
- 他是javascript的第七个原始数据类型。前六个分别为Undefined,Null,Object,String,Number.Bealean
- 1.对象名可以用字符串或者symbol两种类型。而symbol类型唯一,不会和其他属性名发生冲突。
{
let s = Symbol();
console.log(s); //Symbol()
console.log(typeof s); //symbol
//上述代码表明变量s为symbol类型,并且symbol是原始类型的值,不能使用new命令,且不是对象,
//自然不能添加属性和方法。
}
- 2.Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,身份id
{
var s1 = Symbol('tom');
var s2 = Symbol('jerry');
console.log(s1); //Symbol(tom)
console.log(s2); //Symbol(jerry)
//这样方便我们在控制台进行区分
}
- 3.Symbol参数只是对当前Symbol值的描述,相同参数的Symbol函数的返回值是不相同的。
{
//没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
console.log(s1 === s2); //false
//有参数的情况
var s3 = Symbol('tom');
var s4 = Symbol('tom');
console.log(s3 === s4); //false
}
- 4.symbol值不能与其他类型的值做运算,但是可以显示转换为字符串和布尔值
{
let s = Symbol('tom');
console.log(s.toString()); //"Symbol(tom)"
console.log(Boolean(s)); //true
}
二: 作为属性名的symbol
- 1.由于每一个Symbol值都是不相等的,这意味这Symbol值可以作为标识符用于对象的属性名。
{
let mySymbol = Symbol();
1,第一种写法
let a = {id:1};
a[mySymbol] = 'hello';
console.log(a);
{id: 1, Symbol(): "hello"}
2.第二种写法
let a = {
id:0,
[mySymbol]:'hello'
}
console.log(a);
{id: 0, Symbol(): "hello"}
3.第三种写法
let a = {id:2};
Object.defineProperty(a,mySymbol,{
value:'hello'
})
console.log(a);
{id: 2, Symbol(): "hello"}
}
三:属性名的遍历
这个我的博客里面有对遍历方法的详细解读
symbol类型只有两种方法可以遍历出他的属性名
{
1.Object.getOwnPropertySymbols()
let a = Symbol('a');
let b = Symbol('b');
let obj = {
[a]:'hello',
[b]:'world'
}
let newArray = Object.getOwnPropertySymbols(obj);
console.log(newArray)
(2) [Symbol(a), Symbol(b)]
返回一个数组,成员是当前对象属性为symbol的属性名
2.Reflect.ownKeys()
let a = Symbol('a');
let b = Symbol('b');
let obj = {
[a]:'hello',
[b]:'world',
id:1,
name:'mySymbol'
}
let newArray = Reflect.ownKeys(obj);
console.log(newArray)
(4) ["id", "name", Symbol(a), Symbol(b)]
该方法会返回这个对象的所有自身属性
}
四:Symbol.for() Symbol.keyFor()
{
//symbol生成的都是不同的symbol类型的值
//symbol.for 会在全局检索,如果存在就生成相同的值,不存在才重新创建一个新的变量
console.log(Symbol('foo') === Symbol('foo')); //false
console.log(Symbol.for('foo') === Symbol.for('foo')); //true
//Symbol.keyFOr() 返回一个已经登记的symbol值的key
let s1 = Symbol.for('s1');
let s2 = Symbol('s2');
console.log(Symbol.keyFor(s1)); //s1
console.log(Symbol.keyFor(s2)); //undefined
//因为s1用Symbol.for()登记过了,而s2没有被登记过。
}
关于Symbol的11个基本内置属性,学完了class一起整理.