◆ match は文字列でも正規表現検索
◆ replace は文字列は文字列で検索 

match

match ではこんな感じで正規表現で検索ができます
"abc".match(/a.c/)
// ["abc"]

正規表現リテラルじゃなくて 普通に文字列を書いて渡すと
"abc".match("abc")
// ["abc"]

ちゃんとマッチできています

ではここに正規表現を書いてみると?
"abc".match("a.c")
// ["abc"]

"012345".match("[0-3]*")
// ["0123"]
正規表現として検索されています
内部で new RegExp に渡してから使ってるみたいですね

ただの文字列のつもりで「.」などの記号を書くとおかしなことになりそうです

replace

replace の場合は
"abc".replace(/a.c/, function(match){
console.log("match:", match)
return "*"
})
// match: abc
// "*"
"abc".replace("a.c", function(match){
console.log("match:", match)
return "*"
})
// abc

文字列の場合は正規表現としてマッチしません
文字列は文字列で検索されています

まとめ

match は正規表現用のマッチング(検索)する関数なので文字列でも正規表現扱いされます

ただの文字列で検索する場合は

含んでいるかの true/false がほしい → .includes
どこにあるか知りたい → .indexOf / .lastIndexOf
先頭が一致するか知りたい → .startsWith
末尾が一致するか知りたい → .endsWith
マッチした文字がほしい → ただの文字列検索なのでクエリ自身がマッチした文字です

という感じで専用のメソッドをつかいましょう

replace は置換用のメソッドでただの文字列も正規表現もこれひとつなので引数の型に応じて結果が変わります

言われてみると当たり前なのかもしれませんけど ミスで match に文字列を渡すように書いていて それに気づかず replace に置き換えてなぜかマッチしなくなった! という悲劇が起きるかもしれないです   というか起きました

match と replace を切り替えて動きがおかしくなったら型を確認してみるといいかもです


あと search も match と一緒で文字列渡しても 正規表現として検索されます
indexOf の正規表現版です
last 版はないです