diff --git a/.changeset/thirty-groups-rhyme.md b/.changeset/thirty-groups-rhyme.md new file mode 100644 index 0000000000..5a6bde7677 --- /dev/null +++ b/.changeset/thirty-groups-rhyme.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: make string coercion consistent to `toString` diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js index 4316403ba6..cb152ed9c1 100644 --- a/packages/svelte/src/internal/client/render.js +++ b/packages/svelte/src/internal/client/render.js @@ -45,12 +45,12 @@ export function set_should_intro(value) { */ export function set_text(text, value) { // For objects, we apply string coercion (which might make things like $state array references in the template reactive) before diffing - var str = value == null ? '' : typeof value === 'object' ? value + '' : value; + var str = value == null ? '' : typeof value === 'object' ? `${value}` : value; // @ts-expect-error if (str !== (text.__t ??= text.nodeValue)) { // @ts-expect-error text.__t = str; - text.nodeValue = str + ''; + text.nodeValue = `${str}`; } } diff --git a/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/_config.js b/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/_config.js new file mode 100644 index 0000000000..01ef02510a --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/_config.js @@ -0,0 +1,6 @@ +import { test } from '../../test'; + +export default test({ + html: 'toString

toString

[toString]

toString', + async test() {} +}); diff --git a/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/main.svelte b/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/main.svelte new file mode 100644 index 0000000000..601e7ce9fb --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/set-text-stable-coercion/main.svelte @@ -0,0 +1,22 @@ + + + +{value} + + +

{value}

+ + +

[{value}]

+ + +{#if 1} + {value} +{/if}