实用的工具函数
判断数据类型
判断数组, 也是能判断数据类型最全的一个方法
var toString = Object.prototype.toString;
// 可以通过 `toString()` 来获取每个对象的类型
// 一般返回值是 Boolean 类型的函数,命名都以 is 开头
function isArray(val) {
return toString.call(val) === '[object Array]';
}
判断Buffer
什么是Buffer? JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。 处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
// 先判断不是 undefined和null
// 再判断 val存在构造函数,因为Buffer本身是一个类
// 最后通过自身的isBuffer方法判断
function isBuffer(val) { return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); }
判断是否是FormData
function isFormData(val) { return (typeof FormData !== 'undefined') && (val instanceof FormData); }
判断是否是纯对象
function isPlainObject(val) {
if (Object.prototype.toString.call(val) !== '[object Object]') {
return false;
}
var prototype = Object.getPrototypeOf(val);
return prototype === null || prototype === Object.prototype;
}
判断是否是流
function isStream(val) { // 本身是对象 且 pipe属性是函数 return isObject(val) && isFunction(val.pipe); }
判断是否是 URLSearchParams
URLSearchParams:定义了一些实用的方法来处理 URL 的查询字符串
function isURLSearchParams(val) {
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}
// 例子
const paramsString = "q=URLUtils.searchParams&topic=api"
paramsString.has("topic") === 'api'; // true
const searchParams = new URLSearchParams(paramsString);
isURLSearchParams(searchParams) // true
识别BOM
BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序。UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了。
charCodeAt()
- 返回值:指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
- 入参:index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标。
/**
* Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
*
* @param {string} content with BOM
* @return {string} content value without BOM
*/
function stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
NOOP空函数
使用场景:1. 方便判断, 2. 方便压缩( 如果是 function(){} ,不方便压缩代码)
const NOOP = () => { };
if(instance.render === NOOP){
console.log('i');
}
NO 永远返回 false 的函数
const NO = () => false;
// 除了压缩代码的好处外。
// 一直返回 false
isOn
判断字符串是不是 on 开头,并且 on 后首字母不是小写字母
const onRE = /^on[^a-z]/;
const isOn = (key) => onRE.test(key);
// 例子:
isOn('onChange'); // true
isOn('onchange'); // false
isOn('on3change'); // true
isModelListener 监听器
判断字符串是不是以onUpdate:开头
const isModelListener = (key) => key.startsWith('onUpdate:');
// 例子:
isModelListener('onUpdate:change'); // true
isModelListener('1onUpdate:change'); // false
// startsWith 是 ES6 提供的方法