从 +new Date 说起,Javascript的一元操作符
http://zhouhua.github.io/2013/07/09/UnaryOperator/
更多在偶然打開d3?的源代碼的時(shí)候,我看到了這樣一段代碼。
| 1 2 3 | if (!Date.now) Date.now = function() { ????return +new Date; }; |
大體上可以看出這是在?Date?對(duì)象中加入一個(gè)?now?方法以獲得當(dāng)前時(shí)間。但是?return +new Date;?似乎是一種很不合常規(guī)的寫法,這個(gè)+?是干什么用的呢?其實(shí)這里并沒有用到很高級(jí)的javascript技巧,相反,只是用到了一個(gè)極其簡單的一元操作符,只不過這樣的用法比較少見,用法與其他編程語言太不一樣,所以讓人們有一種陌生的感覺。
翻開ECMAScript的規(guī)范,如果不算NOT運(yùn)算的?~?操作符,一共有8個(gè)一元操作符。讓我們逐一了解下。
+操作符
我們從開篇的?+操作符?開始介紹。使用方法上,這個(gè)操作符與各位從初中數(shù)學(xué)中見過的“正號(hào)”類似,放在一個(gè)變量或表達(dá)式的前面。對(duì)數(shù)字類型的變量而言,+操作符?對(duì)結(jié)果沒有影響,對(duì)于其他類型的變量則是轉(zhuǎn)化成數(shù)字類型的變量,如果轉(zhuǎn)化失敗,則為特殊數(shù)字類型常量?NaN?。那么運(yùn)算+a?——假設(shè)?a?為一個(gè)非數(shù)字類型的對(duì)象——究竟對(duì)a執(zhí)行了怎樣的操作呢?一種說法是默認(rèn)調(diào)用valueOf方法,相當(dāng)于?a.valueOf()?;不過經(jīng)過我的具體實(shí)驗(yàn),似乎另一種說法更可信,即?+a=Number(a)。
-操作符
與?+操作符?類似,-操作符?就像是數(shù)學(xué)里的負(fù)號(hào),所以我們可以知道?-a=0-(+a),以上兩個(gè)符號(hào)為一組。
++操作符
這個(gè)段落里其實(shí)會(huì)包含兩種操作符,分別是類似?a++和類似?++a?。熟悉C語言或者Java的讀者都很了解?++?的含義。的確,這兩操作符是EmacScript直接借鑒java的自增操作符,表示將操作數(shù)加上1,即?a++?等價(jià)于?++a?等價(jià)于?a+1。然而數(shù)值上運(yùn)算結(jié)果的等價(jià)不代表這兩種操作符是相同的,其實(shí)它們之間還明差異的,相信了解C語言或Java的讀者聽說過它們之間“先賦值再運(yùn)算”和“先運(yùn)算再賦值”的差異。
那它們的差異具體是什么樣的呢?還是以具體的實(shí)驗(yàn)結(jié)果來說明吧。
Javascript代碼| 1 2 | var a=10; console.log(a++ - 1); |
圖1:a++?運(yùn)算結(jié)果
Javascript代碼| 1 2 | var a=10; console.log(++a - 1); |
圖2:++a?運(yùn)算結(jié)果
從以上實(shí)驗(yàn)結(jié)果我們知道,a++ - 1?先執(zhí)行出?a - 1?的結(jié)果,再執(zhí)行?a=a+1,所以相當(dāng)于“先運(yùn)算再賦值”;而?++a - 1?則不同,它是先執(zhí)行?a=a+1,再用新的a來參與運(yùn)算?a - 1,因而這是“先賦值再運(yùn)算”。
–操作符
同樣,這里也是?a--?和?--a?兩個(gè)操作符,具體含義與?++操作符相反,表示操作數(shù)減1,具體特點(diǎn)與上段相同,不再贅述。
delete操作符
這里的?delete?與C++中的?delete?關(guān)鍵字不同,這不是用來釋放一個(gè)對(duì)象的內(nèi)存空間,而是釋放對(duì)象內(nèi)部的一個(gè)自定義屬性和方法的引用。對(duì)于?delete?的用法,我用一張圖片來說明。
我們定義了一個(gè)Date類型的對(duì)象?a,并給它定義一個(gè)屬性?name?和一個(gè)方法?speak,然后我們用?delete?操作符將自定義的屬性和方法刪除。同時(shí)我們也發(fā)現(xiàn),對(duì)于Javascript內(nèi)置的屬性和方法是不可以通過delete?操作符刪除的,這里我們測試的是Date對(duì)象的valueOf方法。
我再拋出一個(gè)簡單的問題,如果我們定義一個(gè)變量或函數(shù),是否可以用delete?操作符來刪除這個(gè)變量或函數(shù)?為什么?
void操作符
void?操作符的用途是對(duì)所有的表達(dá)式返回?undefined,這個(gè)功能似乎很奇怪,或許在防止產(chǎn)生意外計(jì)算結(jié)果的時(shí)候會(huì)有用吧……看到比較多的應(yīng)用,一個(gè)是作為死鏈接,一個(gè)是打開新窗口。
void操作符制作死鏈接
| 1 | <a href="javascript:void(0)">我是一個(gè)死鏈接</a> |
我是一個(gè)死鏈接
打開新窗口
要打開一個(gè)新窗口,我們可以用這個(gè)代碼:
| 1 | <a href="javascript:window.open('about:blank')">打開新窗口</a> |
我不建議讀者點(diǎn)這個(gè)鏈接,不過我測試下來,chrome瀏覽器是對(duì)這個(gè)問題做了處理,如果你是想故意測試這個(gè)bug,請(qǐng)換IE瀏覽器來點(diǎn)擊前面的鏈接。這個(gè)時(shí)候?void?操作符就能夠發(fā)揮作用了,我們把代碼改為:
| 1 | <a href="javascript:void(window.open('about:blank'))">打開新窗口</a> |
讀者再點(diǎn)擊鏈接,就不會(huì)再有上面的bug了。
本文基于署名-非商業(yè)性使用 3.0許可協(xié)議發(fā)布,轉(zhuǎn)載、演繹必須保留本文的署名周驊(包含鏈接http://zhouhua.github.io),且不得用于商業(yè)目的。如您有任何疑問或者授權(quán)方面的協(xié)商,請(qǐng)與我聯(lián)系。
總結(jié)
以上是生活随笔為你收集整理的从 +new Date 说起,Javascript的一元操作符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS3 教程
- 下一篇: Java Hessian小试(转)