Zerowidth CleanerAll measured guides

CLAUDE WATERMARK REMOVER · PRACTICAL TEST

Why does Array.from call my mapper three times while map calls it twice?

Our three-slot sparse array has a hole at index one. map skips that absent slot and preserves the hole; Array.from visits it as undefined and writes the explicit missing label. Both keep the array length at three.

Tested October 26, 2026 · v24.22.1 · 4 measured runs

Open the Claude text cleaner · Full measured data

Code-point comparison for Marked value

Measured inputs and outputs

These are locally constructed test strings, not evidence that Claude inserts these characters. We executed the saved homepage script snapshot with a minimal DOM harness and compared exact strings. The invisible-checkbox state and dash mode appear in each row. The observations below test this page's specific question. Destination observations run independently on the exact input and cleaned strings in the recorded Node runtime. We make no detector-score or statistical-watermark removal claim.

Before and after observations; full code points and strings are in the JSON download.
Fixture and modeInput string and code pointsOutput and cleaner statusObserved before / after
Marked value
direct string / keep / invisible true
"A​B"
U+0041 U+200B U+0042
"AB"
Removed 1 invisible character
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"A​B\",null,\"A​B\"]","fromJSON":"[\"A​B\",\"missing\",\"A​B\"]"}
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"AB\",null,\"AB\"]","fromJSON":"[\"AB\",\"missing\",\"AB\"]"}
Plain value
direct string / keep / invisible true
"AB"
U+0041 U+0042
"AB"
No selected invisible characters found
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"AB\",null,\"AB\"]","fromJSON":"[\"AB\",\"missing\",\"AB\"]"}
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"AB\",null,\"AB\"]","fromJSON":"[\"AB\",\"missing\",\"AB\"]"}
Empty value
direct string / keep / invisible true
""
""
No selected invisible characters found
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"\",null,\"\"]","fromJSON":"[\"\",\"missing\",\"\"]"}
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\"\",null,\"\"]","fromJSON":"[\"\",\"missing\",\"\"]"}
Comma text
direct string / keep / invisible true
","
U+002C
","
No selected invisible characters found
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\",\",null,\",\"]","fromJSON":"[\",\",\"missing\",\",\"]"}
{"sourceKeys":["0","2"],"mapCalls":2,"fromCalls":3,"mappedKeys":["0","2"],"fromKeys":["0","1","2"],"mappedJSON":"[\",\",null,\",\"]","fromJSON":"[\",\",\"missing\",\",\"]"}

Callback counts expose what the iteration actually visited

The observer constructs an array with supplied text at indexes zero and two, leaving index one absent. Its sourceKeys contains only zero and two. The map callback runs twice and mappedKeys still excludes index one. Array.from runs its callback three times and fromKeys includes all three indexes. The callback substitutes the literal missing only when its argument is undefined. Because map never calls it for the hole, that substitution cannot fill the missing position on the map branch. The different callback counts are the direct evidence.

JSON alone conceals the surviving hole

The mapped JSON shows null in the middle because the result still contains an absent array position. The Array.from JSON shows the explicit missing string there instead. In the empty-value control the first and last positions remain empty strings and still receive callbacks, separating empty content from a missing slot. The comma reference stays one string in each occupied position. The marked source changes to AB in both branches after the actual homepage callback, but their counts and keys remain different. No filtering operation removes a position and no flat operation shortens the array.

Choose a missing-position policy before normalizing rows

If every column needs a concrete placeholder, decide which iteration operation actually visits absent positions. If a hole has a distinct meaning, converting it to an explicit value changes the data model. Neither behavior is inherently correct for every export schema. This page uses a plain array with the standard iterator and no inherited numeric properties; custom iterators, getters and prototype changes would need additional fixtures. The mapper itself performs only a simple undefined comparison and returns either the original string or a fixed label.

Keep structural and textual measurements together

The saved evidence includes keys, callback counts and JSON spellings because each answers a different question. A developer checking only the cleaned string could miss the structural change entirely. The cleaner never receives an array and is not responsible for the observer choice between map and Array.from. Earlier flat coverage measures hole removal and length reduction; this new comparison preserves length while changing callback visitation and ownership. All examples are authored diagnostics, not Claude samples, and neither the mapper nor its placeholder measures statistical watermark removal.

Reproduce this test

Save reproduce.cjs and tested-app.js in the same folder. Run the command below with Node.js. The harness prints its runtime, script SHA-256 and every measured row. Compare those rows with the original record. Using a newer script or runtime creates a new experiment; retain the version information with your rerun.

node reproduce.cjs

Reference and next check

ECMAScript Array.from provides the relevant primary definition. The table and fixture analysis are original measurements. For broader inspection, use our Unicode inspector. Read the scope distinction before interpreting cleanup as a watermark result.