關於JavaScript中加性操作符的疑問?

時間 2021-06-03 13:16:56

1樓:小爝

這屬於型別轉換問題,首先你看你呼叫的是alert方法,我們看下alert方法的解釋:

引數messgae如果是個物件則轉換成string來顯示。

那麼你看你的三個例子:

alert(bbb);

alert(+bbb);

alert(''+bbb);

這裡第乙個alert你測試呼叫的是toString方法,我們看下為什麼。

js這個語言有乙個型別轉換的過程,toPrimitive是這麼定義的:

可以看到把乙個物件轉換為乙個非物件型別時,會取他的DefaultValue,下面看下啥是DefaultValue:

針對這個alert(bbb)來說,我們是把乙個object轉換為string,那麼獲取他的defaultvalue時,認為是第一種情況,如果有toString方法呼叫,沒有則用valueOf,這2個都沒有或者返回值不是乙個原始值(Undefined, Null, Boolean, Number, String),則返回乙個異常。

你改下你的例子試試把toString:null再看,肯定就走到valueOf裡了。

那麼說後面的+bbb和''+bbb;

這裡看下加號運算子的規則定義:

加法操作符表示將2個表示式相加或者將兩個字串進行拼接,所以 +bbb 和 ''+bbb 首先都需要將他們進行型別轉換,看是用作哪個操作,是拼接還是數字相加。

那麼這裡bbb則轉換時走defaultvalue拿值,看返回的值型別是個啥,這裡就要看加法是先把他們按照字串轉還是按照number型別轉了,8.12.8,就是上面第三張圖里解釋,按照字串轉則先呼叫toString再呼叫valueOf,按照number轉則先呼叫valueOf再呼叫toString。

上圖中的NOTE 1說,在步驟5和6中的ToPrimitive呼叫沒有提供hint,除了Date物件之外所有ECMAScript物件將缺少hint的情況當做Number處理;這下明白了吧,做加法操作的時候,轉換時ToPrimitive的順序是先按照number來的,那麼無論是''+bbb還是+bbb,都會優先走到valueOf裡了。

額外說明一下,如果+操作符左右兩邊有乙個ToPrimitive後是字串型別,則都按照拼接來操作,如果2個都是number型別,則進行相加。

你說的第48頁對object操作,確實會呼叫toString,因為先呼叫valueOf的時候,預設返回的還是object,不是乙個原始值,則再次又呼叫了toString,當然你的例子裡,你給valueOf重寫了。。只是高程沒有給你解釋這一層呼叫關係。

2樓:

噢我看錯問題了看到第二行去了……看小爝的答案吧。

一元加 (Unary Plus)將運算元轉換為數字型別。

MDN: Arithmetic operatorsECMA-262 Spec:

12.5.9 Unary + OperatorNOTE The unary + operator converts its operand to Number type.

12.5.9.1 Runtime Semantics: Evaluation UnaryExpression : + UnaryExpression

Let expr be the result of evaluating UnaryExpression.

Return ToNumber(GetValue(expr)).

javascript 關於 propertyIsEnumerable 的問題?

你應該用 arr.propertyIsEnumerable length arr.propertyIsEnumerable length arr.propertyIsEnumerable window.length arr.propertyIsEnumerable 0 假設你所在的視窗沒有 fram...

關於javascript中defineProperty的問題?

牧歌 為了避免衝突,讓上下文更安全。 itlr Object.defineProperty 更強大 This method allows precise addition to or modification of a property on an object.Normal property ad...

javascript框架中關於function函式表示式使用的問題

Saviio 我一點都不覺得這有什麼不好理解或者困惑的。設命名空間如下 varnamespace 乙個是例項屬性 namespace foo function arg1 arg2 var ins newnamespace foo 10 20 乙個是靜態方法 namespace foo isEven ...