ES6的Symbol竟然那么强大,面试中的加分点啊
栏目: JavaScript · 发布时间: 7年前
内容简介:symbol是es6出的一种类型,他也是属于原始类型的范畴(string, number, boolean, null, undefined, symbol)这个东西是可共享,在创建的时候会检查全局是否寻在这个key的symbol.如果存在就直接返回这个symbol,如果不存在就会创建,并且在全局注册。此处所说的共享是全局性的共享,类似于global scope,是整个大环境下的共享.
symbol是es6出的一种类型,他也是属于原始类型的范畴(string, number, boolean, null, undefined, symbol)
basic
let name = Symbol('xiaohesong')
typeof name // 'symbol'
let obj = {}
obj[name] = 'xhs'
console.log(obj[name]) //xhs
复制代码
symbol for
这个东西是可共享,在创建的时候会检查全局是否寻在这个key的symbol.如果存在就直接返回这个symbol,如果不存在就会创建,并且在全局注册。
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)"
复制代码
此处所说的共享是全局性的共享,类似于global scope,是整个大环境下的共享.
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.所以取不出对应的key.由此可见,这个是获取对应的key.
symbol 不可强制转换
let uid = Symbol('uid')
uid + ''
复制代码
这里会报错,根据规范,他会把uid转换成字符串进行相加。如果真的相加,可以先 String(uid)
之后再相加,不过目前看来,似乎没什么意义。
obj中symbol key的获取
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
方法。
是不是感觉很少用到Symbols.其实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
复制代码
可以发现,我们改写他返回对应的是否为boolean类型。
Symbol.isConcatSpreadable
这个和其他的一些属性不同,他是默认不存在一些标准对象上。简单的使用
let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true}
['arrs'].concat(objs) //["arrs", "first", "second"]
复制代码
Symbol.toPrimitive
这个用的就多了,进行类型转换的时候,对象会进行尝试转换成原始类型,就是通过 toPrimitive
.这个方法,标准类型的原型上都存在。
进行类型转换的时候, toPrimitive
会被强制的调用一个参数,在规范中这个参数被称之为 hint
. 这个参数是三个值('number', 'string', 'default')其中的一个。
顾名思义, string
返回的是 string
, number
返回的是 number
, default
是没有特别指定,默认。
那么什么是默认的情况呢? 大多数的情况下,默认情况就是数字模式。(日期除外,他的默认情况视为字符串模式)
其实在类型转换时调用默认情况的也不是很多。如( ==
, +
)或者将参数传递给 Date
的构造参数的时候。
-
number mode 在数字情况下的行为(优先级从高到低)
valueOf toString
-
string mode 在字符串的情况下,行为略有不同(优先级从高到低)
toString 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
是调用了 string
的模式。所以你可以认为,基本就是数字模式,除非很显示的是字符串模式。
对于这个调用的模式还不是很清楚?没事,es6把这个内部的方法对外暴露出来了,我们可以改写他,输出这个 hint
的类型。 来
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 // ..
...
复制代码
上面的类型,你可以试试。
Symbo.species
这个需要联系 class
的上下文来阐述了,点击此处查看详细
本文 原文在此处 , 推荐一个高质量教学视频网站, 很多免费的视频及资源
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 分享一下我面试腾讯的真实经历,揭秘今年校招面试关键得分点!
- 技术攻坚,行业落地,百分点大力拓展认知智能蓝图
- 百分点狙击人工智能新战场 发力B端服务
- 百分点认知智能实验室出品:机器翻译是如何炼成的(下)
- 百分点大数据评测报告:开源OLAP引擎综评(HAWQ、Presto、ClickHouse)
- Python面试经验总结,面试一时爽,一直面试一直爽!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
An Introduction to Probability Theory and Its Applications
William Feller / Wiley / 1991-1-1 / USD 120.00
Major changes in this edition include the substitution of probabilistic arguments for combinatorial artifices, and the addition of new sections on branching processes, Markov chains, and the De Moivre......一起来看看 《An Introduction to Probability Theory and Its Applications》 这本书的介绍吧!