+new date()這是隱式轉換的玄學。
我們先看看ECMAScript規範對一元運算子的規範:
一元+ 運算子 一元+運算子將其運算元轉換為Number型別並反轉其正負。注意負的+0產生-0,負的-0產生+0。
產生式 UnaryExpression : - UnaryExpression 按照下面的過程執行 :
+new Date()相當於 ToNumber(new Date())
我們再來看看ECMAScript規範對ToNumber的定義:
我們知道new Date()是個物件,滿足上面的ToPrimitive(),所以進而成了ToPrimitive(new Date())
接著我們再來看看ECMAScript規範對ToPrimitive的定義,一層一層來,抽絲剝繭。
這個ToPrimitive可能不太好懂,我給你解釋一下吧:
ToPrimitive(obj,preferredType)JS引擎內部轉換為原始值ToPrimitive(obj,preferredType)函式接受兩個引數,第一個obj為被轉換的物件,第二個preferredType為希望轉換成的型別(預設為空,接受的值為Number或String)在執行ToPrimitive(obj,preferredType)時如果第二個引數為空並且obj為Date的事例時,此時preferredType會被設定為String,其他情況下preferredType都會被設定為Number如果preferredType為Number,ToPrimitive執行過程如下:1. 如果obj為原始值,直接返回;2. 否則呼叫 obj.valueOf(),如果執行結果是原始值,返回之;3. 否則呼叫 obj.toString(),如果執行結果是原始值,返回之;4. 否則拋異常。如果preferredType為String,將上面的第2步和第3步調換,即:1. 如果obj為原始值,直接返回;2. 否則呼叫 obj.toString(),如果執行結果是原始值,返回之;3. 否則呼叫 obj.valueOf(),如果執行結果是原始值,返回之;4. 否則拋異常。
首先我們要明白 obj.valueOf() 和 obj.toString() 還有原始值分別是什麼意思,這是弄懂上面描述的前提之一:
toString用來返回物件的字串表示。
valueOf方法返回物件的原始值,可能是字串、數值或bool值等,看具體的物件。
原始值指的是["Null","Undefined","String","Boolean","Number","Symbol"]6種基本資料型別之一
最後分解一下其中的過程:+new Date():
SqlOperate是一個類的名字(sql資料庫相關的),就是定義一個名字叫做sqloperate的SqlOperate類的物件
+new date()這是隱式轉換的玄學。
我們先看看ECMAScript規範對一元運算子的規範:
一元+ 運算子 一元+運算子將其運算元轉換為Number型別並反轉其正負。注意負的+0產生-0,負的-0產生+0。
產生式 UnaryExpression : - UnaryExpression 按照下面的過程執行 :
令 expr 為解釋執行 UnaryExpression 的結果 .令 oldValue 為 ToNumber(GetValue(expr)).如果 oldValue is NaN ,return NaN.返回 oldValue 取負(即,算出一個數字相同但是符號相反的值)的結果。+new Date()相當於 ToNumber(new Date())
我們再來看看ECMAScript規範對ToNumber的定義:
我們知道new Date()是個物件,滿足上面的ToPrimitive(),所以進而成了ToPrimitive(new Date())
接著我們再來看看ECMAScript規範對ToPrimitive的定義,一層一層來,抽絲剝繭。
這個ToPrimitive可能不太好懂,我給你解釋一下吧:
ToPrimitive(obj,preferredType)JS引擎內部轉換為原始值ToPrimitive(obj,preferredType)函式接受兩個引數,第一個obj為被轉換的物件,第二個preferredType為希望轉換成的型別(預設為空,接受的值為Number或String)在執行ToPrimitive(obj,preferredType)時如果第二個引數為空並且obj為Date的事例時,此時preferredType會被設定為String,其他情況下preferredType都會被設定為Number如果preferredType為Number,ToPrimitive執行過程如下:1. 如果obj為原始值,直接返回;2. 否則呼叫 obj.valueOf(),如果執行結果是原始值,返回之;3. 否則呼叫 obj.toString(),如果執行結果是原始值,返回之;4. 否則拋異常。如果preferredType為String,將上面的第2步和第3步調換,即:1. 如果obj為原始值,直接返回;2. 否則呼叫 obj.toString(),如果執行結果是原始值,返回之;3. 否則呼叫 obj.valueOf(),如果執行結果是原始值,返回之;4. 否則拋異常。
首先我們要明白 obj.valueOf() 和 obj.toString() 還有原始值分別是什麼意思,這是弄懂上面描述的前提之一:
toString用來返回物件的字串表示。
valueOf方法返回物件的原始值,可能是字串、數值或bool值等,看具體的物件。
原始值指的是["Null","Undefined","String","Boolean","Number","Symbol"]6種基本資料型別之一
最後分解一下其中的過程:+new Date():
運算子new的優先順序高於一元運算子+,所以過程可以分解為:var time=new Date();+time2. 根據上面提到的規則相當於:ToNumber(time)3. time是個日期物件,根據ToNumber的轉換規則,所以相當於:ToNumber(ToPrimitive(time))4. 根據ToPrimitive的轉換規則:ToNumber(time.valueOf()),time.valueOf()就是 原始值 得到的是個時間戳,假設time.valueOf()=15034791246525. 所以ToNumber(1503479124652)返回值是1503479124652這個數字。6. 分析完畢