ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript 学习-25.Symbol 类型

2022-05-25 19:34:29  阅读:240  来源: 互联网

标签:25 obj log Symbol JavaScript console hello 属性


前言

Symbol 是 ES6 中新添加的特性,生成一个唯一标识符,可用于属性名称、也可用于属性值。目的是消除属性名称冲突。

Symbol 简介

JavaScript 提供了7种基本数据类型:Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还有 Symbol
Symbol 是原始数据类型,不是对象,所以Symbol 函数栈不能用 new 命令

创建一个Symbol值

let s = Symbol('hello');

Symbol() 函数接受一个可选参数作为描述, 注意仅仅只是描述,方便阅读,不会影响它的值。

let s1 = Symbol('hello');
let s2 = Symbol('world');
console.log(s1);  // Symbol(hello)
console.log(s2);  // Symbol(world)

当我们使用console.log()去打印symbol的时候会隐式调用symbol的toString()方法

Symbol() 函数每次调用会创建一个新的独一无二的值,所以2个Symbol()的值是不相等的

console.log(Symbol() === Symbol()); // false

两个参数名称一样,得到的值也不一样(参数仅仅只是描述,方便阅读)

let s1 = Symbol('hello');
let s2 = Symbol('hello');
console.log(s1);  // Symbol(hello)
console.log(s2);  // Symbol(hello)
console.log(s1 === s2)  // false

Symbol是原始类型,也不能使用new去创建

let s = new Symbol(); // 这是错误的写法

Symbol 作为对象属性

对象的属性只能是字符串,并且属性不能重复,可以用symbol作为对象的键

const name = Symbol();
const obj = {
    [name]:  'hello',
    address: '上海市'
};
console.log(obj); // ['address', Symbol()]

Symbol作为对象属性名时,不能使用点运算符

const obj = {};
const name = Symbol();
obj[name] = 'hello';
obj.address= '上海市';
console.log(obj); // {address: '上海市', Symbol(): 'hello'}
console.log(name in obj); // true
console.log(obj[name ]); // hello
console.log(Object.keys(obj)); // ['address']

Object.keys()无法获取到 symbol 类型的键, 因为Symbol 是ES6 中新添加的类型。

  • Symbol作为对象属性名时,不能使用点运算符,使用点运算符后,这个属性名就是一个普通字符串了,而不是Symbol类型。
  • Symbol属性名具有隐藏性,是不可枚举属性,所以这个属性不能使用for...in、for...of、Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()等方法访问到

另一个新的 Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。

const obj = {};
const name = Symbol();
obj[name] = 'hello';
obj.address= '上海市';

console.log(Reflect.ownKeys(obj)); //  ['address', Symbol()]

私有属性

当多个模块修改对象的同一个属性时,可能会导致属性被重新赋值,存在一定的风险,由于JavaScript里面没有私有属性。
Symbol 作为属性具有唯一性,可以当成是私有属性。

比如当公共模块有一个person对象

// person 公共模块    
const person = {
    name:  'hello',
    address: '上海市'
};

在其它2个模块都给person对象一个id属性

function lib1(obj) {
  obj.id = 123;
}
function lib2(obj) {
  obj.id = 456;
}

lib1(person);
lib2(person);
console.log(person.id);  //456

那么id属性的值会被覆盖掉。于是可以用Symbol解决这种问题

function lib1(obj) {
  obj[Symbol('id1')]= 123;
}


function lib2(obj) {
  obj[Symbol('id1')] = 456;
}

lib1(person);
lib2(person);

Symbol.for()

Symbol.for(key) 方法会根据给定的键 key,来从运行时的 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入全局 symbol 注册表中。

let x = Symbol("hello");
let x1 = Symbol.for("hello");
console.log(x === x1);      // false

let x2 = Symbol.for("hello");
console.log(x1 === x2);     // true

为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。

Symbol.for("mdn.foo");
Symbol.for("mdn.bar");

Symbol.keyFor()

Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

let x1 = Symbol.for("hello");
console.log(Symbol.keyFor(x1));    // "hello"

Symbol更多的教程学习https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol

标签:25,obj,log,Symbol,JavaScript,console,hello,属性
来源: https://www.cnblogs.com/yoyoketang/p/16309657.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有