JavaScript 運算符,也叫操做符javascript
隱式類型轉換:java
不會對等號右邊的值產生影響;程序員
對非 Number 的值進行運算時,都會先轉換成 Number 再運算,除非有字符串進行運算;數組
任何值與 NaN 進行運算,都得 NaN 。瀏覽器
+ 對兩個值進行相加,返回一個數字 Number ,可是又字符串進行運算會返回一個字符串函數
c = 123+"4"; // c 等於字符串"1234" result = 1 + 2 + '3'; // result 爲字符串 '33' result = '1' + 2 + 3; // result 爲字符串 '123'
valueOf
方法,對象的valueOf
方法老是返回對象自身toString
方法,將其轉爲字符串
var obj = { p: 1 }; obj.valueOf() // { p: 1 } obj.valueOf().toString() // "[object Object]"
本身定義valueOf
方法或toString
方法,獲得想要的結果。工具
var obj = { valueOf: function () { // 重寫 .valueOf() return 1; } }; obj + 2 // 3 var obj = { toString: function () { // 重寫 .toString() return 'hello'; } }; obj + 2 // "hello2"
- 對兩個值進行相減,返回一個數字 Numberspa
* 對兩個值進行相乘,返回一個數字 Number3d
/ 對兩個值進行相除,返回一個數字 Numbercode
% 對兩個值進行取餘,返回一個數字 Number
// 正確的寫法 function isOdd(n) { return Math.abs(n % 2) === 1; } isOdd(-5) // true isOdd(-4) // false
** 指數運算符
2 ** 4 // 16 即 2 的 4 次方
2 ** 3 ** 2 // 512 至關於 2 ** (3 ** 2)
只須要一個操做數
對於非數字運算,會先轉換成 Number 再進行運算
var result = 1 + +'2' + 3; // result 爲 Number 類型的 6
var a = 1; a++; // a 在這條語句執行完之後,a = 2 ++a; // a 在這條語句執行過程當中 a = 2
var b = 2; result = b-- + b; // b = 1 , result = 3 result = --b + b; // b = 1, result = 2
! 對右側的值進行非運算,並返回布爾類型的值:true 變 false;false 變 true
var a = false; a = !!a; // 若是對一個值進行兩次取反,不會發生變化。
var b = 10; b = !b; // 對非布爾類型的值進行非運算,會先轉換成 Boolean 類型,再進行運算
能夠利用這個特性進行隱式類型轉換,b = !!b; // 便可將 b 變成一個布爾值
&& 對符號兩側的值進行與運算,並返回布爾類型的值:只要有一個值爲 false ,就返回 false
if (i) { doSomething(); } // 等價於 i && doSomething();
|| 對符號兩側的值進行或運算,並返回布爾類型的值:只要有一個值爲 true,就返回 true
= 將 右側的值 賦給 左側的變量
x += y // 等同於 x = x + y x -= y // 等同於 x = x - y x *= y // 等同於 x = x * y x /= y // 等同於 x = x / y x %= y // 等同於 x = x % y x **= y // x = x ** y
x >>= y // 等同於 x = x >> y x <<= y // 等同於 x = x << y x >>>= y // 等同於 x = x >>> y x &= y // 等同於 x = x & y x |= y // 等同於 x = x | y x ^= y // 等同於 x = x ^ y
比較兩個值之間的大小關係,關係成立則返回 true,關係不成立則返回 false 。
對於非數字進行比較,則先轉換成數字再比較。。。
若是兩個字符串比較,不會轉換成數字,會比較Unicode 。。。一位一位比,出結果就不比了。。。能夠進行英文名排序。
任何值和 NaN 進行任何比較,都返回 false 。
如
result = 5 < 4; // 關係不成立,result 爲false 。 // 當 console.log("123456" < "5"); // 但願獲得一個數字上的正確比較 // 則能夠寫成 console.log("123456" < +"5"); // 即,爲其中一個字符串加 "+" 轉換成數字,再進行比較
>
==
!=
<
>=
<=
undefined
和null
與其餘類型的值比較時,結果都爲false
,它們互相比較時結果爲true
比較兩個值是否相等。
相等返回true,不等返回false
var a = 10; console.log(a == 2); // 很明顯 打印 false
console.log('1' == 1); // 會打印 true
在上面的例子裏,是將 '1' 轉換成了 Number 類型。
console.log(null == 0); // 這是特殊狀況,沒有轉換成 Number,因此打印 false
console.log(null == undefined); // 這也是特殊狀況,因爲 undefined 衍生自 null,因此打印 true
console.log(NaN == NaN); // 這也是特殊狀況,NaN 不和任何值相等,包括它自己,因此打印 false
能夠經過 isNaN() 函數判斷一個值是不是NaN
var b = NaN;
console.log(isNaN(b)); // 若是是 NaN 返回true,不然返回 false
比較兩個值是否不相等。
不等返回true,相等返回false
若是兩個值的類型不一樣時,會自動進行類型轉換,再進行比較。
if..else
var a = 10; var b = 20; a > b : alert('a大'):alert('b大'); /***************************/ // 獲取 a 和 b 中的最大值 var max = a > b ? a:b; // 獲取 a , b , c 中的最大值 var max = ( a > b)? (a>c?a:c):(b>c?b:c);
=== 全等
console.log(1 === '1'); // false console.log(null === undefined); // false
{} === {} // false [] === [] // false (function () {} === function () {}) // false // 結果都是不相等 // 緣由是對於複合類型的值,嚴格相等運算比較的是,它們是否引用同一個內存地址 // 而運算符兩邊的空對象、空數組、空函數的值,都存放在不一樣的內存地址,結果固然是false
var v1 = {}; var v2 = v1; v1 === v2 // true
undefined
和null
與自身嚴格相等
!== 不全等
console.log(1 !== '1'); // true console.log(null !== undefined); // true
1 !== '1' // true // 等同於 !(1 === '1')
void 運算符
做用是執行一個表達式,而後不返回任何值,或者說返回undefined
實際上等同於 void (x = 5) // 執行完 x=5 後 , 返回 undefinedvoid 4 + 7 //(void 4) + 7
<a href="javascript: void(f())">文字</a>
<a href="javascript: void(document.form.submit())">
提交
</a>
var a , b , c; var a = 1 , b , c = 3;
'a', 'b' // "b" var x = 0; var y = (x++, 10); x // 1 y // 10
在返回一個值以前,先進行一些輔助操做
var value = (console.log('Hi!'), true); // Hi! value // true
運算符的優先級
二進制位運算符
用於直接對二進制位進行計算,一共有7個
| 或運算符 or 兩個二進制位都爲0,則結果爲0
function toInt32(x) { return x | 0; } toInt32(1.001) // 1 toInt32(1.999) // 1 toInt32(1) // 1 toInt32(-1) // -1 toInt32(Math.pow(2, 32) + 1) // 1 toInt32(Math.pow(2, 32) - 1) // -1
& 與運算符 and 兩個二進制位都爲1,則結果爲 1
0 & 3 // 0
00
)和3(二進制11
)進行二進制與運算會獲得00
~ 否運算符 not 對一個二進制位取反
~ 3 // -4 能夠理解成 -3減一
3
進行二進制否運算,獲得-4
。之因此會有這樣的結果,是由於位運算時,JavaScirpt 內部將全部的運算子都轉爲32位的二進制整數再進行運算// 3的32位整數形式是00000000000000000000000000000011 // 二進制否運算之後獲得11111111111111111111111111111100 // 因爲第一位(符號位)是1,因此這個數是一個負數 // JavaScript 內部採用補碼形式表示負數, // 即須要將這個數減去1,再取一次反,而後加上負號,才能獲得這個負數對應的10進制值 // 這個數減去1等於11111111111111111111111111111011,再取一次反獲得00000000000000000000000000000100,再加上負號就是-4
~~2.9 // 2 ~~47.11 // 47 ~~1.9999 // 1 ~~3 // 3 // 使用二進制否運算取整,是全部取整方法中最快的一種
Number
函數,將字符串轉爲數值
^ 異或運算符 xor 兩個二進制位不一樣,則結果爲 1
a
和b
進行三次異或運算,a^=b; b^=a; a^=b;
,能夠互換它們的值// 在不引入臨時變量的前提下,互換兩個變量的值 var a = 10; var b = 99; a ^= b, b ^= a, a ^= b; a // 99 b // 10
這是互換兩個變量的值的最快方法。
12.9 ^ 0 // 12
<< 左移運算符 left shift
0
,即乘以 2 的指定次方。// 4 的二進制形式爲100, // 左移一位爲1000(即十進制的8) // 至關於乘以2的1次方 4 << 1 // 8 -4 << 1 // -8
13.5 << 0 // 13 -13.5 << 0 // -13
// RGB to HEX // (1 << 24)的做用爲保證結果是6位數 // 自定義 將顏色的 RGB 值轉爲 HEX 值 var rgb2hex = function(r, g, b) { return '#' + ((1 << 24) + (r << 16) + (g << 8) + b) .toString(16) // 先轉成十六進制,而後返回字符串 .substr(1); // 去除字符串的最高位,返回後面六個字符串 }
>> 右移運算符 right shift
0
,即除以 2的指定次方(最高位即符號位不參與移動)4 >> 1 // 2 // 由於4的二進制形式爲 00000000000000000000000000000100, // 右移一位獲得 00000000000000000000000000000010, // 即爲十進制的2 -4 >> 1 // -2 // 由於-4的二進制形式爲 11111111111111111111111111111100, // 右移一位,頭部補1,獲得 11111111111111111111111111111110, // 即爲十進制的-2
5 >> 1 // 至關於 5 / 2 = 2 21 >> 2 // 至關於 21 / 4 = 5 21 >> 3 // 至關於 21 / 8 = 2 21 >> 4 // 至關於 21 / 16 = 1
>>> 帶符號位的右移運算符 zero filled right shift
0
。因此,該運算老是獲得正值。>>
)徹底一致,區別主要在於負數。-1 >>> 0 // 4294967295 // -1做爲32位整數時,內部的儲存形式使用無符號整數格式解讀,值爲 4294967295(即(2^32)-1,等於11111111111111111111111111111111)
// 位運算符能夠用做設置對象屬性的開關 // 能夠設置一個四位的二進制數,它的每一個位對應一個開關 var FLAG_A = 1; // 0001 var FLAG_B = 2; // 0010 var FLAG_C = 4; // 0100 var FLAG_D = 8; // 1000
// 與運算 檢驗當前設置 是否打開了指定開關 var flags = 5; // 二進制的0101 if (flags & FLAG_C) { // 0101 & 0100 => 0100 => true // 若是打開了就...... }
// 假設須要打開A、B、D三個開關,咱們能夠構造一個掩碼變量 var mask = FLAG_A | FLAG_B | FLAG_D; // 0001 | 0010 | 1000 => 1011
flags = flags & mask; // 與運算能夠將當前設置中凡是與開關設置不同的項 flags = flags ^ mask; // 異或運算能夠切換(toggle)當前設置,即第一次執行能夠獲得當前設置的相反值,再執行一次又獲得原來的值。 flags = ~flags; // 否運算能夠翻轉當前設置,即原設置爲0,運算後變爲1;原設置爲1,運算後變爲0