>웹 프론트엔드 >JS 튜토리얼 >ES6의 기호 관련 지식 소개(코드 예시)

ES6의 기호 관련 지식 소개(코드 예시)

不言
不言앞으로
2018-11-26 15:59:572208검색

이 글은 ES6의 Symbol 관련 지식(코드 예제)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

symbol은 es6에서 도입된 타입으로, 원시타입(string, number, boolean, null, undefine, Symbol) 카테고리에 속합니다

#🎜🎜 #basic

let name = Symbol('xiaohesong')
typeof name // 'symbol'
let obj = {}
obj[name] = 'xhs'
console.log(obj[name]) //xhs

symbol for

이 항목은 공유 가능하며, 이 키의 기호가 전역적으로 발견되는지 확인합니다. 그렇지 않은 경우에는 생성되어 전역적으로 등록됩니다.

let uid = Symbol.for("uid");
let object = {
    [uid]: "12345"
};

console.log(object[uid]);       // "12345"
console.log(uid);               // "Symbol(uid)"

let uid2 = Symbol.for("uid");

console.log(uid === uid2);      // true
console.log(object[uid2]);      // "12345"
console.log(uid2);              // "Symbol(uid)"
여기서 언급된 공유는 전역 범위와 유사한 전역 공유이며, 전체 환경에서 공유됩니다. symbol keyfor

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

let uid2 = Symbol.for("uid");
console.log(Symbol.keyFor(uid2));   // "uid"

let uid3 = Symbol("uid");
console.log(Symbol.keyFor(uid3));   // undefined

전역 레지스트리가 존재하지 않습니다 uid3 이 공유 기호. . 따라서 해당 키를 얻을 수 없습니다.

symbol을 강제로 변환할 수 없습니다.

let uid = Symbol('uid')
uid + ''

오류가 발생합니다. 여기서 사양에 따르면 추가를 위해 uid를 문자열로 변환합니다. 꼭 추가하고 싶다면 String(uid)를 먼저 추가하고 나중에 추가하면 되지만 현재로서는 의미가 없는 것 같습니다.

obj에서 기호 키 가져오기

let uid = Symbol('uid')
let obj = {
    [uid]: 'uid'
}

console.log(Object.keys(obj)) // []
console.log(Object.getOwnPropertyNames(obj)) // []
console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(uid)]

es6 이를 위해 Object.getOwnPropertySymbols 메서드가 추가되었습니다.

Symbol이 거의 사용되지 않는다고 느끼시나요? 사실 es6에서는 아직도 내부적으로 많이 사용됩니다.

Symbol.hasInstance

모든 함수에는 이 메서드가 있습니다. 어쩌면 당신은 이 방법에 별로 익숙하지 않을 수도 있지만 실제로는 이것이 바로 instanceof가 하는 일입니다. 맞습니다. es6은 여러분을 위해 이 메소드를 다시 작성합니다.

function Xiao(){}
const xiao = new Xiao
xiao instanceof Xiao // true
실제로 es6가 그런 일을 합니다

Xiao[Symbol.hasInstance](xiao)
이것은 내부 방법이며 재작성을 지원하지 않습니다. 물론 프로토타입에서 다시 작성할 수 있습니다.

Object.definePrototype(Xiao, Symbol.hasInstance, {
   value: (v) : Boolean(v)
})
const x = new Xiao
x instanceof Xiao //true
0 instanceof Xiao //false
1 instanceof Xiao //true
해당 값이 부울 유형인지 여부를 반환하도록 다시 작성하는 것을 볼 수 있습니다.

Symbol.isConcatSpreadable

이것은 기본적으로 일부 표준 개체에 존재하지 않는 속성과 다릅니다. 간단히

let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true}
['arrs'].concat(objs) //["arrs", "first", "second"]
Symbol.toPrimitive

을 사용하면 이 방법이 더 유용합니다. 즉, toPrimitive. 이 메소드는 표준 유형의 프로토타입에 존재합니다.

유형 변환을 수행할 때 toPrimitive는 매개변수를 강제로 호출합니다. 사양에서는 이 매개변수를 힌트라고 합니다. '숫자', '문자열', '기본값'). toPrimitive.这个方法,标准类型的原型上都存在。
进行类型转换的时候,toPrimitive会被强制的调用一个参数,在规范中这个参数被称之为hint. 这个参数是三个值('number', 'string', 'default')其中的一个。
顾名思义,string返回的是string, number返回的是number,default是没有特别指定,默认。
那么什么是默认的情况呢? 大多数的情况下,默认情况就是数字模式。(日期除外,他的默认情况视为字符串模式)
其实在类型转换时调用默认情况的也不是很多。如(==, +)或者将参数传递给Date이름에서 알 수 있듯이 stringstring을 반환하고 numbernumber를 반환하며 기본값은 특별한 것이 아닙니다. . 지정됨, 기본값.

그럼 기본 상황은 무엇인가요? 대부분의 경우 기본값은 숫자 모드입니다. (날짜를 제외하고는 기본 상황을 문자열 모드로 간주합니다.)
    사실 타입 변환 시 호출되는 기본 상황은 많지 않습니다. 예를 들어 (==, +) 또는 Date의 구성 매개변수에 매개변수를 전달할 때입니다.
  • 숫자의 경우에 숫자 모드 동작(우선순위는 높은 것에서 낮은 것까지)
  • 첫 번째 호출 valueOf, if 기본 유형이므로 반환하세요.
  • 이전 값이 원래 값이 아니면 toString을 호출하고, 원래 값이면
  • #을 반환합니다. 🎜🎜##🎜 🎜#둘 다 없으면 오류가 보고됩니다

  • string 모드 문자열의 경우 동작이 약간 다릅니다(우선순위가 높음에서 우선순위가 높음) 낮음)#🎜🎜 #

  • 먼저 String을 호출하고, 원래 값이면

  • 다음을 반환합니다. 이전 값이 원래 값이 아닌 경우 Call valueOf를 시도하고 원래 값인 경우

  • 을 반환합니다.

    # 🎜🎜#
  • 글쎄, 꽤 헷갈리지 않나요? 네, 코드를 설명하겠습니다.
let obj = {
    valueOf: function(){console.log('valueOf')},
    toString: function(){console.log('toString')}
}
// console.log value is
obj + 2 //valueOf
obj == 2 // valueOf
Number(obj) // valueOf
String(obj) // toString

위 출력을 통해 대부분의 경우 valueOf가 먼저 호출되는 것을 확인할 수 있습니다.

기본 사례를 포함하면 기본값은 숫자 모드로 호출되며 대부분은 숫자 모드를 호출하면 toString이 문자열이 호출되는 모드임을 알 수 있습니다. 그래서 문자열 모드가 아닌 이상 기본적으로는 숫자 모드라고 생각하시면 됩니다.

아직도 이 통화 모드에 대해 잘 모르시나요? 괜찮습니다. es6은 이 내부 메소드를 외부 세계에 노출하므로 이를 다시 작성하고 힌트 유형을 출력할 수 있습니다.

function Temperature(degrees) {
    this.degrees = degrees;
}

Temperature.prototype[Symbol.toPrimitive] = function(hint) {
    console.log('hint is', hint)
};

let freezing = new Temperature(32);

freezing + 2 // ..
freezing / 2 // ..
...

에 오시면 위의 유형을 시험해 보실 수 있습니다.

위 내용은 ES6의 기호 관련 지식 소개(코드 예시)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제