本文为lodash源码分析的第4篇,后续会持续更新这个专题,欢迎指正。
依赖
import isSymbol from '../isSymbol.js'
源码分析
isKey函数是用来判断value是不是一个有效的属性名。
const reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/
const reIsPlainProp = /^\w*$/
function isKey(value, object) {
if (Array.isArray(value)) {
return false
}
const type = typeof value
if (type === 'number' || type === 'boolean' || value == null || isSymbol(value)) {
return true
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object))
}
正则表达式:
reIsDeepProp:用于匹配那些表示深层次属性的键。能匹配.、[],包括普通字符、转义字符以及被引号包围的字符串。如a.b、a[b]、a["b c"]。reIsPlainProp:用于匹配简单的,未被特殊字符修饰的键名,即由字母、数字和下划线组成的,如abc、a1、a_1。
首先,检查value是否为数组,是则返回false,因为数组不是一个有效的键名。
其次,检查value类型是否为 number、boolean、null、Symbol类型,是则返回true,因为这些都可以直接作为对象的键名。
接着判断,如果 value是一个简单的键名(reIsPlainProp),或者不是一个深层次属性键名(reIsDeepProp),也可以被认为是一个有效的键名。
如果 object不为 null且 value在 object(或其原型链)中作为键名存在,也可以被当做一个有效键名。