首頁  >  文章  >  web前端  >  javascript裡什麼是表達式

javascript裡什麼是表達式

醉折花枝作酒筹
醉折花枝作酒筹原創
2021-07-22 11:46:065695瀏覽

表達式語句其實就是一個表達式,它是由運算子連接變數或直接量構成。一般來說,表達式語句要麼是函數調用,要麼是賦值,要麼是自增、自減,否則表達式計算的結果沒有任何意義。

javascript裡什麼是表達式

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

表達式語句其實就是一個表達式,它是由運算子連接變數或直接量構成。

一般來說,表達式語句要麼是函數調用,要麼是賦值,要麼是自增、自減,否則表達式計算的結果沒有任何意義。

JavaScript 語法上並沒有這樣的限制,任何合法的表達式都可以當作表達式語句使用。

a + b;

這行程式碼計算了a 和b 相加的值,但不會顯示出來,也不會產生任何執行效果(除非a 和b 是getter ),但不妨礙它符合語法也能夠被執行。

PrimaryExpression 主要表達式

表達式的原子項:Primary Expression。它是表達式的最小單位,它所涉及的語法結構也是優先順序最高的。

Primary Expression 包含了各種“直接量”,直接量就是直接用某種語法寫出來的具有特定類型的值,直接量就是在程式碼中把它們寫出來的語法。

JavaScript 能夠直接量的形式定義對象,針對函數、類別、陣列、正規表示式等特殊物件類型,JavaScript 提供了語法層面的支援。

({});
(function(){});
(class{ });
[];
/abc/g;

在語法層面,function、{ 和 class 開頭的表達式語句與宣告語句有語法衝突,如果要想使用這樣的表達式,必須加上括號來迴避語法衝突。

Primary Expression 還可以是 this 或變量,在語法上,把變數稱為「標識符引用」。

this;
myVarFun;

任何表達式加上圓括號,都被認為是 Primary Expression,這個機制使得圓括號成為改變運算優先順序的手段。

(a + b);

MemberExpression 成員表達式

Member Expression 通常是用來存取物件成員的。它有幾種形式:

a.b;
a["b"];
new.target;
super.b;

new.target 是個新加入的語法,用來判斷函數是否是被 new 調用,super 則是建構函式中,用來存取父類別的屬性的語法。

Member Expression 最初設計是為了屬性存取的,不過從語法結構需要,以下兩種在JavaScript 標準中當做Member Expression:

帶函數的模板,這個帶函數名的模板表示把模板的各個部分算好後傳遞給一個函數。

f`a${b}c`;

有參數清單的 new 運算,不含參數清單的 new 運算優先權更低,不屬於 Member Expression。

new Cls();

它們跟屬性運算屬於同一優先級,但是沒有任何語意上的關聯。

NewExpression NEW 表達式

Member Expression 加上new 就是New Expression(不加new 也可以構成New Expression,JavaScript 中預設獨立的高優先權表達式都可以構成低優先權表達式)。

New Expression 特指沒有參數列表的表達式。如下程式碼:

new new Cls(1);

直觀看上去,它可能有兩種意思:

new (new Cls(1));
new (new Cls)(1);

實際上,它等價於第一種。用程式碼來驗證:

class Cls{
  constructor(n){
     console.log("cls", n);
        return class {
           constructor(n) {
              console.log("returned", n);
            }
        }
    }
}

new (new Cls(1));

運行結果:這裡就說明了,1 被當做呼叫 Cls 時的參數傳入了。

javascript裡什麼是表達式

CallExpression 函數呼叫表達式

Member Expression 還能構成 Call Expression。它的基本形式是 Member Expression 後面加上一個括號裡的參數列表,或者可以用上 super 關鍵字代替 Member Expression。

a.b(c);
super();

這看起來很簡單,但是它有一些變體。例如:

a.b(c)(d)(e);
a.b(c)[3];
a.b(c).d;
a.b(c)`xyz`;

這些變體的形態,跟 Member Expression 幾乎是一一對應的。實際上,可以理解為,Member Expression 中的某一子結構具有函數調用,那麼整個表達式就變成了一個 Call Expression。而 Call Expression 就失去了比 New Expression 優先順序高的特性,這是一個主要的區分。

LeftHandSideExpression 左值表達式

#New Expression 和 Call Expression 統稱 LeftHandSideExpression,左值表達式。

左值表達式就是可以放到等號左邊的表達式。 JavaScript 語法則是:

a() = b;

這樣的用法其實是符合語法的,只是,原生的 JavaScript 函數,回傳的值都不能被賦值。因此多數時候,我們看到的賦值將會是Call Expression 的其它形式,如:

a().c = b;

根據JavaScript 運行時的設計,不排除某些宿主會提供返回引用類型的函數,這時候,賦值就是有效的了。

左值表达式最经典的用法是用于构成赋值表达式,但是其实如果翻一翻 JavaScript 标准,就会发现它出现在各种场合,凡是需要“可以被修改的变量”的位置,都能见到它的身影。

AssignmentExpression 赋值表达式

AssignmentExpression 赋值表达式也有多种形态,最基本的当然是使用等号赋值:

a = b

等号是可以嵌套的:

a = b = c = d

连续赋值,是右结合的,它等价于下面这种:

a = (b = (c = d))

先把 d 的结果赋值给 c,再把整个表达式的结果赋值给 b,再赋值给 a。

赋值表达式的使用,还可以结合一些运算符,例如:

a += b;

相当于:

a = a + b;

能有这样用的运算符有下面这几种:

*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|=、**=

赋值表达式的等号左边和右边能用的表达式类型不一样。

Expression 表达式

赋值表达式可以构成 Expression 表达式的一部分。在 JavaScript 中,表达式就是用逗号运算符连接的赋值表达式。

在 JavaScript 中,比赋值运算优先级更低的就是逗号运算符了。可以把逗号可以理解为一种小型的分号。

a = b, b = 1, null;

逗号分隔的表达式会顺次执行,就像不同的表达式语句一样。“整个表达式的结果”就是“最后一个逗号后的表达式结果”。比如之前的例子,整个“a = b, b = 1, null;”表达式的结果就是“,”后面的null。

在很多场合,都不允许使用带逗号的表达式,比如我export 后只能跟赋值表达式,意思就是表达式中不能含有逗号。

【推荐学习:javascript高级教程

以上是javascript裡什麼是表達式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn