ES6中新增数据类型Symbol

Symbol

ES6中新增的原始数据类型symbol,表示独一无二的值,符号Symbol(符号描述) 来创建的
可以给对象新增私有属性,只能在对象内部进行访问
Symbol 值作为属性名时,该属性是公开属性,不是私有属性

特点

  • 没有字面量的写法
  • 不能new
  • 新的数据类型,typeof返回的是symbol
console.log(typeof(Symbol())) //'symbol'
  • 每次去调用Symbol函数得到的符号永远不会相等,不管符号描述是否相同,也不管是否有符号描述
let a = Symbol('123');
let b = Symbol('123');
console.log(a, b);
console.log(a === b) // false
  • 符号可以被作为对象的属性名使用,属性名叫符号属性,保证不会出现同名的属性,可防止某一个键被不小心改写或者覆盖
const mysyb = Symbol();
const obj = {
	a : 1,
	[mysyb] : 'hello' 
};
console.log(obj[mysyb]) //hello   注意:Symbol 值作为对象属性名时,不能用点运算符。
  • 符号属性不能被枚举,在for...infor...of循环中,不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回
const mysyb = Symbol();
const obj = {
	a : 6,
	b : 9,
	[mysyb] : 'hello' 
};
console.log(obj)
for(let pro in obj){
	console.log(pro); //a b
}
console.log(Object.keys(obj)) //["6", "9"]
console.log(Object.getOwnPropertyNames(obj)) //["6", "9"]
  • 可以通过设计,让外面无法访问到
  • 符号类型无法被隐式转换,数学运算,字符串拼接都是不行的,可以进行内部的显式转换 console.log的输出

Symbol.hasInstance

class Fun{
	[Symbol.hasInstance](arr) {
		return arr instanceof Array;
	}
}
const fun = new Fun();
console.log([1, 6, 9] instanceof fun) // true

Symbol.isConcatSpreadable 会对数组的方法产生影响

const arr1 = [1, 6, 9];
const arr2 = ['a', 'b'];
const result = arr1.concat(arr2, 'c');
console.log(result);	// [1, 6, 9, "a", "b", "c"]
console.log(arr1[Symbol.isConcatSpreadable])	//undefined   Symbol.isConcatSpreadable默认等于undefined
const arr1 = [1, 6, 9];
const arr2 = ['a', 'b'];
arr1[Symbol.isConcatSpreadable] = false;
const result = arr1.concat(arr2, 'c'); 将两个数组拆分链接成新的数组
console.log(result);

在这里插入图片描述
上例中为false时不展开,表明数组的默认行为可展开,默认值为true

Symbol.toPrimitive
Number:该场合需要转成数值
String:该场合需要转成字符串
Default:该场合可以转成数值,也可以转成字符串

	const obj = {
		[Symbol.toPrimitive](value){
			switch (value) {
				case'number':
					return 3;
				case'string':
				 	return '呀';
				case'default':
				 	return 'default';
				default:
				 	throw new Error('错啦');
			}
		}
	}
	obj + 3 //"default3"
	obj * 3 //9
	obj == 'default' // true
	String(obj) // "呀"

Symbol.toStringTag 可以影响Object.prototype.toString的返回值

class Person{
	[Symbol.toStringTag] = 'Person'
}
const person = new Person()
console.log(person);
const arr = [1, 6, 9];
console.log(Object.prototype.toString.call(person))

在这里插入图片描述
如有错误,请指正,谢谢!

发布了25 篇原创文章 · 获赞 1 · 访问量 599

猜你喜欢

转载自blog.csdn.net/qq_41238274/article/details/105256030