Why IsMenuCurrent and HasMenuCurrent need two arguments?

That’s a good question. Each menu entry has a .Menu method, so it knows to which menu object it belongs. These two are, as far as I can tell, equivalent:

{{ $currentPage := . }}
{{ range site.Menus.main }}
  {{ $currentPage.IsMenuCurrent .Menu . }}  --> returns true/false
{{ end }}
{{ $currentPage := . }}
{{ range site.Menus.main }}
  {{ $currentPage.Eq .Page }}  --> returns true/false
{{ end }}