有多少人知道 match 的参数不能是字符串

2017-07-16 02:58:48 +08:00
 autoxbc

很多人会这么写字符串匹配,结果似乎也对

'abcde'.match('cd')
// Array ["cd"]

实际这是错的,或者说某些情况是错的,来个例子

// 匹配京东全站
if( location.hostname.match('.jd.com') )
// 反例
'www.xjd.com'.match('.jd.com')
// Array ["xjd.com"]

道理很简单,match 的参数必须是正则,如果不是,会被隐式转换为正则。

因为是隐式转换,写的人可能没注意到,转换的结果可能和预期的不一致。

这里 dot 应该是纯字符串的一部分,被转换成了通配符。

new RegExp('.jd.com')
->   /.jd.com/ 

坑的是匹配结果放宽而不是收窄,所以调试不会出错,但是边界不对了。


应对方法是用 indexOf

'www.xjd.com'.indexOf('.jd.com') !== -1
// false

但是写起来有点长,多出 7 个字符(算上空格),我一般这么写

!!( 'www.xjd.com'.indexOf('.jd.com')+1 )
// false

因为基本都是写在 if 语句里的,所以不用显示转换

if( location.hostname.indexOf('.jd.com')+1 )

当然也可以用 match 加手动转义,但是太丑了

'www.xjd.com'.match('\\.jd\\.com')
// null
'www.xjd.com'.match(/\.jd\.com/)
// null

大家有什么好的方法说一下

3677 次点击
所在节点    JavaScript
23 条回复
xiaojunjor
2017-07-17 13:28:35 +08:00
会隐式转为正则,就代表可以传字符串,报错才叫做不能传字符串
marcong95
2017-07-17 16:18:15 +08:00
@autoxbc “ match 是什么是由 match 的行为决定的”这显然不太合理,match 一词取得是匹配之意,匹配字符串是什么概念?一般的理解都是 match a pattern 吧。所以 match 作为 find 何来符合语义一说? func && func()也只是可读性比较差,其实并没有不符合 JS 的 specs ……

关于鄙视链的问题,我觉得中文英文才是槽点,w3school 的确是各种错误,鄙视之并无不可。。
autoxbc
2017-07-17 16:55:15 +08:00
@araraloren 我无意给谁做辩护,有错误可以改,不要说人家是垃圾。第三方也没有能力判断是否有授权,不应该下断言。

@xiaojunjor 除了解释器报错,还应该有编码规范。作为动态语言用户,我接受隐式转换,除非会引发二义性。

@marcong95 我的意思是给 match 传正则参数,得到的匹配结果隐式转换为布尔值,是符合语义的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375660

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX