ES6: Símbolo único

ES6: ¿Cuánto sabes sobre Symbol?

Visión general

ES6 introduce un nuevo símbolo de tipo de datos primitivo, que representa un valor único. En otras palabras, el nombre del atributo del objeto puede tener dos tipos: uno es la cadena original y el otro es el tipo de símbolo recién agregado, lo que puede garantizar que no entrará en conflicto con otros nombres de atributo.

La función Símbolo puede aceptar una cadena como parámetro, que representa la descripción de la instancia de Símbolo, principalmente para mostrarla en la consola o para facilitar la distinción al convertirla en una cadena.

let s = Symbol('foo');
typeof s	//symbol

s	//Symbol(foo)

s.toString()	//"Symbol(foo)"
String(s)		//"Symbol(foo)"

Si el parámetro del símbolo es un objeto, se llamará al método toString del objeto para convertirlo en una cadena, y luego se generará el símbolo.

const obj = {
    
    
    toString(){
    
    
        return 'abc'
    }
}

let sym = Symbol(obj);
sym		//Symbol(abc)

Símbolo como nombre de atributo

Dado que cada valor de Símbolo no es igual, significa que el valor de Símbolo se puede usar como un identificador para el nombre de atributo del objeto, asegurando que no aparecerá ningún atributo con el mismo nombre. Sin embargo, no se permite acceder a la propiedad Símbolo con el operador de punto

var mysym = Symbol();

//下面三种写法都可以
var a = {
    
    }
a[mysym] = 'hello';

var a = {
    
    
    [mysym] : 'hello'
};

var a = {
    
    }
Object.defineProperty(a,mysym,{
    
    value: 'hello'});

//相同的结果
a[mysym] 	//'hello'

Cruce de nombres de atributos

Nombre de símbolo como una propiedad, la propiedad no aparece en for... ino for...ofen, no será Object.keys(), Object.getOwnPropertyNames()regresó. Sin embargo, existe un Object.getOwnPropertySymbolsmétodo que devuelve el nombre de la propiedad Símbolo del objeto especificado.

var obj = {
    
    };
var a = Symbol('a');
var b = Symbol('b');

obj[a] = "hello";
obj[b] = "world";

var symbols = Object.getOwnPropertySymbols(obj);

symbols		//[Symbol(a),Symbol(b)]

Otra API nueva: los Reflect.ownKeysmétodos pueden devolver todo tipo de nombres de clave, incluidos los nombres de clave normales y los nombres de clave de símbolo.

let obj = {
    
    
    [Symbol('a')] : 1,
    num : 2
}

Reflect.ownKeys(obj)		//["num",Symbol(a)]

¡Apareció! ¡Deje que lo único comparta!

A veces, queremos reutilizar el mismo valor de Símbolo y el Symbol.formétodo puede hacerlo. Acepta una cadena como parámetro y luego busca un valor de símbolo con el parámetro como nombre. Si lo hay, devuelva el valor de símbolo; de lo contrario, cree un nuevo pozo y devuelva un valor de símbolo con el nombre de la cadena.

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');

s1 === s2	//true


Symbol.for('foo') === Symbol.for('foo')	//true
Symbol('foo') === Symbol('foo')		//false

Para obtener más atributos de símbolo, haga clic aquí

Supongo que te gusta

Origin blog.csdn.net/yivisir/article/details/107599859
Recomendado
Clasificación