ES6 Symbol 데이터 유형의 응용 사례 분석
Symbol은 ES6에 도입된 새로운 데이터 유형으로, 고유한 값을 나타냅니다.대상을 대상으로 하는 모든 대상에 문자열 형식의 속성이 있기 때문에 새로운 방법의 이름은 기존 방법과 충돌할 수 있습니다.Symbol의 도입은 모든 속성의 이름이 유일무이하다는 것을 보증함으로써 속성명의 충돌을 근본적으로 방지한다.
ES6 이전 객체 속성의 이름 지정 방법
var obj = {
name:'Joh',
'my name': 'Johnny'
}
console.log(obj.name); // Joh
console.log(obj['my name']); // Johnny
Symbol 도입 후 변수가 반복되지 않음
let name1 = Symbol('name');
let name2 = Symbol('name');
console.log(name1 === name2); // false
보시다시피 모두 Symbol 함수를 호출했지만, 되돌아오는 Symbol 유형의name1과name2는 같지 않습니다
Symbol 유형을 문자열 유형으로 변환
let name1 = Symbol('name');
let name2 = Symbol('name');
console.log(name1.toString());// Symbol(name)
console.log(String(name2)); // Symbol(name)
Symbol 유형이 객체에 적용되는 속성
let getName = Symbol('name');
let obj = {
[getName]() {
return 'Joh';
}
}
console.log(obj[getName]()); // Joh
Symbol 유형의 속성은 어느 정도 숨겨집니다.
let name = Symbol('name');
let obj = {
age:22,
[name]:'Joh'
};
console.log(Object.keys(obj)); // Symbol [name]
// for-in Symbol [name]
for(var k in obj) {
console.log(k);
}
// Object.getOwnPropertyNames Symbol [name]
console.log(Object.getOwnPropertyNames(obj));
// Object.getOwnPropertySymbols
var key = Object.getOwnPropertySymbols(obj)[0];
console.log(obj[key]); // Joh
Symbol 유형을 사용하여 개체의 개인 속성을 시뮬레이션합니다.
User 모듈
'use strict';
let getName = Symbol('getName');
module.exports = class User {
[getName]() {
return 'Joh';
}
print() {
console.log(this[getName]());
}
}
User 모듈 테스트
'use strict';
const User = require('./User');
let user = new User();
user.print(); // Joh
let getName = Symbol('getName');
user[getName](); // getName is not defined , Symbol
Symbol.for 및 Symbol.keyFor 응용 프로그램
let name1 = Symbol.for('name');
let name2 = Symbol.for('name');
console.log(name1 === name2); // true
console.log(Symbol.keyFor(name1)); // name :
Symbol.for
를 사용하여 Symbol 유형의 값을 가져오고 Symbol.keyFor
를 사용하여 이전 문자열을 가져옵니다.for-of를 사용하여 그룹의 항목을 순서대로 출력합니다
let arr = ['a', 'b', 'c'];
for(let item of arr) {
console.log(item); // a b c
}
Symbol을 사용합니다.iterator 교체기가 하나하나 그룹의 항목을 되돌려줍니다
let arr = ['a', 'b', 'c'];
var iterator = arr[Symbol.iterator]();
// next done
console.log(iterator.next()); // {value: "a", done: false}
console.log(iterator.next()); // {value: "b", done: false}
console.log(iterator.next()); // {value: "c", done: false}
console.log(iterator.next()); // {value: undefined, done: true}
console.log(iterator.next()); // {value: undefined, done: true}
프로그램 최적화:
let arr = ['a', 'b', 'c'];
var iterator = arr[Symbol.iterator]();
// next done
var next = iterator.next();
while(!next.done) {
console.log(next);
next = iterator.next();
};
Symbol.iterator 객체에 적용할 인스턴스 1:
'use strict';
class UserGroup {
constructor(users) {
// json {joh:111,lili:1123}
this.users = users;
}
[Symbol.iterator]() {
let self = this;
let i = 0;
const names = Object.keys(this.users);
const length = names.length;
// iterator ,
return {
next() {
let name = names[i++];
let qq = self.users[name];
return {value: {name, qq}, done: i > length}
}
}
}
}
let group = new UserGroup({'Joh':'595959','Lili':'888116'});
for (let user of group) {
console.log(user);
}
// { name: 'Joh', qq: '595959' }
// { name: 'Lili', qq: '888116' }
Symbol.iterator 객체에 적용할 인스턴스 2:
'use strict';
var obj = {'Joh':'56999', 'Lili':'899888'};
obj[Symbol.iterator] = function() {
let self = this;
let i = 0;
const names = Object.keys(this);
const length = names.length;
// iterator ,
return {
next() {
let name = names[i++];
let qq = self[name];
return {value: {name, qq}, done: i > length}
}
}
}
for (let u of obj) console.log(u);
프로그램 최적화 이후:
'use strict';
var obj = {'Joh':'56999', 'Lili':'899888'};
let iteratorFun = function () {
let self = this;
let i = 0;
const names = Object.keys(this);
const length = names.length;
// iterator ,
return {
next() {
let name = names[i++];
let qq = self[name];
return {value: {name, qq}, done: i > length}
}
}
}
obj[Symbol.iterator] = iteratorFun;
for (let u of obj) console.log(u);
Symbol.iterator가 위수 그룹에 적용
'use strict';
var obj = {
length:2,
'0':'abc',
'1':'ddd'
}
/*
// if this , err: obj is not iterable
for (let i of obj) {
console.log(i);
}
*/
obj[Symbol.iterator] = [][Symbol.iterator]; // handle this first
// then
for (let i of obj) {
console.log(i);
}
문자열은 Symbol을 구현합니다.iterator 인터페이스
'use strict';
console.log('Joh'[Symbol.iterator]); // [Function: [Symbol.iterator]]
for(let char of 'Lili') {
console.log(char);
}
마찬가지로 ES6에서 set, 맵 문자열 모두 가능
Symbol.iterator
인터페이스JavaScript에 관한 더 많은 내용은 본 사이트의 주제를 보실 수 있습니다.,,,,,,,,,,,,,,,,
이 문서가 JavaScript 프로그램 설계에 도움이 되었으면 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.