CINXE.COM

Operators | Dart

<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="x-ua-compatible" content="ie=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-5VSZM5J",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><meta name="description" content="Learn about the operators Dart supports."><title>Operators | Dart</title><link rel="icon" sizes="64x64" href="/assets/img/logo/dart-64.png" eleventy:ignore><link href="/assets/img/touch-icon-iphone.png" rel="apple-touch-icon" eleventy:ignore><link href="/assets/img/touch-icon-ipad.png" rel="apple-touch-icon" sizes="152x152" eleventy:ignore><link href="/assets/img/touch-icon-iphone-retina.png" rel="apple-touch-icon" sizes="180x180" eleventy:ignore><link href="/assets/img/touch-icon-ipad-retina.png" rel="apple-touch-icon" sizes="167x167" eleventy:ignore><meta name="twitter:card" content="summary"><meta name="twitter:site" content="@dart_lang"><meta name="twitter:title" content="Operators"><meta name="twitter:description" content="Learn about the operators Dart supports."><meta property="og:title" content="Operators"><meta property="og:description" content="Learn about the operators Dart supports."><meta property="og:url" content="/language/operators/"><meta property="og:image" content="/assets/img/logo/dart-logo-for-shares.png?2" eleventy:ignore><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Display:wght@400&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0..1,0" rel="stylesheet"><link rel="stylesheet" href="/assets/css/main.css?v=2"><script src="/assets/js/os-tabs.js?v=2"></script><script src="/assets/js/main.js?v=2"></script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-26406144-4","auto"),ga("send","pageview")</script></head><body class="default.html"><a id="skip" href="#site-content-title" tabindex="1">Skip to main content</a><section id="cookie-notice"><div class="container"><p>dart.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic.</p><div class="button-group"><a class="text-button" href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a> <button id="cookie-consent" class="filled-button">OK, got it</button></div></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5VSZM5J" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Announcing Dart 3.7! Find out about updates to the language, analyzer, pub.dev, and more, in the <a href="https://medium.com/dartlang/announcing-dart-3-7-bf864a1b195c" target="_blank">blog post</a>.</p></div><header id="page-header" class="site-header"><nav id="mainnav" class="site-header"><div id="menu-toggle"><span class="material-symbols" title="Toggle side navigation menu." aria-label="Toggle side navigation menu." type="button">menu</span></div><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart"></a><ul class="navbar"><li><a href="/overview" class="nav-link">Overview</a></li><li class="mainnav__get-started"><a href="/docs" class="nav-link active"><span>Docs</span></a></li><li><a href="/community" class="nav-link">Community</a></li><li><a href="/#try-dart" class="nav-link">Try Dart</a></li><li><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="searchfield"><form action="/search" class="site-header__search form-inline" id="cse-search-box"><input type="hidden" name="cx" value="011220921317074318178:_yy-tmb5t_i"> <input type="hidden" name="ie" value="UTF-8"> <input type="hidden" name="hl" value="en"> <input class="site-header__searchfield form-control search-field" type="search" name="q" id="search-main" autocomplete="off" placeholder="Search" aria-label="Search"></form></li></ul></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav"><form action="/search/" class="site-header__search form-inline"><input class="site-header__searchfield form-control search-field" type="search" name="q" id="search-side" autocomplete="off" placeholder="Search" aria-label="Search"></form><ul class="navbar-nav"><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><a href="/overview" class="nav-link">Overview</a></li><li class="nav-item"><a href="/community" class="nav-link">Community</a></li><li class="nav-item"><a href="https://dartpad.dev" class="nav-link">Try Dart</a></li><li class="nav-item"><a href="/get-dart" class="nav-link">Get Dart</a></li><li class="nav-item"><a href="/docs" class="nav-link">Docs</a></li><li aria-hidden="true"><div class="sidenav-divider"></div></li></ul><ul class="nav"><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#-sidenav-1" role="button" aria-expanded="true" aria-controls="-sidenav-1"><span>Language</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-1"><li class="nav-item"><a class="nav-link" href="/language"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#-sidenav-1-2" role="button" aria-expanded="true" aria-controls="-sidenav-1-2"><span>Syntax basics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-1-2"><li class="nav-item"><a class="nav-link" href="/language/variables"><div><span>Variables</span></div></a></li><li class="nav-item"><a class="nav-link active" href="/language/operators"><div><span>Operators</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/comments"><div><span>Comments</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/metadata"><div><span>Metadata</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/libraries"><div><span>Libraries & imports</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/keywords"><div><span>Keywords</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-3" role="button" aria-expanded="false" aria-controls="-sidenav-1-3"><span>Types</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-3"><li class="nav-item"><a class="nav-link" href="/language/built-in-types"><div><span>Built-in types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/records"><div><span>Records</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/collections"><div><span>Collections</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/generics"><div><span>Generics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/typedefs"><div><span>Typedefs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/type-system"><div><span>Type system</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-4" role="button" aria-expanded="false" aria-controls="-sidenav-1-4"><span>Patterns</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-4"><li class="nav-item"><a class="nav-link" href="/language/patterns"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/pattern-types"><div><span>Pattern types</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/dart-patterns-records" target="_blank" rel="noopener"><div><span>Applied tutorial</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/language/functions"><div><span>Functions</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-6" role="button" aria-expanded="false" aria-controls="-sidenav-1-6"><span>Control flow</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-6"><li class="nav-item"><a class="nav-link" href="/language/loops"><div><span>Loops</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/branches"><div><span>Branches</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/error-handling"><div><span>Error handling</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-7" role="button" aria-expanded="false" aria-controls="-sidenav-1-7"><span>Classes & objects</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-7"><li class="nav-item"><a class="nav-link" href="/language/classes"><div><span>Classes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/constructors"><div><span>Constructors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/methods"><div><span>Methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extend"><div><span>Extend a class</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/mixins"><div><span>Mixins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/enums"><div><span>Enums</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-methods"><div><span>Extension methods</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/extension-types"><div><span>Extension types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/callable-objects"><div><span>Callable objects</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-8" role="button" aria-expanded="false" aria-controls="-sidenav-1-8"><span>Class modifiers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-8"><li class="nav-item"><a class="nav-link" href="/language/class-modifiers"><div><span>Overview & usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/class-modifiers-for-apis"><div><span>Class modifiers for API maintainers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/modifier-reference"><div><span>Reference</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-9" role="button" aria-expanded="false" aria-controls="-sidenav-1-9"><span>Concurrency</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-9"><li class="nav-item"><a class="nav-link" href="/language/concurrency"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/async"><div><span>Asynchronous support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/language/isolates"><div><span>Isolates</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-1-10" role="button" aria-expanded="false" aria-controls="-sidenav-1-10"><span>Null safety</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-1-10"><li class="nav-item"><a class="nav-link" href="/null-safety"><div><span>Sound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/migration-guide"><div><span>Migrating to null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/understanding-null-safety"><div><span>Understanding null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/unsound-null-safety"><div><span>Unsound null safety</span></div></a></li><li class="nav-item"><a class="nav-link" href="/null-safety/faq"><div><span>FAQ</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-2" role="button" aria-expanded="false" aria-controls="-sidenav-2"><span>Core libraries</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2"><li class="nav-item"><a class="nav-link" href="/libraries"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-core"><div><span>dart:core</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-async"><div><span>dart:async</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-math"><div><span>dart:math</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-convert"><div><span>dart:convert</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/dart-io"><div><span>dart:io</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>dart:js_interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/libraries/collections/iterables"><div><span>Iterable collections</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-2-10" role="button" aria-expanded="false" aria-controls="-sidenav-2-10"><span>Asynchronous programming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-2-10"><li class="nav-item"><a class="nav-link" href="/libraries/async/async-await"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/futures-error-handling"><div><span>Futures and error handling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/using-streams"><div><span>Using streams</span></div></a></li><li class="nav-item"><a class="nav-link" href="/libraries/async/creating-streams"><div><span>Creating streams</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-3" role="button" aria-expanded="false" aria-controls="-sidenav-3"><span>Effective Dart</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-3"><li class="nav-item"><a class="nav-link" href="/effective-dart"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/style"><div><span>Style</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/documentation"><div><span>Documentation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/effective-dart/design"><div><span>Design</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-4" role="button" aria-expanded="false" aria-controls="-sidenav-4"><span>Packages</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4"><li class="nav-item"><a class="nav-link" href="/tools/pub/packages"><div><span>How to use packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/useful-packages"><div><span>Commonly used packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/create-packages"><div><span>Creating packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/publishing"><div><span>Publishing packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/writing-package-pages"><div><span>Writing package pages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/workspaces"><div><span>Workspaces (monorepo support)</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-4-7" role="button" aria-expanded="false" aria-controls="-sidenav-4-7"><span>Package reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-4-7"><li class="nav-item"><a class="nav-link" href="/tools/pub/dependencies"><div><span>Dependencies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/package-layout"><div><span>Package layout conventions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/environment-variables"><div><span>Pub environment variables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/pubspec"><div><span>Pubspec file</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/troubleshoot"><div><span>Troubleshooting pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/verified-publishers"><div><span>Verified publishers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/security-advisories"><div><span>Security advisories</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/versioning"><div><span>Versioning</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/custom-package-repositories"><div><span>Custom package repositories</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/pub/private-files"><div><span>What not to commit</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-5" role="button" aria-expanded="false" aria-controls="-sidenav-5"><span>Development</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5"><li class="nav-item"><a class="nav-link" href="/libraries/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/number-representation"><div><span>Number representation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/google-apis"><div><span>Google APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/multiplatform-apps"><div><span>Multi-platform apps</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-5" role="button" aria-expanded="false" aria-controls="-sidenav-5-5"><span>Command-line & server apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-5"><li class="nav-item"><a class="nav-link" href="/server"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/cmdline"><div><span>Write command-line apps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials/server/httpserver"><div><span>Write HTTP servers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/server/google-cloud"><div><span>Google Cloud</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-5-6" role="button" aria-expanded="false" aria-controls="-sidenav-5-6"><span>Web apps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/web"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/get-started"><div><span>Get started</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/deployment"><div><span>Deployment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/libraries"><div><span>Libraries & packages</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/wasm"><div><span>Wasm compilation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/libraries/core/environment-declarations"><div><span>Environment declarations</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-6" role="button" aria-expanded="false" aria-controls="-sidenav-6"><span>Interoperability</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6"><li class="nav-item"><a class="nav-link" href="/interop/c-interop"><div><span>C interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/objective-c-interop"><div><span>Objective-C & Swift interop</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/java-interop"><div><span>Java & Kotlin interop</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-6-4" role="button" aria-expanded="false" aria-controls="-sidenav-6-4"><span>JavaScript interop</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-6-4"><li class="nav-item"><a class="nav-link" href="/interop/js-interop"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/usage"><div><span>Usage</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/js-types"><div><span>JS types</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/tutorials"><div><span>Tutorials</span></div></a></li><li class="nav-item"><a class="nav-link" href="/interop/js-interop/past-js-interop"><div><span>Past JS interop</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/interop/js-interop/package-web"><div><span>Web interop</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-7" role="button" aria-expanded="false" aria-controls="-sidenav-7"><span>Tools & techniques</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7"><li class="nav-item"><a class="nav-link" href="/tools"><div><span>Overview</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2" role="button" aria-expanded="false" aria-controls="-sidenav-7-2"><span>Editors & debuggers</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2"><li class="nav-item"><a class="nav-link" href="/tools/jetbrains-plugin"><div><span>IntelliJ & Android Studio</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/vs-code"><div><span>VS Code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-devtools"><div><span>Dart DevTools</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-2-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-2-4"><span>DartPad</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-2-4"><li class="nav-item"><a class="nav-link" href="/tools/dartpad"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartpad/troubleshoot"><div><span>Troubleshooting DartPad</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-3" role="button" aria-expanded="false" aria-controls="-sidenav-7-3"><span>Command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-3"><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-1" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-1"><span>Dart SDK</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-1"><li class="nav-item"><a class="nav-link" href="/tools/sdk"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-tool"><div><span>dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-analyze"><div><span>dart analyze</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-compile"><div><span>dart compile</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-create"><div><span>dart create</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-doc"><div><span>dart doc</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-fix"><div><span>dart fix</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-format"><div><span>dart format</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-info"><div><span>dart info</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pub/cmd"><div><span>dart pub</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-run"><div><span>dart run</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dart-test"><div><span>dart test</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/dartaotruntime"><div><span>dartaotruntime</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/experiment-flags"><div><span>Experiment flags</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-7-3-2" role="button" aria-expanded="true" aria-controls="-sidenav-7-3-2"><span>Other command-line tools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-7-3-2"><li class="nav-item"><a class="nav-link" href="/tools/build_runner"><div><span>build_runner</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/webdev"><div><span>webdev</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-4" role="button" aria-expanded="false" aria-controls="-sidenav-7-4"><span>Static analysis</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-4"><li class="nav-item"><a class="nav-link" href="/tools/analysis"><div><span>Customizing static analysis</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deprecated/sound-problems"><div><span>Fixing common type problems</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/non-promotion-reasons"><div><span>Fixing type promotion failures</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/linter-rules"><div><span>Linter rules</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/diagnostic-messages"><div><span>Diagnostic messages</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-7-5" role="button" aria-expanded="false" aria-controls="-sidenav-7-5"><span>Testing & optimization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-7-5"><li class="nav-item"><a class="nav-link" href="/tools/testing"><div><span>Testing</span></div></a></li><li class="nav-item"><a class="nav-link" href="/web/debugging"><div><span>Debugging web apps</span></div></a></li></ul></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#-sidenav-9" role="button" aria-expanded="false" aria-controls="-sidenav-9"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9"><li class="nav-item"><a class="nav-link" href="/resources/dart-cheatsheet"><div><span>Language cheatsheet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/breaking-changes"><div><span>Breaking changes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/evolution"><div><span>Language evolution</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/language/spec"><div><span>Language specification</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/dart-3-migration"><div><span>Dart 3 migration guide</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#-sidenav-9-6" role="button" aria-expanded="false" aria-controls="-sidenav-9-6"><span>Coming from ...</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="-sidenav-9-6"><li class="nav-item"><a class="nav-link" href="/resources/coming-from/js-to-dart"><div><span>JavaScript to Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/coming-from/swift-to-dart"><div><span>Swift to Dart</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/resources/faq"><div><span>FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/glossary"><div><span>Glossary</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/books"><div><span>Books</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/videos"><div><span>Videos</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tutorials"><div><span>Tutorials</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#-sidenav-10" role="button" aria-expanded="true" aria-controls="-sidenav-10"><span>Related sites</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="-sidenav-10"><li class="nav-item"><a class="nav-link" href="https://api.dart.dev" target="_blank" rel="noopener"><div><span>API reference</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://medium.com/dartlang" target="_blank" rel="noopener"><div><span>Blog</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://dartpad.dev" target="_blank" rel="noopener"><div><span>DartPad (online editor)</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://flutter.dev" target="_blank" rel="noopener"><div><span>Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev" target="_blank" rel="noopener"><div><span>Package site</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></div><main id="page-content"><div id="site-toc--side" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry nav-item"><a class="nav-link" href="#operator-precedence-example">Operator precedence example</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#arithmetic-operators">Arithmetic operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#equality-and-relational-operators">Equality and relational operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#type-test-operators">Type test operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#assignment-operators">Assignment operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#logical-operators">Logical operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#bitwise-and-shift-operators">Bitwise and shift operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#conditional-expressions">Conditional expressions</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#cascade-notation">Cascade notation</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#spread-operators">Spread operators</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#other-operators">Other operators</a></li></ul></div><article><div class="content"><div id="site-content-title"><h1>Operators</h1></div><div id="site-toc--inline" class="site-toc toc-collapsible toc-collapsed"><header class="site-toc__title">Contents <span class="site-toc--inline__toggle toc-toggle-down"><i class="material-symbols">keyboard_arrow_down</i></span> <span class="site-toc--inline__toggle toc-toggle-up"><i class="material-symbols">keyboard_arrow_up</i></span></header><ul class="section-nav"><li class="toc-entry"><a href="#operator-precedence-example">Operator precedence example</a></li><li class="toc-entry"><a href="#arithmetic-operators">Arithmetic operators</a></li><li class="toc-entry"><a href="#equality-and-relational-operators">Equality and relational operators</a></li><li class="toc-entry"><a href="#type-test-operators">Type test operators</a></li><li class="toc-entry"><a href="#assignment-operators">Assignment operators</a></li><li class="toc-entry"><a href="#logical-operators">Logical operators</a></li><li class="toc-entry"><a href="#bitwise-and-shift-operators">Bitwise and shift operators</a></li><li class="toc-entry"><a href="#conditional-expressions">Conditional expressions</a></li><li class="toc-entry"><a href="#cascade-notation">Cascade notation</a></li><li class="toc-entry"><a href="#spread-operators">Spread operators</a></li><li class="toc-entry"><a href="#other-operators">Other operators</a></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items"><i class="material-symbols">more_horiz</i></span></div> <?code-excerpt replace="/ *\/\/\s+ignore_for_file:[^\n]+\n//g; /(^|\n) *\/\/\s+ignore:[^\n]+\n/$1/g; /(\n[^\n]+) *\/\/\s+ignore:[^\n]+\n/$1\n/g; / *\/\/\s+ignore:[^\n]+//g; /([A-Z]\w*)\d\b/$1/g"?> <p><a name="operators"></a></p><p>Dart supports the operators shown in the following table. The table shows Dart's operator associativity and <a href="#operator-precedence-example">operator precedence</a> from highest to lowest, which are an <strong>approximation</strong> of Dart's operator relationships. You can implement many of these <a href="/language/methods#operators">operators as class members</a>.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Description</th><th>Operator</th><th>Associativity</th></tr></thead><tbody><tr><td>unary postfix</td><td><em><code>expr</code></em><code>++</code>    <em><code>expr</code></em><code>--</code>    <code>()</code>    <code>[]</code>    <code>?[]</code>    <code>.</code>    <code>?.</code>    <code>!</code></td><td>None</td></tr><tr><td>unary prefix</td><td><code>-</code><em><code>expr</code></em>    <code>!</code><em><code>expr</code></em>    <code>~</code><em><code>expr</code></em>    <code>++</code><em><code>expr</code></em>    <code>--</code><em><code>expr</code></em>      <code>await</code> <em><code>expr</code></em></td><td>None</td></tr><tr><td>multiplicative</td><td><code>*</code>    <code>/</code>    <code>%</code>  <code>~/</code></td><td>Left</td></tr><tr><td>additive</td><td><code>+</code>    <code>-</code></td><td>Left</td></tr><tr><td>shift</td><td><code>&lt;&lt;</code>    <code>&gt;&gt;</code>    <code>&gt;&gt;&gt;</code></td><td>Left</td></tr><tr><td>bitwise AND</td><td><code>&amp;</code></td><td>Left</td></tr><tr><td>bitwise XOR</td><td><code>^</code></td><td>Left</td></tr><tr><td>bitwise OR</td><td><code>|</code></td><td>Left</td></tr><tr><td>relational and type test</td><td><code>&gt;=</code>    <code>&gt;</code>    <code>&lt;=</code>    <code>&lt;</code>    <code>as</code>    <code>is</code>    <code>is!</code></td><td>None</td></tr><tr><td>equality</td><td><code>==</code>    <code>!=</code></td><td>None</td></tr><tr><td>logical AND</td><td><code>&amp;&amp;</code></td><td>Left</td></tr><tr><td>logical OR</td><td><code>||</code></td><td>Left</td></tr><tr><td>if-null</td><td><code>??</code></td><td>Left</td></tr><tr><td>conditional</td><td><em><code>expr1</code></em>    <code>?</code>    <em><code>expr2</code></em>    <code>:</code>    <em><code>expr3</code></em></td><td>Right</td></tr><tr><td>cascade</td><td><code>..</code>    <code>?..</code></td><td>Left</td></tr><tr><td>assignment</td><td><code>=</code>    <code>*=</code>    <code>/=</code>   <code>+=</code>   <code>-=</code>   <code>&amp;=</code>   <code>^=</code>   <em>etc.</em></td><td>Right</td></tr><tr><td>spread (<a href="#spread-operators">See note</a>)</td><td><code>...</code>    <code>...?</code></td><td>None</td></tr></tbody></table></div><aside class="alert alert-warning"><div class="alert-header"><span class="material-symbols" aria-hidden="true">warning</span> <span>Warning</span></div><div class="alert-content"><p>The previous table should only be used as a helpful guide. The notion of operator precedence and associativity is an approximation of the truth found in the language grammar. You can find the authoritative behavior of Dart's operator relationships in the grammar defined in the <a href="/resources/language/spec">Dart language specification</a>.</p></div></aside><p>When you use operators, you create expressions. Here are some examples of operator expressions:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (expressions)" replace="/,//g"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">a++</span></span> <span class="line"><span style="color:#222222">a + b</span></span> <span class="line"><span style="color:#222222">a = b</span></span> <span class="line"><span style="color:#222222">a == b</span></span> <span class="line"><span style="color:#222222">c ? a : b</span></span> <span class="line"><span style="color:#222222">a is </span><span style="color:#0468D7">T</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="operator-precedence-example">Operator precedence example</h2><a class="heading-link" href="#operator-precedence-example" aria-label="Link to 'Operator precedence example' section">#</a></div><p>In the <a href="#operators">operator table</a>, each operator has higher precedence than the operators in the rows that follow it. For example, the multiplicative operator <code>%</code> has higher precedence than (and thus executes before) the equality operator <code>==</code>, which has higher precedence than the logical AND operator <code>&amp;&amp;</code>. That precedence means that the following two lines of code execute the same way:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (precedence)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">// Parentheses improve readability.</span></span> <span class="line"><span style="color:#D43324">if</span><span style="color:#222222"> ((n % i == </span><span style="color:#11796D">0</span><span style="color:#222222">) &#x26;&#x26; (d % i == </span><span style="color:#11796D">0</span><span style="color:#222222">)) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Harder to read, but equivalent.</span></span> <span class="line"><span style="color:#D43324">if</span><span style="color:#222222"> (n % i == </span><span style="color:#11796D">0</span><span style="color:#222222"> &#x26;&#x26; d % i == </span><span style="color:#11796D">0</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><aside class="alert alert-warning"><div class="alert-header"><span class="material-symbols" aria-hidden="true">warning</span> <span>Warning</span></div><div class="alert-content"><p>For operators that take two operands, the leftmost operand determines which method is used. For example, if you have a <code>Vector</code> object and a <code>Point</code> object, then <code>aVector + aPoint</code> uses <code>Vector</code> addition (<code>+</code>).</p></div></aside><div class="header-wrapper"><h2 id="arithmetic-operators">Arithmetic operators</h2><a class="heading-link" href="#arithmetic-operators" aria-label="Link to 'Arithmetic operators' section">#</a></div><p>Dart supports the usual arithmetic operators, as shown in the following table.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>+</code></td><td>Add</td></tr><tr><td><code>-</code></td><td>Subtract</td></tr><tr><td><code>-</code><em><code>expr</code></em></td><td>Unary minus, also known as negation (reverse the sign of the expression)</td></tr><tr><td><code>*</code></td><td>Multiply</td></tr><tr><td><code>/</code></td><td>Divide</td></tr><tr><td><code>~/</code></td><td>Divide, returning an integer result</td></tr><tr><td><code>%</code></td><td>Get the remainder of an integer division (modulo)</td></tr></tbody></table></div><p>Example:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (arithmetic)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> + </span><span style="color:#11796D">3</span><span style="color:#222222"> == </span><span style="color:#11796D">5</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> - </span><span style="color:#11796D">3</span><span style="color:#222222"> == -</span><span style="color:#11796D">1</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> * </span><span style="color:#11796D">3</span><span style="color:#222222"> == </span><span style="color:#11796D">6</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">5</span><span style="color:#222222"> / </span><span style="color:#11796D">2</span><span style="color:#222222"> == </span><span style="color:#11796D">2.5</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Result is a double</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">5</span><span style="color:#222222"> ~/ </span><span style="color:#11796D">2</span><span style="color:#222222"> == </span><span style="color:#11796D">2</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Result is an int</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">5</span><span style="color:#222222"> % </span><span style="color:#11796D">2</span><span style="color:#222222"> == </span><span style="color:#11796D">1</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Remainder</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">'5/2 = </span><span style="color:#11796D">${5 ~/ 2}</span><span style="color:#11796D"> r </span><span style="color:#11796D">${5 % 2}</span><span style="color:#11796D">'</span><span style="color:#222222"> == </span><span style="color:#11796D">'5/2 = 2 r 1'</span><span style="color:#222222">);</span></span></code></pre></div></div><p>Dart also supports both prefix and postfix increment and decrement operators.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>++</code><em><code>var</code></em></td><td><em><code>var</code></em>  <code>=</code>  <em><code>var</code></em> <code>+ 1</code> (expression value is <em><code>var</code></em> <code>+ 1</code>)</td></tr><tr><td><em><code>var</code></em><code>++</code></td><td><em><code>var</code></em>  <code>=</code>  <em><code>var</code></em> <code>+ 1</code> (expression value is <em><code>var</code></em>)</td></tr><tr><td><code>--</code><em><code>var</code></em></td><td><em><code>var</code></em>  <code>=</code>  <em><code>var</code></em> <code>- 1</code> (expression value is <em><code>var</code></em> <code>- 1</code>)</td></tr><tr><td><em><code>var</code></em><code>--</code></td><td><em><code>var</code></em>  <code>=</code>  <em><code>var</code></em> <code>- 1</code> (expression value is <em><code>var</code></em>)</td></tr></tbody></table></div><p>Example:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (increment-decrement)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">int</span><span style="color:#222222"> a;</span></span> <span class="line"><span style="color:#0468D7">int</span><span style="color:#222222"> b;</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">a = </span><span style="color:#11796D">0</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">b = ++a; </span><span style="color:#6E6E70">// Increment a before b gets its value.</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(a == b); </span><span style="color:#6E6E70">// 1 == 1</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">a = </span><span style="color:#11796D">0</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">b = a++; </span><span style="color:#6E6E70">// Increment a after b gets its value.</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(a != b); </span><span style="color:#6E6E70">// 1 != 0</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">a = </span><span style="color:#11796D">0</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">b = --a; </span><span style="color:#6E6E70">// Decrement a before b gets its value.</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(a == b); </span><span style="color:#6E6E70">// -1 == -1</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">a = </span><span style="color:#11796D">0</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">b = a--; </span><span style="color:#6E6E70">// Decrement a after b gets its value.</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(a != b); </span><span style="color:#6E6E70">// -1 != 0</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="equality-and-relational-operators">Equality and relational operators</h2><a class="heading-link" href="#equality-and-relational-operators" aria-label="Link to 'Equality and relational operators' section">#</a></div><p>The following table lists the meanings of equality and relational operators.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>==</code></td><td>Equal; see discussion below</td></tr><tr><td><code>!=</code></td><td>Not equal</td></tr><tr><td><code>&gt;</code></td><td>Greater than</td></tr><tr><td><code>&lt;</code></td><td>Less than</td></tr><tr><td><code>&gt;=</code></td><td>Greater than or equal to</td></tr><tr><td><code>&lt;=</code></td><td>Less than or equal to</td></tr></tbody></table></div><p>To test whether two objects x and y represent the same thing, use the <code>==</code> operator. (In the rare case where you need to know whether two objects are the exact same object, use the <a href="https://api.dart.dev/dart-core/identical.html">identical()</a> function instead.) Here's how the <code>==</code> operator works:</p><ol><li><p>If <em>x</em> or <em>y</em> is null, return true if both are null, and false if only one is null.</p></li><li><p>Return the result of invoking the <code>==</code> method on <em>x</em> with the argument <em>y</em>. (That's right, operators such as <code>==</code> are methods that are invoked on their first operand. For details, see <a href="/language/methods#operators">Operators</a>.)</p></li></ol><p>Here's an example of using each of the equality and relational operators:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (relational)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> == </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> != </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">3</span><span style="color:#222222"> > </span><span style="color:#11796D">2</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> &#x3C; </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">3</span><span style="color:#222222"> >= </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(</span><span style="color:#11796D">2</span><span style="color:#222222"> &#x3C;= </span><span style="color:#11796D">3</span><span style="color:#222222">);</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="type-test-operators">Type test operators</h2><a class="heading-link" href="#type-test-operators" aria-label="Link to 'Type test operators' section">#</a></div><p>The <code>as</code>, <code>is</code>, and <code>is!</code> operators are handy for checking types at runtime.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>as</code></td><td>Typecast (also used to specify <a href="/language/libraries#specifying-a-library-prefix">library prefixes</a>)</td></tr><tr><td><code>is</code></td><td>True if the object has the specified type</td></tr><tr><td><code>is!</code></td><td>True if the object doesn't have the specified type</td></tr></tbody></table></div><p>The result of <code>obj is T</code> is true if <code>obj</code> implements the interface specified by <code>T</code>. For example, <code>obj is Object?</code> is always true.</p><p>Use the <code>as</code> operator to cast an object to a particular type if and only if you are sure that the object is of that type. Example:</p> <?code-excerpt "misc/lib/language_tour/classes/employee.dart (emp-as-person)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">(employee </span><span style="color:#D43324">as</span><span style="color:#0468D7"> Person</span><span style="color:#222222">).firstName = </span><span style="color:#11796D">'Bob'</span><span style="color:#222222">;</span></span></code></pre></div></div><p>If you aren't sure that the object is of type <code>T</code>, then use <code>is T</code> to check the type before using the object.</p> <?code-excerpt "misc/lib/language_tour/classes/employee.dart (emp-is-person)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">if</span><span style="color:#222222"> (employee is </span><span style="color:#0468D7">Person</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#6E6E70"> // Type check</span></span> <span class="line"><span style="color:#222222"> employee.firstName = </span><span style="color:#11796D">'Bob'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>The code isn't equivalent. If <code>employee</code> is null or not a <code>Person</code>, the first example throws an exception; the second does nothing.</p></div></aside><div class="header-wrapper"><h2 id="assignment-operators">Assignment operators</h2><a class="heading-link" href="#assignment-operators" aria-label="Link to 'Assignment operators' section">#</a></div><p>As you've already seen, you can assign values using the <code>=</code> operator. To assign only if the assigned-to variable is null, use the <code>??=</code> operator.</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (assignment)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">// Assign value to a</span></span> <span class="line"><span style="color:#222222">a = value;</span></span> <span class="line"><span style="color:#6E6E70">// Assign value to b if b is null; otherwise, b stays the same</span></span> <span class="line"><span style="color:#222222">b ??= value;</span></span></code></pre></div></div><p>Compound assignment operators such as <code>+=</code> combine an operation with an assignment.</p><div class="table-wrapper"><table class="table"><thead><tr><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td><code>=</code></td><td><code>*=</code></td><td><code>%=</code></td><td><code>&gt;&gt;&gt;=</code></td><td><code>^=</code></td></tr><tr><td><code>+=</code></td><td><code>/=</code></td><td><code>&lt;&lt;=</code></td><td><code>&amp;=</code></td><td><code>|=</code></td></tr><tr><td><code>-=</code></td><td><code>~/=</code></td><td><code>&gt;&gt;=</code></td><td></td><td></td></tr></tbody></table></div><p>Here's how compound assignment operators work:</p><div class="table-wrapper"><table class="table"><thead><tr><th></th><th>Compound assignment</th><th>Equivalent expression</th></tr></thead><tbody><tr><td><strong>For an operator <em>op</em>:</strong></td><td><code>a</code> <em><code>op</code></em><code>= b</code></td><td><code>a = a</code> <em><code>op</code></em> <code>b</code></td></tr><tr><td><strong>Example:</strong></td><td><code>a += b</code></td><td><code>a = a + b</code></td></tr></tbody></table></div><p>The following example uses assignment and compound assignment operators:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (op-assign)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> a = </span><span style="color:#11796D">2</span><span style="color:#222222">; </span><span style="color:#6E6E70">// Assign using =</span></span> <span class="line"><span style="color:#222222">a *= </span><span style="color:#11796D">3</span><span style="color:#222222">; </span><span style="color:#6E6E70">// Assign and multiply: a = a * 3</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">(a == </span><span style="color:#11796D">6</span><span style="color:#222222">);</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="logical-operators">Logical operators</h2><a class="heading-link" href="#logical-operators" aria-label="Link to 'Logical operators' section">#</a></div><p>You can invert or combine boolean expressions using the logical operators.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>!</code><em><code>expr</code></em></td><td>inverts the following expression (changes false to true, and vice versa)</td></tr><tr><td><code>||</code></td><td>logical OR</td></tr><tr><td><code>&amp;&amp;</code></td><td>logical AND</td></tr></tbody></table></div><p>Here's an example of using the logical operators:</p> <?code-excerpt "misc/lib/language_tour/operators.dart (op-logical)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">if</span><span style="color:#222222"> (!done &#x26;&#x26; (col == </span><span style="color:#11796D">0</span><span style="color:#222222"> || col == </span><span style="color:#11796D">3</span><span style="color:#222222">)) {</span></span> <span class="line"><span style="color:#6E6E70"> // ...Do something...</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="bitwise-and-shift-operators">Bitwise and shift operators</h2><a class="heading-link" href="#bitwise-and-shift-operators" aria-label="Link to 'Bitwise and shift operators' section">#</a></div><p>You can manipulate the individual bits of numbers in Dart. Usually, you'd use these bitwise and shift operators with integers.</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>&amp;</code></td><td>AND</td></tr><tr><td><code>|</code></td><td>OR</td></tr><tr><td><code>^</code></td><td>XOR</td></tr><tr><td><code>~</code><em><code>expr</code></em></td><td>Unary bitwise complement (0s become 1s; 1s become 0s)</td></tr><tr><td><code>&lt;&lt;</code></td><td>Shift left</td></tr><tr><td><code>&gt;&gt;</code></td><td>Shift right</td></tr><tr><td><code>&gt;&gt;&gt;</code></td><td>Unsigned shift right</td></tr></tbody></table></div><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>The behavior of bitwise operations with large or negative operands might differ between platforms. To learn more, check out <a href="/resources/language/number-representation#bitwise-operations">Bitwise operations platform differences</a>.</p></div></aside><p>Here's an example of using bitwise and shift operators:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (op-bitwise)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> value = </span><span style="color:#11796D">0x22</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> bitmask = </span><span style="color:#11796D">0x0f</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value &#x26; bitmask) == </span><span style="color:#11796D">0x02</span><span style="color:#222222">); </span><span style="color:#6E6E70">// AND</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value &#x26; ~bitmask) == </span><span style="color:#11796D">0x20</span><span style="color:#222222">); </span><span style="color:#6E6E70">// AND NOT</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value | bitmask) == </span><span style="color:#11796D">0x2f</span><span style="color:#222222">); </span><span style="color:#6E6E70">// OR</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value ^ bitmask) == </span><span style="color:#11796D">0x2d</span><span style="color:#222222">); </span><span style="color:#6E6E70">// XOR</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value &#x3C;&#x3C; </span><span style="color:#11796D">4</span><span style="color:#222222">) == </span><span style="color:#11796D">0x220</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Shift left</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value >> </span><span style="color:#11796D">4</span><span style="color:#222222">) == </span><span style="color:#11796D">0x02</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Shift right</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Shift right example that results in different behavior on web</span></span> <span class="line"><span style="color:#6E6E70">// because the operand value changes when masked to 32 bits:</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((-value >> </span><span style="color:#11796D">4</span><span style="color:#222222">) == -</span><span style="color:#11796D">0x03</span><span style="color:#222222">);</span></span> <span class="line"></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((value >>> </span><span style="color:#11796D">4</span><span style="color:#222222">) == </span><span style="color:#11796D">0x02</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Unsigned shift right</span></span> <span class="line"><span style="color:#D43324">assert</span><span style="color:#222222">((-value >>> </span><span style="color:#11796D">4</span><span style="color:#222222">) > </span><span style="color:#11796D">0</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Unsigned shift right</span></span></code></pre></div></div><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">merge_type</span> <span>Version note</span></div><div class="alert-content"><p>The <code>&gt;&gt;&gt;</code> operator (known as <em>triple-shift</em> or <em>unsigned shift</em>) requires a <a href="/resources/language/evolution#language-versioning">language version</a> of at least 2.14.</p></div></aside><div class="header-wrapper"><h2 id="conditional-expressions">Conditional expressions</h2><a class="heading-link" href="#conditional-expressions" aria-label="Link to 'Conditional expressions' section">#</a></div><p>Dart has two operators that let you concisely evaluate expressions that might otherwise require <a href="/language/branches#if">if-else</a> statements:</p><dl><dt><em><code>condition</code></em> <code>?</code> <em><code>expr1</code></em> <code>:</code> <em><code>expr2</code></em></dt><dd>If <em>condition</em> is true, evaluates <em>expr1</em> (and returns its value); otherwise, evaluates and returns the value of <em>expr2</em>.</dd><dt><em><code>expr1</code></em> <code>??</code> <em><code>expr2</code></em></dt><dd>If <em>expr1</em> is non-null, returns its value; otherwise, evaluates and returns the value of <em>expr2</em>.</dd></dl><p>When you need to assign a value based on a boolean expression, consider using the conditional operator <code>?</code> and <code>:</code>.</p> <?code-excerpt "misc/lib/language_tour/operators.dart (if-then-else-operator)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> visibility = isPublic ? </span><span style="color:#11796D">'public'</span><span style="color:#222222"> : </span><span style="color:#11796D">'private'</span><span style="color:#222222">;</span></span></code></pre></div></div><p>If the boolean expression tests for null, consider using the if-null operator <code>??</code> (also known as the null-coalescing operator).</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (if-null)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#0468D7">String</span><span style="color:#6200EE"> playerName</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222">? name) => name ?? </span><span style="color:#11796D">'Guest'</span><span style="color:#222222">;</span></span></code></pre></div></div><p>The previous example could have been written at least two other ways, but not as succinctly:</p> <?code-excerpt "misc/test/language_tour/operators_test.dart (if-null-alt)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70">// Slightly longer version uses ?: operator.</span></span> <span class="line"><span style="color:#0468D7">String</span><span style="color:#6200EE"> playerName</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222">? name) => name != </span><span style="color:#11796D">null</span><span style="color:#222222"> ? name : </span><span style="color:#11796D">'Guest'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70">// Very long version uses if-else statement.</span></span> <span class="line"><span style="color:#0468D7">String</span><span style="color:#6200EE"> playerName</span><span style="color:#222222">(</span><span style="color:#0468D7">String</span><span style="color:#222222">? name) {</span></span> <span class="line"><span style="color:#D43324"> if</span><span style="color:#222222"> (name != </span><span style="color:#11796D">null</span><span style="color:#222222">) {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#222222"> name;</span></span> <span class="line"><span style="color:#222222"> } </span><span style="color:#D43324">else</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#D43324"> return</span><span style="color:#11796D"> 'Guest'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="cascade-notation">Cascade notation</h2><a class="heading-link" href="#cascade-notation" aria-label="Link to 'Cascade notation' section">#</a></div><p>Cascades (<code>..</code>, <code>?..</code>) allow you to make a sequence of operations on the same object. In addition to accessing instance members, you can also call instance methods on that same object. This often saves you the step of creating a temporary variable and allows you to write more fluid code.</p><p>Consider the following code:</p> <?code-excerpt "misc/lib/language_tour/cascades.dart (cascade)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> paint =</span></span> <span class="line"><span style="color:#0468D7"> Paint</span><span style="color:#222222">()</span></span> <span class="line"><span style="color:#222222"> ..color = </span><span style="color:#0468D7">Colors</span><span style="color:#222222">.black</span></span> <span class="line"><span style="color:#222222"> ..strokeCap = </span><span style="color:#0468D7">StrokeCap</span><span style="color:#222222">.round</span></span> <span class="line"><span style="color:#222222"> ..strokeWidth = </span><span style="color:#11796D">5.0</span><span style="color:#222222">;</span></span></code></pre></div></div><p>The constructor, <code>Paint()</code>, returns a <code>Paint</code> object. The code that follows the cascade notation operates on this object, ignoring any values that might be returned.</p><p>The previous example is equivalent to this code:</p> <?code-excerpt "misc/lib/language_tour/cascades.dart (cascade-expanded)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> paint = </span><span style="color:#0468D7">Paint</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">paint.color = </span><span style="color:#0468D7">Colors</span><span style="color:#222222">.black;</span></span> <span class="line"><span style="color:#222222">paint.strokeCap = </span><span style="color:#0468D7">StrokeCap</span><span style="color:#222222">.round;</span></span> <span class="line"><span style="color:#222222">paint.strokeWidth = </span><span style="color:#11796D">5.0</span><span style="color:#222222">;</span></span></code></pre></div></div><p>If the object that the cascade operates on can be null, then use a <em>null-shorting</em> cascade (<code>?..</code>) for the first operation. Starting with <code>?..</code> guarantees that none of the cascade operations are attempted on that null object.</p> <?code-excerpt "misc/test/language_tour/browser_test.dart (cascade-operator)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">document.</span><span style="color:#6200EE">querySelector</span><span style="color:#222222">(</span><span style="color:#11796D">'#confirm'</span><span style="color:#222222">) </span><span style="color:#6E6E70">// Get an object.</span></span> <span class="line"><span style="color:#222222"> ?..textContent =</span></span> <span class="line"><span style="color:#11796D"> 'Confirm'</span><span style="color:#6E6E70"> // Use its members.</span></span> <span class="line"><span style="color:#222222"> ..classList.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'important'</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222"> ..onClick.</span><span style="color:#6200EE">listen</span><span style="color:#222222">((e) => window.</span><span style="color:#6200EE">alert</span><span style="color:#222222">(</span><span style="color:#11796D">'Confirmed!'</span><span style="color:#222222">))</span></span> <span class="line"><span style="color:#222222"> ..</span><span style="color:#6200EE">scrollIntoView</span><span style="color:#222222">();</span></span></code></pre></div></div><p>The previous code is equivalent to the following:</p> <?code-excerpt "misc/test/language_tour/browser_test.dart (cascade-operator-example-expanded)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> button = document.</span><span style="color:#6200EE">querySelector</span><span style="color:#222222">(</span><span style="color:#11796D">'#confirm'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">button?.textContent = </span><span style="color:#11796D">'Confirm'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#222222">button?.classList.</span><span style="color:#6200EE">add</span><span style="color:#222222">(</span><span style="color:#11796D">'important'</span><span style="color:#222222">);</span></span> <span class="line"><span style="color:#222222">button?.onClick.</span><span style="color:#6200EE">listen</span><span style="color:#222222">((e) => window.</span><span style="color:#6200EE">alert</span><span style="color:#222222">(</span><span style="color:#11796D">'Confirmed!'</span><span style="color:#222222">));</span></span> <span class="line"><span style="color:#222222">button?.</span><span style="color:#6200EE">scrollIntoView</span><span style="color:#222222">();</span></span></code></pre></div></div><p>You can also nest cascades. For example:</p> <?code-excerpt "misc/lib/language_tour/operators.dart (nested-cascades)"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">final</span><span style="color:#222222"> addressBook =</span></span> <span class="line"><span style="color:#222222"> (</span><span style="color:#0468D7">AddressBookBuilder</span><span style="color:#222222">()</span></span> <span class="line"><span style="color:#222222"> ..name = </span><span style="color:#11796D">'jenny'</span></span> <span class="line"><span style="color:#222222"> ..email = </span><span style="color:#11796D">'jenny@example.com'</span></span> <span class="line"><span style="color:#222222"> ..phone =</span></span> <span class="line"><span style="color:#222222"> (</span><span style="color:#0468D7">PhoneNumberBuilder</span><span style="color:#222222">()</span></span> <span class="line"><span style="color:#222222"> ..number = </span><span style="color:#11796D">'415-555-0100'</span></span> <span class="line"><span style="color:#222222"> ..label = </span><span style="color:#11796D">'home'</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">build</span><span style="color:#222222">())</span></span> <span class="line"><span style="color:#222222"> .</span><span style="color:#6200EE">build</span><span style="color:#222222">();</span></span></code></pre></div></div><p>Be careful to construct your cascade on a function that returns an actual object. For example, the following code fails:</p> <?code-excerpt "misc/lib/language_tour/operators.dart (cannot-cascade-on-void)" plaster="none"?> <div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#D43324">var</span><span style="color:#222222"> sb = </span><span style="color:#0468D7">StringBuffer</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">sb.</span><span style="color:#6200EE">write</span><span style="color:#222222">(</span><span style="color:#11796D">'foo'</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222"> ..</span><span style="color:#6200EE">write</span><span style="color:#222222">(</span><span style="color:#11796D">'bar'</span><span style="color:#222222">); </span><span style="color:#6E6E70">// Error: method 'write' isn't defined for 'void'.</span></span></code></pre></div></div><p>The <code>sb.write()</code> call returns void, and you can't construct a cascade on <code>void</code>.</p><aside class="alert alert-info"><div class="alert-header"><span class="material-symbols" aria-hidden="true">info</span> <span>Note</span></div><div class="alert-content"><p>Strictly speaking, the &quot;double dot&quot; notation for cascades isn't an operator. It's just part of the Dart syntax.</p></div></aside><div class="header-wrapper"><h2 id="spread-operators">Spread operators</h2><a class="heading-link" href="#spread-operators" aria-label="Link to 'Spread operators' section">#</a></div><p>Spread operators evaluate an expression that yields a collection, unpacks the resulting values, and inserts them into another collection.</p><p><strong>The spread operator isn't actually an operator expression</strong>. The <code>...</code>/<code>...?</code> syntax is part of the collection literal itself. So, you can learn more about spread operators on the <a href="/language/collections#spread-operators">Collections</a> page.</p><p>Because it isn't an operator, the syntax doesn't have any &quot;<a href="#operators">operator precedence</a>&quot;. Effectively, it has the lowest &quot;precedence&quot; — any kind of expression is valid as the spread target, such as:</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">[...a + b]</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="other-operators">Other operators</h2><a class="heading-link" href="#other-operators" aria-label="Link to 'Other operators' section">#</a></div><p>You've seen most of the remaining operators in other examples:</p><div class="table-wrapper"><table class="table table-striped"><thead><tr><th>Operator</th><th>Name</th><th>Meaning</th></tr></thead><tbody><tr><td><code>()</code></td><td>Function application</td><td>Represents a function call</td></tr><tr><td><code>[]</code></td><td>Subscript access</td><td>Represents a call to the overridable <code>[]</code> operator; example: <code>fooList[1]</code> passes the int <code>1</code> to <code>fooList</code> to access the element at index <code>1</code></td></tr><tr><td><code>?[]</code></td><td>Conditional subscript access</td><td>Like <code>[]</code>, but the leftmost operand can be null; example: <code>fooList?[1]</code> passes the int <code>1</code> to <code>fooList</code> to access the element at index <code>1</code> unless <code>fooList</code> is null (in which case the expression evaluates to null)</td></tr><tr><td><code>.</code></td><td>Member access</td><td>Refers to a property of an expression; example: <code>foo.bar</code> selects property <code>bar</code> from expression <code>foo</code></td></tr><tr><td><code>?.</code></td><td>Conditional member access</td><td>Like <code>.</code>, but the leftmost operand can be null; example: <code>foo?.bar</code> selects property <code>bar</code> from expression <code>foo</code> unless <code>foo</code> is null (in which case the value of <code>foo?.bar</code> is null)</td></tr><tr><td><code>!</code></td><td>Non-null assertion operator</td><td>Casts an expression to its underlying non-nullable type, throwing a runtime exception if the cast fails; example: <code>foo!.bar</code> asserts <code>foo</code> is non-null and selects the property <code>bar</code>, unless <code>foo</code> is null in which case a runtime exception is thrown</td></tr></tbody></table></div><p>For more information about the <code>.</code>, <code>?.</code>, and <code>..</code> operators, see <a href="/language/classes">Classes</a>.</p><nav id="subnav"><ul><li class="previous"><a href="/language/variables">&lang;&nbsp;&nbsp;Variables</a></li><li class="next"><a href="/language/comments">Comments&nbsp;&nbsp;&rang;</a></li></ul></nav><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects Dart 3.7.0. Page last updated on 2025-02-12.</span> <a href="https://github.com/dart-lang/site-www/tree/main/src/content/language/operators.md" target="_blank" rel="noopener">View source</a> <span>or </span><a href="https://github.com/dart-lang/site-www/issues/new?template=1_page_issue.yml&page-url=https://dart.dev/language/operators/&page-source=https://github.com/dart-lang/site-www/tree/main/src/content/language/operators.md" title="Report an issue with this page" target="_blank" rel="noopener">report an issue</a>.</p></div></article></main></div><footer id="page-footer"><div class="footer-section footer-main"><a href="/" class="brand" title="Dart"><img src="/assets/img/logo/logo-white-text.svg" alt="Dart" width="164"></a><div class="footer-social-links"><a href="https://medium.com/dartlang" target="_blank" rel="noopener" title="Dart's Medium publication"><svg><use href="/assets/img/social/medium.svg#medium"></use></svg> </a><a href="https://github.com/dart-lang" target="_blank" rel="noopener" title="Dart's GitHub organization"><svg><use href="/assets/img/social/github.svg#github"></use></svg> </a><a href="https://bsky.app/profile/dart.dev" target="_blank" rel="noopener" title="Dart's Bluesky profile"><svg><use href="/assets/img/social/bluesky.svg#bluesky"></use></svg> </a><a href="https://twitter.com/dart_lang" target="_blank" rel="noopener" title="Dart's X (Twitter) profile"><svg><use href="/assets/img/social/x.svg#x"></use></svg></a></div></div><div class="footer-section footer-tray"><div class="footer-licenses">Except as otherwise noted, this site is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>, and code samples are licensed under the <a href="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</a>.</div><div class="footer-utility-links"><ul><li><a href="/terms" title="Terms of use">Terms</a></li><li><a href="https://policies.google.com/privacy" target="_blank" rel="noopener" title="Privacy policy">Privacy</a></li><li><a href="/security" title="Security philosophy and practices">Security</a></li></ul></div></div></footer></div></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10