fix: make string coercion consistent to `toString` (#17774)

Closes #17758

### Before submitting the PR, please make sure you do the following

- [x] It's really useful if your PR references an issue where it is
discussed ahead of time. In many cases, features are absent for a
reason. For large changes, please create an RFC:
https://github.com/sveltejs/rfcs
- [x] Prefix your PR title with `feat:`, `fix:`, `chore:`, or `docs:`.
- [x] This message body should clearly illustrate what problems it
solves.
- [x] Ideally, include a test that fails without this PR but passes with
it.
- [x] If this PR changes code within `packages/svelte/src`, add a
changeset (`npx changeset`).

### Tests and linting

- [x] Run the tests with `pnpm test` and lint the project with `pnpm
lint`
pull/17779/head
Paolo Ricciuti 2 days ago committed by GitHub
parent 4e29eee4b0
commit f67d03df5b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: make string coercion consistent to `toString`

@ -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}`;
}
}

@ -0,0 +1,6 @@
import { test } from '../../test';
export default test({
html: 'toString <p>toString</p> <p>[toString]</p> toString',
async test() {}
});

@ -0,0 +1,22 @@
<script>
class Widget {
toString() { return "toString" }
valueOf() { return "valueOf" }
}
const value = new Widget();
</script>
<!-- case 1 -->
{value}
<!-- case 2 -->
<p>{value}</p>
<!-- case 3 -->
<p>[{value}]</p>
<!-- case 4 -->
{#if 1}
{value}
{/if}
Loading…
Cancel
Save