symbol.search 的核心作用是让普通对象能直接参与 string.prototype.search() 调用,无需构造正则表达式或继承 regexp 类;它通过在对象上定义 [symbol.search](str) 方法,接收字符串并返回匹配起始索引(≥0)或 -1 来实现自定义搜索逻辑。
symbol.search 的核心作用是让普通对象能直接参与 string.prototype.search() 调用,无需构造正则表达式,也不用继承 regexp 类。它不是用来“写正则”,而是告诉 javascript:“当这个对象被传给 search() 时,请按我定义的逻辑算匹配位置。”
让对象支持字符串搜索
只要在对象上定义 [Symbol.search](str) 方法,该方法接收待搜索的字符串,返回首个匹配起始索引(如 0、5),未匹配则返回 -1。
- 方法必须挂载在对象自身(非原型链),且键名严格为
Symbol.search - 函数体内可自由实现逻辑:
indexOf、includes、大小写不敏感比对、字段筛选等 - 返回值必须是数字:匹配位置(≥ 0)或 -1;其他类型会被转为数字,可能引发意外结果
实现大小写不敏感搜索
不用正则也能做到忽略大小写,适合轻量场景:
const ignoreCaseSearch = {
[Symbol.search](str) {
return this.value.toLowerCase().indexOf(str.toLowerCase());
}
};
const text = 'Hello World';
console.log(text.search(ignoreCaseSearch)); // 报错,因为 ignoreCaseSearch 没有 value 属性
// 正确用法需绑定上下文或改写为闭包:
const makeIgnoreCaseSearch = (target) => ({
[Symbol.search](str) {
return target.toLowerCase().indexOf(str.toLowerCase());
}
});
console.log('Hello World'.search(makeIgnoreCaseSearch('hello'))); // 0
模拟基础正则语义
可在对象中解析常见符号(如 ^、$、),自行实现对应行为:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
str.startsWith('^') && str.endsWith('$')→ 全字匹配,检查是否完全等于目标 -
str.startsWith('^')→ 用startsWith()判断开头 -
str.endsWith('$')→ 用endsWith()判断结尾 -
str.includes('\b')→ 拆词后比对单词边界(如str.split(/s+/).includes(target))
配合配置对象做语义化查找
把搜索逻辑和业务数据封装在一起,提升可读性与复用性:
const userConfig = {
name: 'admin',
desc: 'System administrator account',
[Symbol.search](str) {
return this.desc.toLowerCase().indexOf(str.toLowerCase());
}
};
console.log('Admin access granted'.search(userConfig)); // 17('administrator' 中 'admin' 起始位置)
这样调用方无需关心内部如何查,只管传字符串、拿索引,逻辑解耦清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










