初识Symbol数据类型

Symbol做为JavaScript ES6新的原始数据类型,表示独一无二的值。

它有如下几个特性javascript

没法用new进行显式定义

let a = Symbol()
let b = new Symbol() // 报错复制代码

typeOf返回的值为Symbol

var sym = Symbol('foo')
typeof sym    // 'symbol'复制代码

symbol属性是不可枚举的

symbol不会在for循环、for(...in...)中出现,由于这个属性是匿名的java

let temp = {
    [Symbol('people')]: 'symbol类型',
    id: 123,
    des: '定义类型'
}

for (let prop in temp ) {   
    console.log(prop)   // 分别会输出:'id''des'
}复制代码

Object.getOwnPropertySymbols()该方法能够返回一个包含全部Symbol自有属性的数组:

let temp = {    
    [Symbol('people')]: 'symbol类型',    
    id: 123,    
    des: '定义类型'
}
Object.getOwnPropertySymbols(temp) // [Symbol(people)]复制代码

Object.keys()Object.getOwnPropertyNames()方法能够检索对象中全部的属性名,前一个方法返回全部的可枚举属性名.后一个方法不考虑属性的可枚举性一概返回,但都不能返回symbol属性数组

Object.keys(temp )   // ['id', 'des']
Object.getOwnPropertyNames(obj)   // ['id', 'des']复制代码

定义两个相同的Symbol数据是不相等的

若是要建立就一个共享的Symbol须要用到Symbol.for()方法. Symbol.for()方法首先在全局Symbol注册表中搜索键为‘uid’的Symbol是否存在,若是存在,直接返回已有的Symbol;不然,建立一个新的Symbol,并使用这个键在Symbol全局注册表中注册,随机返回新建立的Symbol。
bash

let a = Symbol('AAA')
let b = Symbol('AAA')    
console.log(a === b) // false
    
let c = Symbol.for('uid')
let d = Symbol.for('uid')
    
console.log(c === d) // true复制代码

使用JSON.stringify()时,以symbol值做为键的属性会被忽略

JSON.stringify({[Symbol('foo')]: 'foo'});                 
// '{}'复制代码
相关文章
相关标签/搜索