国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

對Js賦值運算的新認識

sean / 478人閱讀

摘要:我們開始應用上規范上的步驟,雖然賦值運算符具有右結合性,然而它首先做的是得到表達式的值,根據我們對的解釋它返回一個指向對象的成員的引用,需要注意的是,這個時候并沒有改變引用的指向。

可以在這里看:http://leozdgao.me/renew-js-assignment/

此文的目的是為了解釋如下現象:

var foo = { n: 1 };
var bar = foo;
foo.x = foo = { n: 2 };
console.log(foo.x); // undefined
賦值運算符

根據ECMA規范中的定義賦值運算符的產生式(production)以及運算過程如下:

The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:

Let lref be the result of evaluating LeftHandSideExpression.

Let rref be the result of evaluating AssignmentExpression.

Let rval be GetValue(rref).

Throw a SyntaxError exception if the following conditions are all true:

Type(lref) is Reference is true

IsStrictReference(lref) is true

Type(GetBase(lref)) is Environment Record

GetReferencedName(lref) is either "eval" or "arguments"

Call PutValue(lref, rval).

Return rval.

其實第一次看這個部分我也還是無法理解開始列出的那個代碼中結果到底是為什么,看了其他博客其實也沒有講清楚,在StackOverflow上相關問題中有解釋到說是因為首先解析左邊表達式時確定了引用的指向,而只看11.13.1的話,只有一句“獲取LeftHandSideExpression的計算結果”,所以我覺得要真正理解,只看11.13.1是不行,還需要了解下11.2.1關于Property Accessors的內容,從而知道這個“計算結果是如何得到的”:

The production MemberExpression : MemberExpression [ Expression ] is evaluated as follows:

Let baseReference be the result of evaluating MemberExpression.

Let baseValue be GetValue(baseReference).

Let propertyNameReference be the result of evaluating Expression.

Let propertyNameValue be GetValue(propertyNameReference).

Call CheckObjectCoercible(baseValue).

Let propertyNameString be ToString(propertyNameValue).

If the syntactic production that is being evaluated is contained in strict mode code, let strict be true, else let strict be false.

Return a value of type Reference whose base value is baseValue and whose referenced name is propertyNameString, and whose strict mode flag is strict.

關鍵點在于它的返回值,用一個栗子來解釋就是說:如果有表達式foo.x,則它的返回值是一個指向foo對象x屬性的引用。

那么在知道了這一點后,開始解釋上面的現象:

首先是兩個變量的聲明和初始化,var foo = { n: 1 }; var bar = foo;,這個很好理解,就是foo和bar同時指向了一個相同的對象{ n: 1 }。

接下來,對于表達式foo.x = foo = { n: 2 };,我們都知道它實際上等于是foo.x = (foo = { n: 2 })。我們開始應用上ECMA規范上的步驟,雖然賦值運算符具有右結合性,然而它首先做的是得到表達式foo.x的值,根據我們對Property Accessors的解釋它返回一個指向對象{ n: 1}的x成員的引用,需要注意的是,這個時候foo并沒有改變引用的指向。

繼續,開始計算右邊的結果,就是讓foo指向另外的一個對象{n: 2},返回值就是其右邊運算式(operand)的結果,即對象{n: 2}這個容易理解。

那么現在應該清楚了,賦值語句中foo.x的結果是指向對象一成員x的引用,而下面的console.log(foo.x)中的foo指向的是對象二,所以這里foo.x返回undefined就理所當然了。

所以試著輸出對象一,即bar(因為它從始至終指向的是對象一):

{ n: 1, x: { n: 2 } }

如果有其他看法,接受各種形式的補充和指正。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85783.html

相關文章

  • C++類和象(萬字總結)(建議收藏!?。。?/b>

    摘要:當你用該日期類創建一個對象時,編譯器會自動調用該構造函數對新創建的變量進行初始化。注意構造函數的主要任務并不是開空間創建對象,而是初始化對象。編譯器對內置類型使用默認構造函數時,對其成員賦的是隨機值。 ...

    masturbator 評論0 收藏0
  • 面試官問:JS的this指向

    摘要:之前寫過一篇文章面試官問能否模擬實現的和方法就是利用對象上的函數指向這個對象,來模擬實現和的。雖然實際使用時不會顯示返回,但面試官會問到。非嚴格模式下,和,指向全局對象 前言 面試官出很多考題,基本都會變著方式來考察this指向,看候選人對JS基礎知識是否扎實。讀者可以先拉到底部看總結,再谷歌(或各技術平臺)搜索幾篇類似文章,看筆者寫的文章和別人有什么不同(歡迎在評論區評論不同之處),...

    warnerwu 評論0 收藏0
  • SICP Python 描述 1.3 定義新的函數

    摘要:到目前為止,我們的環境只包含全局幀。要注意函數名稱是重復的,一個在幀中,另一個是函數的一部分。運算符字表達式是全局幀中發現的名稱,綁定到了內建的加法函數上。嚴格來說,這并不是問題所在不同局部幀中的的綁定是不相關的。 1.3 定義新的函數 來源:1.3 Defining New Functions 譯者:飛龍 協議:CC BY-NC-SA 4.0 我們已經在 Python 中認識...

    SegmentFault 評論0 收藏0
  • 嚴格模式的簡單認識

    摘要:不支持嚴格模式的瀏覽器與嚴格模式的瀏覽器行為也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。在嚴格模式下,使用上述標識符作為變量名會導致語法錯誤。嚴格模式下,命名參數與對象是完全獨立的。在嚴格模式下,函數的值始終是指定的值。 嚴格模式 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種模式。嚴格模式不是一個子集:它的語義上與正常代碼有著明顯的差異。...

    learning 評論0 收藏0
  • 十八問,認識Python序列,解決疑難雜癥!

    摘要:序列是中的重要數據結構,序列包括字符串,列表,元組。序列支持運算符嗎運算符是否支持算數運算符支持加法與乘法操作,返回新的序列比較運算符支持,返回與邏輯運算符支持注意必須是同種類型數據結構操作才有意義。 序列是Python中的重要數據結構,序列包括字符串,列表,元組。大部分朋友學習Python的時候都會找本書或者資料從頭看到尾,這次我們換一個思路,問答式的方式,可能讓我們精力更集中,下面...

    cjie 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<