威海做网站的,上海购房网官网,新沂网站设计,网站的页面结构ES6-Symbol 类型 ES5 除类数组对象#xff08;类数组对象名可以为数字#xff0c;对象必须有 length 属性#xff0c;可以用数组下标的方式访问对象属性#xff0c;但不能通过点的方式访问#xff09;外#xff0c;对象属性名都是字符串#xff0c;这很容易造成属性名的…ES6-Symbol 类型 ES5 除类数组对象类数组对象名可以为数字对象必须有 length 属性可以用数组下标的方式访问对象属性但不能通过点的方式访问外对象属性名都是字符串这很容易造成属性名的冲突。而且 JavaScript 是弱类型语言属性名冲突不会报错处于代码执行顺序后面的属性值会覆盖前面的属性值属性值容易被篡改这样对象的属性就不能保证是我们想要的。 ES6 引入了Symbol数据类型很好地解决了对象属性名冲突的问题。 Symbol表示 独一无二的值 它是原始数据类型不能用 new ES6之后JavaScript就有了7种数据类型分别是Number 、String 、Boolean 、null 、undefined 、Object 、Symbol
基本用法 Symbol 函数栈不能用 new 命令因为 Symbol 是原始数据类型不是对象。可以接受一个字符串作为参数为新创建的 Symbol 提供描述用来显示控制台或者作为字符串的时候使用便于区分。
let name Symbol(name);
console.log(name); // Symbol(name);
console.log(typeof name); // symbol特点 Symbol 函数栈不能用 new 命令因为 Symbol 是原始数据类型不是对象 Symbol 表示独一无二的值因此带有相同参数的两个 Symbol 值也不相等
// 没有参数的情况
let name1 Symbol();
let name2 Symbol();name1 name2 // false// 有参数的情况
let name1 Symbol(foo);
let name2 Symbol(foo);name1 name2 // falseSymbol 不能进行隐式类型转换
let name Symbol(foo);
console.log(你好 name);
// 报错Cannot convert a Symbol value to a string(无法将symbol值转换为字符串)console.log(你好${name});
// 报错Cannot convert a Symbol value to a string(无法将symbol值转换为字符串)console.log(name 1);
// 报错Cannot convert a Symbol value to a number(无法将symbol值转换为数值)Symbol 值可以显式转为字符串
let name Symbol(foo);
console.log(String(name)); // Symbol(foo)
console.log(name.toString); // Symbol(foo)Symbol 值不能转化为数字
let name Symbol(foo);
console.log(Number.name);
// 报错Cannot convert a Symbol value to a number(无法将symbol值转换为数值)Symbol 值可以转换为布尔值
let name Symbol(foo);
console.log(Boolean(name)); // true
console.log(!name); // falseSymbol 应用场景 作为对象属性名 用 Symbol 声明的对象名不能用 key.value 的形式获取对象的属性值要用 [ ]原因 1. ES5中对象 .(点) 运算符获取的属性名是字符串 用 key.value 的形式会将属性名识别为字符串新建一个属性名给对象无法和 Symbol 属性区别 2. 方括号中带双引号的属性名表示字符串属性不带双引号的属性名表示 Symbol 属性一次区别二者 let sy Symbol();// 写法 1
let syObject {};
syObject[sy] symbol;
console.log(syObject); // {Symbol(): symbol}// 写法 2
let syObject {[sy]: symbol
};
console.log(syObject); // {Symbol(): symbol}// 写法 3
let syObject {};
Object.defineProperty(syObject, sy, {value: symbol});
console.log(syObject); // {Symbol(): symbol}// 万万不能用点
syObject[sy]; // symbol;
syObject.sy; // undefined
// 因为 syObject.sy syObject[sy]Symbol 值作为属性名时该属性是公有属性不是私有属性可以在类的外部访问。但是不会出现在 for...in、for...of 的循环中也不会被 Object.keys() 、Object.getOwnPropertyNames() 返回。如果要读取一个对象的 Symbol 属性可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
let sy Symbol();
let syObject {};
syObject[sy] symbol;
console.log(syObject); // {Symbol(): symbol}for (let i in syObject) {console.log(i); // 无输出
}Object.keys(syObject); // []
Object.getOwnpropertyNames(syObject); // []
Object.getOwnpropertySymbols(syObject); // [Symbol()]
Reflect.ownKeys(syObject); // [Symbol()]Symbol的方法
Symbol.for()
作用用于将描述相同的 Symbol 变量指向同一个 Symbol 值
let a1 Symbol.for(a);let a2 Symbol.for(a);a1 a2 // truetypeof a1 // symboltypeof a2 // symbollet a3 Symbol(a);a1 a3 // falseSymbol() 和 Symbol.for() 的相同点 它们定义的值类型都为 “Symbol”; Symbol() 和 Symbol.for() 的不同点 Symbol() 定义的值每次都是新建即使描述相同值也不相等Symbol() 定义的值会先检查给定的描述是否已经存在如果不存在才会新建一个值并把这个值登记在全局环境中供搜索Symbol.for() 定义相同描述的值时会被搜索到描述相同则他们就是一个值。
Symbol.keyFor()
作用用来检测该字符串参数作为名称的 Symbol 值是否已被登记返回一个已登记的 Symbol 类型值的 key
let a1 Symbol.for(a);
Symbol.keyFor(a1); // a
let a2 Symbol(a);
Symbol.keyFor(a2); // undefined// a1已经用Symbol.for()登记过因此返回的key为a,而a2没有被登记因此返回undefinedSymbol的属性
Symbol.prototype.descirption
description用于返回 Symbol 数据的描述
// Symbol() 定义的数据
let a Symbol(acc);
console.log(a.description); // acc
Symbol.keyFor(a); // undefined// Symbol.for() 定义的数据
let a1 Symbol.for(acc);
console.log(a1.description); // acc
Symbol.keyFor(a1); // acc// 未指定描述的数据
let a2 Symbol.();
console.log(a1.description); // undefineddescription属性和Symbol.keyFor()方法的区别是description 能返回所有 Symbol 数据类型的描述而 Symbol.keyFor() 只能返回 Symbol.for() 在全局注册过的描述。