MDN 关于 indexOf 与 search 的介绍

indexOf() 方法返回调用它的 String 对象中第一次出现的指定值的索引,从 fromIndex 处进行搜索。如果未找到该值,则返回 -1。
search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。

问题引入

在使用某转种脚本时出现问题, debug 之后定位到是 string.search() 引起的问题。
例子如下

// 确定在出现在 '主  演' 之后第一次出现 ###PICTURE### 时的 index
const descr = `###PICTURE###
###PICTURE###
###PICTURE###
◎译  名 疯狂的麦克斯 2 / 冲锋飞车队 2 / 冲锋追魂手 2 / 疯狂麦克斯 2 / 开路先锋 (港)/ 迷雾追魂手 2 (台)/Mad Max 2: The Road Warrior
◎片  名 Mad Max 2
◎年  代 1981
◎产  地 澳大利亚
◎类  别 动作 / 科幻 / 惊悚 / 冒险
◎语  言 英语
◎上映日期 1981-12-24 (澳大利亚)
◎IMDb 评分 7.6/10 from 174502 users
◎IMDb 链接 https://www.imdb.com/title/tt0082694/
◎豆瓣评分 7.3/10 from 16733 users
◎豆瓣链接 https://movie.douban.com/subject/1292453/
◎片  长 95 分钟
◎导  演 乔治・米勒 George Miller
◎编  剧 乔治・米勒 George Miller / 特里・海斯 Terry Hayes / Brian Hannant Brian Hannant
◎主  演 梅尔・吉布森 Mel Gibson
      布鲁斯・斯宾斯 Bruce Spence
      弗农・威尔斯 Vernon Wells
      维吉尼亚・海伊 Virginia Hey
      威廉・扎帕 William Zappa
      Max Phipps Max Phipps
      阿基・惠特利 Arkie Whiteley
      Steve J. Spears Steve J. Spears
      Syd Heylen Syd Heylen
      泰勒・科宾 Tyler Coppin
      Harold Baigent Harold Baigent

◎标  签 动作 | 澳大利亚 | 科幻 | 公路 | 梅尔・吉布森 | 冒险 | 1981 | 暴力

◎简  介
  在未来,因为战争和资源的枯竭,建立在石油之上的工业社会陷入崩溃,人们为了汽油展开生死争夺,这是恐怖如地狱的末世景象。失去了朋友和亲人的麦克斯(梅尔・吉布森 Mel Gibson 饰)以车为家,继续和公路骑士们无休无止的战斗。然而因为他的 V8 失去燃料,麦克斯只得离开公路,在一个陷阱猎手的指引下,前往一处石油钻井寻找燃料。荒漠中的人们,为了保卫钻井,建立了防御设施对抗骑士休曼格斯一伙,麦克斯从骑士们手中救出了一位奄奄一息的钻井保卫者,结果反被钻井守卫者们扣留,而此时,休曼格斯率领手下将钻井团团包围,危急关头,麦克斯设计对抗休曼格斯……
###PICTURE###
###PICTURE###
###PICTURE###`
const introduction = descr.match(/(◎主.*演[\s\S]*?)###PICTURE###/)[1];
const index = descr.search(introduction) + introduction.length;
console.log(descr.slice(0, index));

输出以下内容, 发现不符合预期:

###PICTURE###
###PICTURE###
###PICTURE###
◎译  名 疯狂的麦克斯 2 / 冲锋飞车队 2 / 冲锋追魂手 2 / 疯狂麦克斯 2 / 开路先锋 (港)/ 迷雾追魂手 2 (台)/Mad Max 2: The Road Warrior
◎片  名 Mad Max 2
◎年  代 1981
◎产  地 澳大利亚
◎类  别 动作 / 科幻 / 惊悚 / 冒险
◎语  言 英语
◎上映日期 1981-12-24 (澳大利亚)
◎IMDb 评分 7.6/10 from 174502 users
◎IMDb 链接 https://www.imdb.com/title/tt0082694/
◎豆瓣评分 7.3/10 from 16733 users
◎豆瓣链接 https://movie.douban.com/subject/1292453/
◎片  长 95 分钟
◎导  演 乔治・米勒 George Miller
◎编  剧 乔治・米勒 George Miller / 特里・海斯 Terry Hayes / Brian Hannant Brian Hannant
◎主  演 梅尔・吉布森 Mel Gibson
      布鲁斯・斯宾斯 Bruce Spence
      弗农・威尔斯 Vernon Wells
      维吉尼亚・海伊 Virginia Hey
      威廉・扎帕 William Zappa
      Max Phipps Max Phipps
      阿基・惠特利 Arkie Whiteley
      Steve J. Spears Steve J. Spears
      Syd Heylen Syd Heylen
      泰勒・科宾 Tyler Coppin
      Harold Baigent Harold Baigent

◎标  签 动作 |

尝试将 search 替换为 indexOf 后, 输出符合预期

###PICTURE###
###PICTURE###
###PICTURE###
◎译  名 疯狂的麦克斯 2 / 冲锋飞车队 2 / 冲锋追魂手 2 / 疯狂麦克斯 2 / 开路先锋 (港)/ 迷雾追魂手 2 (台)/Mad Max 2: The Road Warrior
◎片  名 Mad Max 2
◎年  代 1981
◎产  地 澳大利亚
◎类  别 动作 / 科幻 / 惊悚 / 冒险
◎语  言 英语
◎上映日期 1981-12-24 (澳大利亚)
◎IMDb 评分 7.6/10 from 174502 users
◎IMDb 链接 https://www.imdb.com/title/tt0082694/
◎豆瓣评分 7.3/10 from 16733 users
◎豆瓣链接 https://movie.douban.com/subject/1292453/
◎片  长 95 分钟
◎导  演 乔治・米勒 George Miller
◎编  剧 乔治・米勒 George Miller / 特里・海斯 Terry Hayes / Brian Hannant Brian Hannant
◎主  演 梅尔・吉布森 Mel Gibson
      布鲁斯・斯宾斯 Bruce Spence
      弗农・威尔斯 Vernon Wells
      维吉尼亚・海伊 Virginia Hey
      威廉・扎帕 William Zappa
      Max Phipps Max Phipps
      阿基・惠特利 Arkie Whiteley
      Steve J. Spears Steve J. Spears
      Syd Heylen Syd Heylen
      泰勒・科宾 Tyler Coppin
      Harold Baigent Harold Baigent

◎标  签 动作 | 澳大利亚 | 科幻 | 公路 | 梅尔・吉布森 | 冒险 | 1981 | 暴力

◎简  介
  在未来,因为战争和资源的枯竭,建立在石油之上的工业社会陷入崩溃,人们为了汽油展开生死争夺,这是恐怖如地狱的末世景象。失去了朋友和亲人的麦克斯(梅尔・吉布森 Mel Gibson 饰)以车为家,继续和公路骑士们无休无止的战斗。然而因为他的 V8 失去燃料,麦克斯只得离开公路,在一个陷阱猎手的指引下,前往一处石油钻井寻找燃料。荒漠中的人们,为了保卫钻井,建立了防御设施对抗骑士休曼格斯一伙,麦克斯从骑士们手中救出了一位奄奄一息的钻井保卫者,结果反被钻井守卫者们扣留,而此时,休曼格斯率领手下将钻井团团包围,危急关头,麦克斯设计对抗休曼格斯……

答案

出现的问题是解决了, 但是依然想明白是为什么出现这种情况
在百度 & 谷歌相关问题后, 没有找到类似例子, 只能自己继续 debug

console.log(descr.slice(0, descr.search(introduction)));

输出

###PICTURE###
###PICTURE###
###PICTURE###
◎译  名 疯狂的麦克斯 2 / 冲锋飞车队 2 / 冲锋追魂手 2 / 疯狂麦克斯 2 / 开路先锋 (港)/ 迷雾追魂手 2 (台)/Mad Max 2: The Road Warrior
◎片  名 Mad Max 2
◎年  代 1981
◎产  地 澳大利亚
◎类  别 动作 /

好的, 问题定位到 ‘科幻’, 考虑到 search 是匹配正则表达式, 以及简介内在科幻左右出现的 ‘|’, 似乎找到了答案:
search 方法会强制使用正则表达式匹配, 即使输入的是 string, 这样一来在本例子种可以近似看为 descr.search(‘asdsadas|科幻|fioajoiad’), 这样下来 search 方法实际返回的是第一次出现 ‘科幻’ 的位置.

'asodpasp科幻dasdasdsda动作|科幻|爱情'.search('dsda动作|科幻|爱情'); // 8, asodpasp