JavaScript中的一元運算符

JavaScript中有9種經常使用的一元運算符,本文作簡單羅列和說明。javascript

加運算符 +

將操做數轉換爲數字
function與object大部分狀況都會被轉換爲NaN
除非對象擁有一個名爲valueOf函數值且其函數有返回值java

+{
  valueOf: function(){
    return '0xFF'
  }
}
//returns 255

減運算符 -

也是將操做數轉數字,同時變爲負數node

邏輯取反運算符 !

在取反前,會進行隱式類型轉換git

遞增 ++ 和遞減 --

將操做數遞增或遞減,注意位置放到前面和後面會有區別,如同C語言中同樣github

按位非運算符 ~

對任一數值x進行按位非運算操做的結果爲-(x+1)chrome

typeof

操做數放到typeof的後面,會返回當前操做數的類型,對於數值類型能夠準確返回,對於引用類型,Function會返回'function',其餘都只會返回'object'數組

delete

刪除數組或對象中特定索引的值
刪除成功時會返回true,刪除失敗時返回false瀏覽器

// 刪除變量
var hi = 1;
delete hi;          // returns false
console.log(hi);    // returns 1

// 刪除函數
function yo(){ };
delete yo;           // returns false
console.log(yo);     // returns function foo(){ }

// 刪除對象
var pub = {bar: '1'}
delete pub           // returns false
console.log(pub);    // returns {bar: '1'}

//刪除數組
var code = [1,1,2,3,5]
delete code          // returns false
console.log(code);   //  [1,1,2,3,5]

對於數組的索引刪除:函數

// 刪除數組中的某個值
var lol=[20,30,40];
console.log(lol.length);     // returns 3
delete lol[2]                // returns true
console.log(lol);            // returns [ 20, 30,  ]
console.log(lol[2]);         // returns undefined
console.log(lol.length);     // returns 3

void

丟棄表達式的返回值,而返回undefined
使用方式有void 表達式,void (表達式) 兩種code

附:加法的隱式裝箱

在加法的過程當中,首先把等號左右兩邊進行了求原值ToPrimitive()操做,而後若是兩個原值只要有一個是String類型,就把兩個原值都進行轉化字符串ToString()操做,進行字符串拼接;不然把兩個原值都進行轉化數字ToNumber()操做,進行數字相加。
ToPrimitive(input [, PreferredType])
將input轉換爲原始值,PreferredType爲可選參數,只接受Number或String,用來設置轉換偏好
通常狀況下,對Date求原值,則PreferredType是String,其餘Object對象均爲Number

PreferredType轉換策略

  • PreferredType是String,則先調用toString(),結果不是原始值,則再調用valueOf(),還不是原始值的話則拋出錯誤
  • PreferredType是Number,則先調用valueOf(),再調用toString()

練習

[] + [] // ""

進行ToPrimitive,兩個都是Array對象,不是Date對象,因此以Number爲轉換標準,因此先調用valueOf(),結果仍是[ ],不是原始值,因此繼續調用toString(),結果是「」原始值,將「」回。第二個[ ]過程是相同的,返回「」。加號兩邊結果都是String類型,因此進行字符串拼接,結果是「」。

[] + {} // "[object Object]"

進行ToPrimitive,依然是以Number爲轉換標準。
[ ]的結果是「」。
{ }先調用valueOf(),結果是{ },不是原始值,因此繼續調用toString(),結果是「[object Object]」,是原始值,將「[object Object]」返回。
加號兩邊結果都是String類型,因此進行字符串拼接,結果是「[object Object]」。

{} + [] // 0

這道題按照上一題的步驟,講道理的話,結果應該仍是「[object Object]」,但結果卻如人意料——顯示的答案是0!
這是什麼緣由呢?原來{ } + [ ]被解析成了{ };+[ ],前面是一個空代碼塊被略過,剩下+[ ]就成了一元運算。[ ]的原值是」」, 將」」轉化成Number結果是0。

{} + {} // "[object Object][object Object]"

在金絲雀版本的chrome瀏覽器和node中,結果符合預期。
結果是」object Object」。
在普通版本的chrome瀏覽器中結果是NaN。
這是爲何呢?緣由是在node中會將以「{」開始,「}」結束的語句外面包裹一層( ),就變成了({ } + { }),結果就符合預期。而普通版本的chrome依然會解析成{};+{},結果就變成了NaN

參考

developer.mozilla Bitwise operators
JavaScript Unary Operators: Simple and Useful
js隱式裝箱-ToPrimitive

相關文章
相關標籤/搜索