lodash源码分析之isKey

124 阅读1分钟

本文为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.ba[b]a["b c"]
  • reIsPlainProp:用于匹配简单的,未被特殊字符修饰的键名,即由字母、数字和下划线组成的,如abca1a_1

首先,检查value是否为数组,是则返回false,因为数组不是一个有效的键名。

其次,检查value类型是否为 numberbooleannullSymbol类型,是则返回true,因为这些都可以直接作为对象的键名。

接着判断,如果 value是一个简单的键名(reIsPlainProp),或者不是一个深层次属性键名(reIsDeepProp),也可以被认为是一个有效的键名。

如果 object不为 nullvalueobject(或其原型链)中作为键名存在,也可以被当做一个有效键名。