آنلاین

Expression Syntax

Angular expressionها بر پایه JavaScript هستند، اما در چند مورد کلیدی تفاوت دارند. این راهنما شباهت‌ها و تفاوت‌های Angular expressionها و JavaScript استاندارد را مرور می‌کند.

Literalهای value

Angular از subsetای از literal valueهای JavaScript پشتیبانی می‌کند.

Literalهای value پشتیبانی‌شده

Literal typeExample values
String'Hello', "World"
Booleantrue, false
Number123, 3.14
Object{name: 'Alice'}
Array['Onion', 'Cheese', 'Garlic']
nullnull
RegExp/\d+/
Template string` Hello ${name} `
Tagged template string` tagHello ${name} `

Literalهای value پشتیبانی‌نشده

Literal typeExample values
BigInt1n

Globalها

Angular expressionها از globalهای زیر پشتیبانی می‌کنند:

هیچ global دیگری از JavaScript پشتیبانی نمی‌شود. Globalهای رایج JavaScript شامل Number، Boolean، NaN، Infinity، parseInt و موارد دیگر هستند.

Local variableها

Angular به‌صورت خودکار local variableهای ویژه‌ای را برای استفاده در expressionها در contextهای مشخص در دسترس قرار می‌دهد. این variableهای ویژه همیشه با کاراکتر dollar sign یعنی ($) شروع می‌شوند.

برای مثال، blockهای @for چند local variable متناظر با اطلاعات loop، مثل $index، در دسترس قرار می‌دهند.

چه operatorهایی پشتیبانی می‌شوند؟

Operatorهای پشتیبانی‌شده

Angular از operatorهای زیر از JavaScript استاندارد پشتیبانی می‌کند.

OperatorExample(s)
Add / Concatenate1 + 2
Subtract52 - 3
Multiply41 * 6
Divide20 / 4
Remainder (Modulo)17 % 5
Exponentiation10 ** 3
Parenthesis9 * (8 + 4)
Conditional (Ternary)a > b ? true : false
And (Logical)&&
Or (Logical)\|\|
Not (Logical)!
Nullish CoalescingpossiblyNullValue ?? 'default'
Comparison Operators<, <=, >, >=, ==, ===, !==, !=
Unary Negation-x
Unary Plus+y
Property Accessorperson['name']
typeoftypeof 42
voidvoid 1
in'model' in car
instanceofcar instanceof Automobile
Assignmenta = b
Addition Assignmenta += b
Subtraction Assignmenta -= b
Multiplication Assignmenta *= b
Division Assignmenta /= b
Remainder Assignmenta %= b
Exponentiation Assignmenta **= b
Logical AND Assignmenta &&= b
Logical OR Assignmenta \|\|= b
Nullish Coalescing Assignmenta ??= b
Spread in object literals{...obj, foo: 'bar'}
Spread in array literals[...arr, 1, 2, 3]
Rest in function callsfn(...args)

Angular expressionها علاوه بر این از operatorهای non-standard زیر هم پشتیبانی می‌کنند:

OperatorExample(s)
Pipe{{ total \| currency }}
Optional chaining\*someObj.someProp?.nestedProp
Non-null assertion (TypeScript)someObj!.someProp

Safe navigation migration

پیش از Angular 22، optional chaining operator یعنی (?.) وقتی سمت چپ آن null یا undefined بود، null برمی‌گرداند؛ در حالی که ?. استاندارد JavaScript مقدار undefined برمی‌گرداند. از Angular 22 به بعد، رفتار optional chaining operator در Angular expressionها با رفتار JavaScript استاندارد align شده است.

در زمان migration به v22، schematics مربوط به ng update یک magic function به نام $safeNavigationMigration به expressionهای موجود اضافه کرد تا رفتار قبلی، یعنی برگشت دادن null، حفظ شود.

html
{{ $safeNavigationMigration(foo?.bar) }}

$safeNavigationMigration فقط یک کمک موقت برای migration است. این function به compiler دستور می‌دهد safe-navigation expression wrap شده را با semantics قدیمیِ null-returning کامپایل کند، نه semantics استاندارد JavaScript برای ?.. این یک function واقعی نیست و نمی‌تواند از TypeScript فراخوانی شود.

Operatorهای پشتیبانی‌نشده

OperatorExample(s)
All bitwise operators&, &=, ~, \|=, ^=, etc.
Object destructuringconst { name } = person
Array destructuringconst [firstItem] = items
Comma operatorx = (x++, x)
newnew Car()

Lexical context برای expressionها

Angular expressionها در context مربوط به کلاس component و همچنین هر template variable، local و global مرتبط evaluate می‌شوند.

هنگام ارجاع به memberهای کلاس component، this همیشه ضمنی است. اما اگر یک template یک template variable با همان نام یک member declare کند، آن variable روی member سایه می‌اندازد. می‌توانید چنین class memberای را با استفاده explicit از this. بدون ابهام reference دهید. این کار هنگام ساخت یک declaration از نوع @let که روی class member سایه می‌اندازد می‌تواند مفید باشد، مثلا برای signal narrowing.

Declarationها

به‌طور کلی، declarationها در Angular expressionها پشتیبانی نمی‌شوند. این شامل موارد زیر است، اما محدود به آن‌ها نیست:

DeclarationsExample(s)
Variableslet label = 'abc', const item = 'apple'
Functionsfunction myCustomFunction() { }
Arrow Functions() => { }
Classesclass Rectangle { }

Statementهای event listener

Event handlerها به‌جای expression، statement هستند. با اینکه همه syntaxهای Angular expression را پشتیبانی می‌کنند، دو تفاوت کلیدی دارند:

  1. Statementها از assignment operatorها پشتیبانی می‌کنند، اما نه destructuring assignmentها
  2. Statementها از pipeها پشتیبانی نمی‌کنند