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 ...