在John Resig 那篇关于在JavaScript中实现简单继承的文章中,有这样一段代码:

var fnTest = /xyz/.test(function(){xyz;}) ? /b_superb/ : /.*/;

对于其中正则表达式匹配函数test的用法,我很是迷惑:

/xyz/.test(function(){xyz;})

我查阅了Mozilla developer center中关于test函数的描述:

Executes the search for a match between a regular expression and a specified string. Returns true or false.

字符串中是否有匹配正则表达式的子字符串。返回true或false。

其语法格式:

regexp.test([str])

注意这里的参数是字符串,根本没有提到test函数的参数可以是函数的说法。

我试着修改这段奇怪的代码,得到了一些运行结果:

/xyz/.test("xyz"); // true
/xyz/.test(function(){"xyz";}); // false
/xyz/.test(function(){return "xyz";}); // true
/xyz/.test(function(){return xyz;}); // true
/xyz/.test(function(){return axyz;}); // true
/xyz/.test(function(){return "axyz";}); // true
/xyz/.test(function(){return "xayz";}); // false

怎么回事?

华丽的分割线
=======================================
我终于知道了,却原来在test内部进行了类型转换,下面代码:

/xyz/.test(function(){xyz;});

等价于:

/xyz/.test((function(){xyz;}).toString());

又等价于:

/xyz/.test("function(){xyz;}");

那么为什么下面的代码返回false呢?

/xyz/.test(function(){"xyz";});

我们执行下这行代码就知道了:

// 这行代码的执行结果是:"function(){}"
(function(){"xyz";}).toString();

所以我们可以写出更加诡异的代码来迷惑大家了

/function/.test(function(){}); // true
// b 表示文字边界(对英文而言的)
/b_superb/.test(function(){this._super();}); // true

转载于:https://www.cnblogs.com/sanshi/archive/2009/07/09/1519585.html

奇怪-正则匹配的test函数相关推荐

  1. 函数柯里化的作用一:参数复用(正则匹配案例)

    什么是函数柯里化 currying? 做题时看到 currying 这个词还挺有意思的,本意是咖喱,翻译为中文叫柯里化,是因为是以逻辑学家 Haskell Curry 命名的. arity(参数个数) ...

  2. Hive 正则匹配函数 regexp_extract

    Hive 正则匹配函数 regexp_extract 1.regexp_extract 语法:    regexp_extract(string subject,  string pattern,   ...

  3. 常用JS正则匹配函数

    //校验用户名:只能输入1-30个字母 function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) retur ...

  4. python3中find函数的用法_Python3正则匹配re.split,re.finditer及re.findall函数用法详解...

    本文实例讲述了Python3正则匹配re.split,re.finditer及re.findall函数用法.分享给大家供大家参考,具体如下: re.split re.finditer re.finda ...

  5. php正则匹配函数字符串长度,PHP中preg_match函数正则匹配的字符串长度问题

    PHP中preg_match函数正则匹配的字符串长度问题 发布于 2015-10-25 10:24:29 | 166 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...

  6. php正则匹配preg_match,php正则表达式中preg_match函数的详解

    我们之前给大家介绍了php正则表达式的使用,入门,以及验证邮箱地址,那么我们今天就想大家介绍php正则表达式中的函数preg_match,preg_match函数在php正则表达式中的规则是怎样的? ...

  7. java正则匹配英文句号_「正则表达式」王国奇遇记

    第一回 初来乍到 NPC: "欢迎来到正则表达式的国度,勇士!这里的每一个人都使用正则表达式,我是这里的 NPC,每一个来到这里的人都将由我代为介绍正则世界的规则,至于能领悟到何种境界,就看 ...

  8. php正则匹配js中变量_Postgresql 中的 正则表达式 模式匹配

    参考链接: PostgreSQL 模式匹配​www.yiibai.com 1. like string LIKE pattern [ESCAPE escape-character] string NO ...

  9. Python中正则匹配使用findall时的注意事项

    在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下. 比如说有一个字符串  "123@qq.comaaa@163.combbb@126.comasdf111@a ...

最新文章

  1. show-busy-java-threads查找CPU占用高
  2. 软件测试nextdata程序,Nextdata测试用例及源程序.doc
  3. Chrome 隐藏 SSL 证书信息 禁止禁用 DRM
  4. 【LeetCode笔记】剑指 Offer 57- II. 和为 s 的连续正数序列(Java、滑动窗口、二刷)
  5. 第14章 火柴人的无尽冒险(《C和C++游戏趣味编程》配套教学视频)
  6. ORACLE查询通用查询被锁对象以及解锁方案
  7. Flink状态管理和容错机制介绍
  8. 企业落地Kubernetes的问题与对策
  9. FlightGear Flight Simulator
  10. Fences 2.1 - 高效实用的桌面图标栅栏分类管理软件神器 (桌面图标再多也不会乱)
  11. 信息学奥赛NOIP/CSP-J初赛知识点汇总
  12. 迅雷beat下载为php,2019苹果迅雷beat版链接下载地址-迅雷ios内测版ios13企业信任版app下载官方最新beta手机版-迅雷ios永久稳定版西西软件下载...
  13. matlab 删除plot上的图,matlab删除部分图例
  14. 11 MySQL视图
  15. python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口...
  16. 投影仪与电视的C位之争,电视会成为下一个被淘汰的电器吗?
  17. 103000大写加零吗_103000怎样大写不写零
  18. ros 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。
  19. T-SNE可视化高维数据,亮瞎审稿人
  20. Android App Shortcuts

热门文章

  1. mkisofs简单定制linux iso
  2. 查询所有的存储过程哪些中包含某个字符串
  3. 基于Fixed定位的框选功能
  4. 解决查看框架源码时 class file editor source not found
  5. jvm系列(十):如何优化Java GC「译」
  6. linux 常用命令集
  7. I2C总线学习(四)--读写过程
  8. DNS智能解析的另类使用 让搜索引擎更快更好的收录您的网站
  9. EXCEL文件单独打开和单独关闭
  10. 信息管理(Information Management)