《深切明白ES6》笔记——Symbol和Symbol属性(6)

还记得对象Object吗?

let obj = {
  a: 1
}

对象的花样:

Object {
    key: value
}

在ES5的时期,对象的key只能是字符串String范例。有人就想搞事,把key改成其他数据范例,这不是瞎折腾吗?ES构造的大神们为了敷衍这类搞事的人,就指定了一个新的数据范例:Symbol。

原始数据范例

进修Symbol之前,让我们回想一下你曾用过的原始数据范例,只要5个,别搞错了。

null、undefined

是否是口试的时刻有人问过你这两者的区分?问这类题目的人很无聊,你假如和他当同事,真是受罪。

Number 数字范例

const a = 10
typeof a // number

String 字符串

const a = 'haha'
typeof a // string

boolean 布尔型

const a = true, b = false

Symbol

Symbol究竟长啥样?又该怎样用呢?我们一起来探究一下。

在MDN文档中,关于Symbol的申明是如许的:

Symbol 是一种特别的、不可变的数据范例,能够作为对象属性的标识符运用。Symbol 对象是一个 symbol primitive data type 的隐式对象包装器。

symbol 数据范例是一个原始数据范例。

Symbol的语法花样:

Symbol([description]) //description是可选的

建立一个Symbol:

看了Symbol的形貌,不知道是什么鬼?长得像个函数。

我们最先根据语法建立一个Symbol来研讨一下

const name = Symbol();
const name1 = Symbol('sym1');
console.log(name, name1) // Symbol() Symbol(sym1)

Symbol不能运用new

const name = new Symbol(); //不能够如许做。
//Symbol is not a constructor

运用Symbol:

运用Number的时刻,我们能够如许写:

const b = Number(10) // 10
//简写
const b = 10

同理,运用Symbol,我们能够如许:

const name1 = Symbol('sym1'); // Symbol(sym1)

在所有运用可计算属性名的处所,都能运用Symbol范例。比方在对象中的key。

const name = Symbol('name');
const obj = {
  [name]: "haha"
}
console.log(obj[name]) // haha

你还能够运用Object.defineProperty()和Object.defineProperties()要领。这2个要领是对象的要领,然则作为Symbol范例key,也不影响运用。

// 设置对象属性只读。
Object.defineProperty(obj, name, {writable: false})

这2个要领异常有效,在react源码中,运用了大批的只读属性的对象。以下是从react源码截取的一段代码,设置了props对象只读。然则react依旧运用字符串作为key,并不必Symbol。

Object.defineProperty(props, 'key', {
    get: warnAboutAccessingKey,
    configurable: true
  });

Symbol全局同享

Symbol有点特别,在js文件中定义的Symbol,并不能在其他文件直接同享。

ES6供应了一个注册机制,当你注册Symbol以后,就能在全局同享注册内外面的Symbol。Symbol的注册表和对象表很像,都是key、value构造,只不过这个value是Symbol值。
(key, Symbol)
语法:

Symbol.for() //只要一个参数

另有一个要领是猎取注册表的Symbol。

语法:

Symbol.keyFor() //只要一个参数,返回的是key

从注册表猎取全局同享的Symbol

let name = Symbol.for('name');
let name1 = Symbol.for('name1');
let name2 = Symbol.for('name2');

console.log(Symbol.keyFor(name)) // name
console.log(Symbol.keyFor(name1)) // name1
console.log(Symbol.keyFor(name2)) // name2

注重:假如要防备Symbol定名反复题目,能够加上前缀。如:hyy.name

Symbol与范例强迫转换

JavaScript中的范例能够自动转换。比方Number转换成字符串。

let a = 1;
console.log(typeof a); // number
console.log(a + ' haha') // '1haha'

然则注重了,Symbol不支持这类转换。Symbol就是这么拽啊!

let a = Symbol('a');
console.log(typeof a);
console.log(a + ' haha') // Cannot convert a Symbol value to a string

Symbol检索

在对象中猎取字符串的key时,能够运用Object.keys()或Object.getOwnPropertyNames()要领猎取key,然则运用Symbol做key是,你就只能运用ES6新增的要领来猎取了。

let a = Symbol('a');
let b = Symbol('b');

let obj = {
  [a]: "123",
  [b]: 45
}

const symbolsKey = Object.getOwnPropertySymbols(obj);

for(let value of symbolsKey) {
  console.log(obj[value]) 
}
//"123"
//45

总结

Symbol还供应了多个要领给开辟者运用,我们不再逐一研讨每一个要领的用处,你想要相识周全能够检察 Symbol MDN文档

我们只需要知道Symbol怎样定义,怎样在全局同享,假如在对象中替换key即可敷衍基础的开辟需求了。

末了再回忆一下Symbol是什么:Symbol是JavaScript的原始数据范例,一个全新的数据范例,和对象、数字、字符串等完整不一样,它必需经由过程Symbol()建立。它的运用看上面的细致引见。

=> 返回文章目次

    原文作者:二月
    原文地址: https://segmentfault.com/a/1190000010245693
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞