Do two rosters offer the same tools, in the same order?
The host compares rosters by CONTENT rather than by identity. Identity alone is tempting —
it is one === — but it is wrong in both directions: a consumer binding a freshly-built
array literal produces a new reference every change-detection pass (so identity re-clamps
forever, fighting the user for the active tool), while a consumer that mutates ONE array in
place produces the same reference with different contents (so identity never re-clamps, and
a roster that just dropped the held tool goes unenforced). Eleven elements make the content
compare free.
== null deliberately, not === null: see IsToolAllowed.
Do two rosters offer the same tools, in the same order?
The host compares rosters by CONTENT rather than by identity. Identity alone is tempting — it is one
===— but it is wrong in both directions: a consumer binding a freshly-built array literal produces a new reference every change-detection pass (so identity re-clamps forever, fighting the user for the active tool), while a consumer that mutates ONE array in place produces the same reference with different contents (so identity never re-clamps, and a roster that just dropped the held tool goes unenforced). Eleven elements make the content compare free.== nulldeliberately, not=== null: see IsToolAllowed.