Symbol原始的数据类型和string, boolean,null,undefined,number一样,是JS第七种数据类型
//创建Symbol
const symbol = Symbol() //symbol只能用函数Symbol来创建,而且不能用new 可以有参数,用来区分每个symbol;
typeof symbol //'symbol';
//只能显试的转化
String(symbol) ==="Symbol()" //此处是字符串;
Boolean(symbol) === true; //
//不能在转为数字
Number(symbol) //报错
//不能隐式的转化
symbol + 'this is srging' //报错
作为对象的的属性名称
主要用在可计算的属性名称,即使带有中括号的属性名称;一般是私有不可以遍历的属性
//对象的属性都是字符串
var obj = {
name : 'obama',
"current age" : 77 //不能在使用点号调用
[skin] : 'black' //报错的写法或者用来计算的属性名称,
};
obj.name === obj['name'] //true
obj.name = 'bush' //覆盖前面的属性‘obama'
var ss = Synbol();
var newObj ={
name :'obama',
[ss]:34 //如果没有中括号,此处就是一个字符串
}
obj[ss] = 34 //两种写法都可以,但是不能用点号
//作为属性,不能用for in for of 等常规的遍历方法,遍历到的
//只能用Object.getOwnPropertySymbols()方法返回一个数组;也可以用新的方法 Reflect.ownKeys();
let obj ={
[Symbol('test')] : 'the symbol',
test : 'the string'
}
Symbol() 和Symbol.for() 参数都是字符串,后者用来生成相同的symbol;
var s = Symbol('34'); ///每次调用都返回新的值,
var ss = Symbol.for('34'); //每次调用先检查全局是否有,没有在返回新的值
var sss = Symbol.for('34');
s ===ss //false;
ss ===sss //true;
//Symbol.keyFor()//用来返回Symbol.for()的参数值,也就是已经生成的,没有的话就Undefined;
var v = Symbol('name');
var vv = Symbol('the name');
Symbol.keyFor(vv) ->'the name';
Symbol.keyFor(v) ->undefined; //访问一个没有定义的symbol会报错
获取Symbol属性的方法
const symbol = Symbol();
const obj = {
[symbol]:'this is symbol',
name :'obama'
}
Object.keys()
Object.getOwnPropertyNames()
//以上的方法都不能获取私有的symbol的属性
Object.getOwnPropertySymbols() //只有此方法可以获取值
ES6开放11个内部方法的操作
1,Symbol.hasInstance 执行instanceof 调用的方法
在CHROME中查看,函数的的继承Function.prototype中增加的方法Symbol(Symbol.hasInstance)
function Mya(){
};
Object.defineProperty(Mya,Symbol.hasInstance,{
value :'this is test ' //此处是描述属性特性值value
})
var s = new Mya();
s instanceof Mya //一般的写法
Mya[Symbol.hasInstance](s) //作为方法直接调用
2,Symbol.match,replace,serch,split方法
var str = 'abcdefg';
var reg =/ab/g;
str.match(reg); //['ab']
str.replace('cd',reg)//'ababefg'
//可以使用一个对象保存这些属性,随后直接作为这些方法的参数
const obj ={
[Symbol.search]:'return "the test"'
}
str.search(obj)
3,Symbol.unscopables使用和废除的with语句有关,作为数组对象的新方法,暂做了解
4,Symbol.toPrimative,toStringTag重新定义Object对象的基本值
var obj = {
name : 'obama'
};
var str = 'sssss';
//对于大多数对象来说,如果要执行一些原始值操作,一般会调用valueOf()和toString();返回初始值
5,Symbol.isConcatSpreadable顾名思义concat是否可以展开
var arr1 = [1,2,3,4];
var arr2 = ['a','b','c','d'];
arr1.concat(arr2) //返回新的数组[1, 2, 3, 4, "a", "b", "c", "d"];
arr1.concat(arr2,null,null,null) // [1, 2, 3, 4, "a", "b", "c", "d", null, null, null]
//对于concat的参数如果是数组就自动展开作为单独的存在,
arr2[Symbol.isConcatSpreadable] = false;
arr1.concat(arr2,null,null,null) //[1, 2, 3, 4, Array(4), null, null, null]没有展开
//类似数组的对象1,变量是数字的属性,不是的话,就是空的值和length的属性(必须)作为数组元素的个数如:
var obj = {
a : 'a',
3 : 'a', //数字键会在数组里的位置
b : 'b',
2 : 'b',
length :6, //影响添加数量,多余的是undefined
[Symbol.isConcatSpreadable] : true
}
var ar = [1,'aa'];
ar.concat(obj) //[1, "aa", empty × 2, "b", "a", empty × 2]
//此属性是一个可选属性,不在任何的对象里,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。