이 글은 ES6의 Symbol 관련 지식(코드 예제)을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
symbol은 es6에서 도입된 타입으로, 원시타입(string, number, boolean, null, undefine, Symbol) 카테고리에 속합니다
#🎜🎜 #basiclet name = Symbol('xiaohesong') typeof name // 'symbol' let obj = {} obj[name] = 'xhs' console.log(obj[name]) //xhs
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
let uid = Symbol('uid') uid + ''
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)]
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
이름에서 알 수 있듯이 string
은 string
을 반환하고 number
는 number
를 반환하며 기본값은 특별한 것이 아닙니다. . 지정됨, 기본값.
==
, +
) 또는 Date
의 구성 매개변수에 매개변수를 전달할 때입니다. #을 반환합니다. 🎜🎜##🎜 🎜#둘 다 없으면 오류가 보고됩니다
string 모드 문자열의 경우 동작이 약간 다릅니다(우선순위가 높음에서 우선순위가 높음) 낮음)#🎜🎜 #
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!