diff --git a/.changeset/tidy-select-spreads.md b/.changeset/tidy-select-spreads.md
new file mode 100644
index 0000000000..3b14dc5d34
--- /dev/null
+++ b/.changeset/tidy-select-spreads.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: preserve select selection when spread attributes omit value
diff --git a/packages/svelte/src/internal/client/dom/elements/bindings/select.js b/packages/svelte/src/internal/client/dom/elements/bindings/select.js
index eb26062653..e390e23ea0 100644
--- a/packages/svelte/src/internal/client/dom/elements/bindings/select.js
+++ b/packages/svelte/src/internal/client/dom/elements/bindings/select.js
@@ -56,8 +56,10 @@ export function select_option(select, value, mounting = false) {
*/
export function init_select(select) {
var observer = new MutationObserver(() => {
- // @ts-ignore
- select_option(select, select.__value);
+ if ('__value' in select) {
+ // @ts-ignore
+ select_option(select, select.__value);
+ }
// Deliberately don't update the potential binding value,
// the model should be preserved unless explicitly changed
});
diff --git a/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js
new file mode 100644
index 0000000000..8bc2f11e26
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/_config.js
@@ -0,0 +1,25 @@
+import { flushSync } from 'svelte';
+import { ok, test } from '../../test';
+
+export default test({
+ mode: ['client', 'hydrate'],
+
+ async test({ assert, component, target }) {
+ const select = target.querySelector('select');
+ ok(select);
+
+ assert.equal(select.selectedIndex, 0);
+
+ component.toggle();
+ flushSync();
+ await Promise.resolve();
+
+ assert.equal(select.selectedIndex, 0);
+
+ component.toggle();
+ flushSync();
+ await Promise.resolve();
+
+ assert.equal(select.selectedIndex, 0);
+ }
+});
diff --git a/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte
new file mode 100644
index 0000000000..229ce4fb73
--- /dev/null
+++ b/packages/svelte/tests/runtime-legacy/samples/select-spread-preserve-selection/main.svelte
@@ -0,0 +1,16 @@
+
+
+