1. 背景
对于 isSymbol
、isMap
等新特性中才有的类型的判断时,比起普通类型判断,源码中会多了对当前环境是否支持新类型的判断。
其中用到类似思路的有如下函数:
- isFormData
isSymbol
isMap
- isWeakMap
isSet
- isWeakSet
- …
2. 源码解析
以 isSymbol
为例,如下判断思路为:
- 先判断当前环境是否支持
Symbol
类型,若不支持则会返回undefined
常量 - 若支持
Symbol
,则判断是否拥有isSymbol
方法,若有则用该方法检验 - 若无
isSymbol
方法,则用typeof
方法(因为Symbol
属于 ES6 中的基础数据类型,因此可以通过typeof
判断得到)
/* eslint-disable valid-typeof */
var staticStrUndefined = require("./staticStrUndefined");
var supportSymbol = typeof Symbol !== staticStrUndefined;
function isSymbol(obj) {
return supportSymbol && Symbol.isSymbol
? Symbol.isSymbol(obj)
: typeof obj === "symbol";
}
module.exports = isSymbol;
开头提到的其他校验方法,与 isSymbol
大同小异,现在来看就很容易理解了,见下:
// isFormData.js
/* eslint-disable valid-typeof */
var staticStrUndefined = require('./staticStrUndefined')
var supportFormData = typeof FormData !== staticStrUndefined
function isFormData (obj) {
return supportFormData && obj instanceof FormData
}
module.exports = isFormData
// isMap.js
/* eslint-disable valid-typeof */
var staticStrUndefined = require('./staticStrUndefined')
var supportMap = typeof Map !== staticStrUndefined
function isMap(obj) {
return supportMap && obj instanceof Map
}
module.exports = isMap
// isSet.js
/* eslint-disable valid-typeof */
var staticStrUndefined = require('./staticStrUndefined')
var supportSet = typeof Set !== staticStrUndefined
function isSet(obj) {
return supportSet && obj instanceof Set
}
module.exports = isSet
// isWeakMap.js
/* eslint-disable valid-typeof */
var staticStrUndefined = require('./staticStrUndefined')
var supportWeakMap = typeof WeakMap !== staticStrUndefined
function isWeakMap(obj) {
return supportWeakMap && obj instanceof WeakMap
}
module.exports = isWeakMap
// isWeakMap.js
/* eslint-disable valid-typeof */
const isWeakMap = require('./isWeakMap')
var staticStrUndefined = require('./staticStrUndefined')
var supportWeakSet = typeof WeakSet !== staticStrUndefined
function isWeakSet(obj) {
return supportWeakSet && obj instanceof WeakSet
}
module.exports = isWeakSet