{"id":39300,"date":"2025-11-17T12:30:14","date_gmt":"2025-11-17T20:30:14","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=39300"},"modified":"2025-12-12T15:26:14","modified_gmt":"2025-12-12T23:26:14","slug":"what-is-state-in-javascript","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/","title":{"rendered":"What is State in JavaScript?"},"content":{"rendered":"\n<p>Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In community threads, you often see devs wrestle with questions like where to store data, how to update it predictably, and how to keep the UI in sync.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Question:<\/h2>\n\n\n\n<p><em>What is state in JavaScript? How is it different from props or plain variables, where should it live in a web app, and what are reliable patterns to update state without bugs? I use both vanilla JS and frameworks like React, so examples for both would help.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Answer:<\/h2>\n\n\n\n<p>In JavaScript, state is the data that represents the current reality of your application at a given time. When state changes, your app behavior or UI should update to reflect it. State can be ephemeral in memory, persisted in storage, or fetched from servers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Common Types of State<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Local state.<\/strong> Variables captured in a closure or inside a component to track UI specifics like a modal open flag.<\/li>\n\n\n\n<li><strong>Application state.<\/strong> Global data shared across screens, such as an authenticated user or cart items.<\/li>\n\n\n\n<li><strong>Server state. <\/strong>Data that comes from APIs and can become stale, requiring caching, revalidation, and error handling.<\/li>\n\n\n\n<li><strong>URL state. <\/strong>Information encoded in the URL query or hash that controls filters, pagination, or selected items.<\/li>\n\n\n\n<li><strong>Persisted state.<\/strong> Data saved to <code>localStorage<\/code> or <code>IndexedDB<\/code> that survives page reloads.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Guiding Principles<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Single source of truth. <\/strong>Keep each piece of state in one place and derive the rest when possible.<\/li>\n\n\n\n<li><strong>Immutability on update.<\/strong> Avoid in-place mutation to make changes predictable and easier to debug.<\/li>\n\n\n\n<li><strong>Pure transitions. <\/strong>Prioritize using pure functions to transform the previous state into the next state based on an action.<\/li>\n\n\n\n<li><strong>Explicit side effects. <\/strong>Perform IO like fetches or storage writes around state transitions, not inside them.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Vanilla JS Example: Local State With a Simple Store<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Minimal store pattern using a closure<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">createStore<\/span>(<span class=\"hljs-params\">initialState<\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">let<\/span> state = initialState;\n\u00a0 <span class=\"hljs-keyword\">const<\/span> subs = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Set<\/span>();\n\n\u00a0 <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getState<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{ <span class=\"hljs-keyword\">return<\/span> state; }\n\u00a0 <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">subscribe<\/span>(<span class=\"hljs-params\">fn<\/span>) <\/span>{ subs.add(fn); <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> subs.delete(fn); }\n\u00a0 <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">setState<\/span>(<span class=\"hljs-params\">updater<\/span>) <\/span>{\n\u00a0 \u00a0 <span class=\"hljs-keyword\">const<\/span> next = <span class=\"hljs-keyword\">typeof<\/span> updater === <span class=\"hljs-string\">'function'<\/span> ? updater(state) : updater;\n\u00a0 \u00a0 <span class=\"hljs-keyword\">if<\/span> (next !== state) {\n\u00a0 \u00a0 \u00a0 state = next;\n\u00a0 \u00a0 \u00a0 subs.forEach(<span class=\"hljs-function\"><span class=\"hljs-params\">fn<\/span> =&gt;<\/span> fn(state));\n\u00a0 \u00a0 }\n\u00a0 }\n\n\u00a0 <span class=\"hljs-keyword\">return<\/span> { getState, setState, subscribe };\n}\n\n<span class=\"hljs-comment\">\/\/ Counter example<\/span>\n<span class=\"hljs-keyword\">const<\/span> store = createStore({ <span class=\"hljs-attr\">count<\/span>: <span class=\"hljs-number\">0<\/span> });\n\n<span class=\"hljs-keyword\">const<\/span> $value = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'value'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> $inc = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'inc'<\/span>);\n<span class=\"hljs-keyword\">const<\/span> $dec = <span class=\"hljs-built_in\">document<\/span>.getElementById(<span class=\"hljs-string\">'dec'<\/span>);\n\nstore.subscribe(<span class=\"hljs-function\"><span class=\"hljs-params\">s<\/span> =&gt;<\/span> { $value.textContent = s.count; });\n$inc.addEventListener(<span class=\"hljs-string\">'click'<\/span>, () =&gt; store.setState(<span class=\"hljs-function\"><span class=\"hljs-params\">s<\/span> =&gt;<\/span> ({ ...s, <span class=\"hljs-attr\">count<\/span>: s.count + <span class=\"hljs-number\">1<\/span> })));\n$dec.addEventListener(<span class=\"hljs-string\">'click'<\/span>, () =&gt; store.setState(<span class=\"hljs-function\"><span class=\"hljs-params\">s<\/span> =&gt;<\/span> ({ ...s, <span class=\"hljs-attr\">count<\/span>: s.count - <span class=\"hljs-number\">1<\/span> })));\n\n<span class=\"hljs-comment\">\/\/ Initial render<\/span>\n$value.textContent = store.getState().count;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">React Example: Component State and Immutable Updates<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">import<\/span> { useState, useReducer } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'react'<\/span>;\n\n<span class=\"hljs-comment\">\/\/ Simple array updates<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Cart<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">const<\/span> &#91;items, setItems] = useState(&#91;]);\n\u00a0 <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">addItem<\/span>(<span class=\"hljs-params\">item<\/span>) <\/span>{\n\u00a0 \u00a0 setItems(<span class=\"hljs-function\"><span class=\"hljs-params\">prev<\/span> =&gt;<\/span> &#91;...prev, item]); <span class=\"hljs-comment\">\/\/ do not mutate prev directly<\/span>\n\u00a0 }\n\u00a0 <span class=\"hljs-keyword\">return<\/span> <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onClick<\/span>=<span class=\"hljs-string\">{()<\/span> =&gt;<\/span> addItem({ id: Date.now() })}&gt;Add item<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span><\/span>;\n}\n\n<span class=\"hljs-comment\">\/\/ Complex transitions with useReducer<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">reducer<\/span>(<span class=\"hljs-params\">state, action<\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">switch<\/span> (action.type) {\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'add'<\/span>: <span class=\"hljs-keyword\">return<\/span> { ...state, <span class=\"hljs-attr\">count<\/span>: state.count + <span class=\"hljs-number\">1<\/span> };\n\u00a0 \u00a0 <span class=\"hljs-keyword\">case<\/span> <span class=\"hljs-string\">'sub'<\/span>: <span class=\"hljs-keyword\">return<\/span> { ...state, <span class=\"hljs-attr\">count<\/span>: <span class=\"hljs-built_in\">Math<\/span>.max(<span class=\"hljs-number\">0<\/span>, state.count - <span class=\"hljs-number\">1<\/span>) };\n\u00a0 \u00a0 <span class=\"hljs-keyword\">default<\/span>: <span class=\"hljs-keyword\">return<\/span> state;\n\u00a0 }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">Counter<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">const<\/span> &#91;state, dispatch] = useReducer(reducer, { <span class=\"hljs-attr\">count<\/span>: <span class=\"hljs-number\">0<\/span> });\n\u00a0 <span class=\"hljs-keyword\">return<\/span> (\n\u00a0 \u00a0 <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span>&gt;<\/span>\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span>&gt;<\/span>{state.count}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onClick<\/span>=<span class=\"hljs-string\">{()<\/span> =&gt;<\/span> dispatch({ type: 'add' })}&gt;+<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\u00a0 \u00a0 \u00a0 <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">onClick<\/span>=<span class=\"hljs-string\">{()<\/span> =&gt;<\/span> dispatch({ type: 'sub' })}&gt;-<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n\u00a0 \u00a0 <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span>&gt;<\/span><\/span>\n\u00a0 );\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Async Updates and Race Conditions<\/h3>\n\n\n\n<p>Server state can arrive out of order. Cancel in-flight requests when a new one starts to prevent stale updates.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">let<\/span> controller = <span class=\"hljs-keyword\">new<\/span> AbortController();\n\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">search<\/span>(<span class=\"hljs-params\">query<\/span>) <\/span>{\n\u00a0 controller.abort();\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span class=\"hljs-comment\">\/\/ cancel previous<\/span>\n\u00a0 controller = <span class=\"hljs-keyword\">new<\/span> AbortController();\n\u00a0 <span class=\"hljs-keyword\">const<\/span> res = <span class=\"hljs-keyword\">await<\/span> fetch(<span class=\"hljs-string\">`\/api?q=<span class=\"hljs-subst\">${<span class=\"hljs-built_in\">encodeURIComponent<\/span>(query)}<\/span>`<\/span>, { <span class=\"hljs-attr\">signal<\/span>: controller.signal });\n\u00a0 <span class=\"hljs-keyword\">const<\/span> data = <span class=\"hljs-keyword\">await<\/span> res.json();\n\u00a0 renderResults(data);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Persisting State<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">save<\/span>(<span class=\"hljs-params\">key, value<\/span>) <\/span>{\n\u00a0 localStorage.setItem(key, <span class=\"hljs-built_in\">JSON<\/span>.stringify(value));\n}\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">load<\/span>(<span class=\"hljs-params\">key, fallback<\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">try<\/span> { <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">JSON<\/span>.parse(localStorage.getItem(key)) ?? fallback; }\n\u00a0 <span class=\"hljs-keyword\">catch<\/span> { <span class=\"hljs-keyword\">return<\/span> fallback; }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Using Cloudinary With State<\/h3>\n\n\n\n<p>Suppose your app tracks user preference and network info in state, then builds the right transformation URL on the fly.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ Example: pick format and width from state to construct a Cloudinary URL<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">buildImageUrl<\/span>(<span class=\"hljs-params\">{ format, width, publicId }<\/span>) <\/span>{\n\u00a0 <span class=\"hljs-keyword\">const<\/span> base = <span class=\"hljs-string\">'https:\/\/res.cloudinary.com\/demo\/image\/upload'<\/span>;\n\u00a0 <span class=\"hljs-keyword\">const<\/span> transform = <span class=\"hljs-string\">`f_<span class=\"hljs-subst\">${format}<\/span>,q_auto,w_<span class=\"hljs-subst\">${width}<\/span>,c_fill`<\/span>;\n\u00a0 <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">`<span class=\"hljs-subst\">${base}<\/span>\/<span class=\"hljs-subst\">${transform}<\/span>\/<span class=\"hljs-subst\">${publicId}<\/span>.jpg`<\/span>; <span class=\"hljs-comment\">\/\/ publicId can omit extension if configured<\/span>\n}\n\n<span class=\"hljs-comment\">\/\/ State-driven rendering<\/span>\n<span class=\"hljs-keyword\">const<\/span> state = { <span class=\"hljs-attr\">prefersWebP<\/span>: <span class=\"hljs-literal\">true<\/span>, <span class=\"hljs-attr\">width<\/span>: <span class=\"hljs-number\">800<\/span>, <span class=\"hljs-attr\">publicId<\/span>: <span class=\"hljs-string\">'sample'<\/span> };\n<span class=\"hljs-keyword\">const<\/span> format = state.prefersWebP ? <span class=\"hljs-string\">'webp'<\/span> : <span class=\"hljs-string\">'jpg'<\/span>;\n<span class=\"hljs-keyword\">const<\/span> url = buildImageUrl({ format, <span class=\"hljs-attr\">width<\/span>: state.width, <span class=\"hljs-attr\">publicId<\/span>: state.publicId });\n<span class=\"hljs-comment\">\/\/ &lt;img src={url} alt=\"Product\" \/&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This ties your UI state directly to media delivery: toggling a quality slider, switching lightbox sizes, or adapting to slow networks can update transformation parameters and keep experiences snappy and consistent.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TL;DR<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>State is the data that drives behavior and UI at a point in time.<\/li>\n\n\n\n<li>Keep a single source of truth, update immutably, and isolate side effects.<\/li>\n\n\n\n<li>Use closures or small stores in vanilla JS, and hooks or reducers in React for predictable updates.<\/li>\n\n\n\n<li>Handle async with cancellation to avoid stale data, and persist only what you must.<\/li>\n\n\n\n<li>Let state drive media delivery decisions like format and size to improve performance and UX.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Learn More<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/cloudinary.com\/tools\/png-to-webp\">PNG to WebP Converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/webp-to-jpg\">WebP to JPG Converter<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/tools\/image-upscale\">Image Upscale<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/cloudinary.com\/guides\/video\/video-engineering\">Video Engineering Guide<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ready to let your app state drive smarter media delivery and performance? <a href=\"https:\/\/cloudinary.com\/users\/register_free\">Sign up for Cloudinary<\/a> and start optimizing today.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In community threads, you often see devs wrestle with questions like where to store data, how to update it predictably, and how to keep the UI in sync. Question: What is state [&hellip;]<\/p>\n","protected":false},"author":88,"featured_media":39267,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[423],"class_list":["post-39300","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-questions"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>What is State in JavaScript?<\/title>\n<meta name=\"description\" content=\"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What is State in JavaScript?\" \/>\n<meta property=\"og:description\" content=\"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-17T20:30:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-12T23:26:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1999\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"damjanantevski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\"},\"author\":{\"name\":\"damjanantevski\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\"},\"headline\":\"What is State in JavaScript?\",\"datePublished\":\"2025-11-17T20:30:14+00:00\",\"dateModified\":\"2025-12-12T23:26:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\"},\"wordCount\":507,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA\",\"keywords\":[\"Questions\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\",\"url\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\",\"name\":\"What is State in JavaScript?\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA\",\"datePublished\":\"2025-11-17T20:30:14+00:00\",\"dateModified\":\"2025-12-12T23:26:14+00:00\",\"description\":\"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA\",\"width\":1999,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What is State in JavaScript?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e\",\"name\":\"damjanantevski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g\",\"caption\":\"damjanantevski\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"What is State in JavaScript?","description":"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/","og_locale":"en_US","og_type":"article","og_title":"What is State in JavaScript?","og_description":"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In","og_url":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/","og_site_name":"Cloudinary Blog","article_published_time":"2025-11-17T20:30:14+00:00","article_modified_time":"2025-12-12T23:26:14+00:00","og_image":[{"width":1999,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","type":"image\/jpeg"}],"author":"damjanantevski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/"},"author":{"name":"damjanantevski","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e"},"headline":"What is State in JavaScript?","datePublished":"2025-11-17T20:30:14+00:00","dateModified":"2025-12-12T23:26:14+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/"},"wordCount":507,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","keywords":["Questions"],"inLanguage":"en-US","copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/","url":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/","name":"What is State in JavaScript?","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","datePublished":"2025-11-17T20:30:14+00:00","dateModified":"2025-12-12T23:26:14+00:00","description":"Every interactive app keeps track of things that can change over time: user input, network responses, UI toggles, media loading progress, and more. In","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","width":1999,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/questions\/what-is-state-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"What is State in JavaScript?"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/43592e43c12520a1e867d456b1e8cf7e","name":"damjanantevski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40c995531fe4d510212a06c9d4fc666d2cb8efbfebc98a94191701accf4817?s=96&d=mm&r=g","caption":"damjanantevski"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1763149247\/QA_javascript_featured_image\/QA_javascript_featured_image.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39300","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/88"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=39300"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39300\/revisions"}],"predecessor-version":[{"id":39616,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/39300\/revisions\/39616"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/39267"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=39300"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=39300"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=39300"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}