typeof運(yùn)算符
JavaScript有三種方法碌燕,可以確定一個值到底是什么類型。
typeof運(yùn)算符
instanceof運(yùn)算符
Object.prototype.toString方法
typeof運(yùn)算符可以返回一個值的數(shù)據(jù)類型
(1)原始類型
數(shù)值会放、字符串、布爾值分別返回number钉凌、string咧最、boolean。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
(2)函數(shù)
函數(shù)返回function御雕。
function f() {}
typeof f
// "function"
(3)undefined
undefined返回undefined矢沿。
typeof undefined
// "undefined"
利用這一點(diǎn),typeof可以用來檢查一個沒有聲明的變量酸纲,而不報錯捣鲸。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
(4)其他
除此以外,其他情況都返回object闽坡。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
instanceof
判斷對象&數(shù)組用instanceof
instanceof前面接一個變量或者常量后面接一個函數(shù)
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
運(yùn)算符
布爾運(yùn)算符
布爾運(yùn)算符用于將表達(dá)式轉(zhuǎn)為布爾值栽惶,一共包含四個運(yùn)算符。
1疾嗅,取反運(yùn)算符:!
2外厂,且運(yùn)算符:&&
3,或運(yùn)算符:||
4代承,三元運(yùn)算符:?:
取反運(yùn)算符(!)
1酣衷, 取反運(yùn)算符形式上是一個感嘆號,用于將布爾值變?yōu)橄喾粗荡卧螅磘rue變成false,false變成true席爽。
2意荤, 對于非布爾值的數(shù)據(jù),取反運(yùn)算符會自動將其轉(zhuǎn)為布爾值只锻。
取反運(yùn)算符有轉(zhuǎn)換數(shù)據(jù)類型的作用玖像。
!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true
!54 // false
!'hello' // false
![] // false
!{} // false
上面代碼中,不管什么類型的值齐饮,經(jīng)過取反運(yùn)算后捐寥,都變成了布爾值。
如果對一個值連續(xù)做兩次取反運(yùn)算祖驱,等于將其轉(zhuǎn)為對應(yīng)的布爾值握恳,與Boolean函數(shù)的作用相同。這是一種常用的類型轉(zhuǎn)換的寫法捺僻。
!!x
// 等同于
Boolean(x)
取反運(yùn)算符的這種將任意數(shù)據(jù)自動轉(zhuǎn)為布爾值的功能乡洼,對且運(yùn)算符崇裁、或運(yùn)算符、三元條件運(yùn)算符都成立束昵。
且運(yùn)算符(&&)
且運(yùn)算符的運(yùn)算規(guī)則是:
1拔稳,如果第一個運(yùn)算子的布爾值為true,則返回第二個運(yùn)算子的值(注意是值锹雏,不是布爾值)
2巴比,如果第一個運(yùn)算子的布爾值為false,則直接返回第一個運(yùn)算子的值礁遵,且不再對第二個運(yùn)算子求值轻绞。
't' && '' // ""
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
短路邏輯(shortcut)
if (i) {
doSomething();
}
// 等價于
i && doSomething();
或運(yùn)算符(||)
或運(yùn)算符(||)的運(yùn)算規(guī)則是:
1,如果第一個運(yùn)算子的布爾值為true榛丢,則返回第一個運(yùn)算子的值铲球,且不再對第二個運(yùn)算子求值
2,如果第一個運(yùn)算子的布爾值為false晰赞,則返回第二個運(yùn)算子的值稼病。
't' || '' // "t"
't' || 'f' // "t"
'' || 'f' // "f"
'' || '' // ""
多個連用
false || 0 || '' || 4 || 'foo' || true
// 4
或運(yùn)算符常用于為一個變量設(shè)置默認(rèn)值。
function saveText(text) {
text = text || '';
// ...
}
// 或者寫成
saveText(this.text || '')
上面代碼表示掖鱼,如果函數(shù)調(diào)用時然走,沒有提供參數(shù),則該參數(shù)默認(rèn)設(shè)置為空字符串戏挡。
三元條件運(yùn)算符(?:)
三元條件運(yùn)算符用問號(?)和冒號(:)芍瑞,分隔三個表達(dá)式。如果第一個表達(dá)式的布爾值為true褐墅,則返回第二個表達(dá)式的值拆檬,否則返回第三個表達(dá)式的值。
't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"
上面代碼的t和0的布爾值分別為true和false妥凳,所以分別返回第二個和第三個表達(dá)式的值竟贯。
三元條件表達(dá)式與if...else語句具有同樣表達(dá)效果,前者可以表達(dá)的逝钥,后者也能表達(dá)屑那。但是兩者具有一個重大差別,if...else是語句艘款,沒有返回值持际;三元條件表達(dá)式是表達(dá)式,具有返回值哗咆。所以蜘欲,在需要返回值的場合,只能使用三元條件表達(dá)式晌柬,而不能使用if..else芒填。
console.log(true ? 'T' : 'F');
上面代碼中呜叫,console.log方法的參數(shù)必須是一個表達(dá)式,這時就只能使用三元條件表達(dá)式殿衰。如果要用if...else語句朱庆,就必須改變整個代碼寫法了。
算術(shù)運(yùn)算符
JavaScript提供9個算術(shù)運(yùn)算符闷祥,用來完成基本的算術(shù)運(yùn)算娱颊。
1,加法運(yùn)算符(Addition):x + y
2凯砍,減法運(yùn)算符(Subtraction): x - y
3箱硕,乘法運(yùn)算符(Multiplication): x * y
4,除法運(yùn)算符(Division):x / y
5悟衩,余數(shù)運(yùn)算符(Remainder):x % y
6剧罩,自增運(yùn)算符(Increment):++x 或者 x++
7,自減運(yùn)算符(Decrement):--x 或者 x--
8座泳,數(shù)值運(yùn)算符(Convert to number): +x
9惠昔,負(fù)數(shù)值運(yùn)算符(Negate):-x
減法、乘法挑势、除法運(yùn)算法比較單純镇防,就是執(zhí)行相應(yīng)的數(shù)學(xué)運(yùn)算。
余數(shù)運(yùn)算符
余數(shù)運(yùn)算符(%)返回前一個運(yùn)算子被后一個運(yùn)算子除潮饱,所得的余數(shù)
12 % 5 // 2
需要注意的是来氧,運(yùn)算結(jié)果的正負(fù)號由第一個運(yùn)算子的正負(fù)號決定。
-1 % 2 // -1
1 % -2 // 1
為了得到正確的負(fù)數(shù)的余數(shù)值香拉,需要先使用絕對值函數(shù)啦扬。
自增和自減運(yùn)算符
自增和自減運(yùn)算符,是一元運(yùn)算符凫碌,只需要一個運(yùn)算子扑毡。它們的作用是將運(yùn)算子首先轉(zhuǎn)為數(shù)值,然后加上1或者減去1证鸥。它們會修改原始變量。
var x = 1;
++x // 2
x // 2
--x // 1
x // 1
上面代碼的變量x自增后勤晚,返回2枉层,再進(jìn)行自減,返回1赐写。這兩種情況都會使得鸟蜡,原始變量x的值發(fā)生改變。
自增和自減運(yùn)算符有一個需要注意的地方挺邀,就是放在變量之后揉忘,會先返回變量操作前的值跳座,再進(jìn)行自增/自減操作;放在變量之前泣矛,會先進(jìn)行自增/自減操作疲眷,再返回變量操作后的值。
var x = 1;
var y = 1;
x++ // 1
++y // 2
上面代碼中您朽,x是先返回當(dāng)前值狂丝,然后自增,所以得到1哗总;y是先自增几颜,然后返回新的值,所以得到2讯屈。
數(shù)值運(yùn)算符蛋哭,負(fù)數(shù)值運(yùn)算符
數(shù)值運(yùn)算符(+)同樣使用加號,但是加法運(yùn)算符是二元運(yùn)算符(需要兩個操作數(shù))涮母,它是一元運(yùn)算符(只需要一個操作數(shù))谆趾。
數(shù)值運(yùn)算符的作用在于可以將任何值轉(zhuǎn)為數(shù)值(與Number函數(shù)的作用相同)。
+true // 1
+[] // 0
+{} // NaN
上面代碼表示哈蝇,非數(shù)值類型的值經(jīng)過數(shù)值運(yùn)算符以后棺妓,都變成了數(shù)值(最后一行NaN也是數(shù)值)。
負(fù)數(shù)值運(yùn)算符(-)炮赦,也同樣具有將一個值轉(zhuǎn)為數(shù)值的功能怜跑,只不過得到的值正負(fù)相反。連用兩個負(fù)數(shù)值運(yùn)算符吠勘,等同于數(shù)值運(yùn)算符性芬。
var x = 1;
-x // -1
-(-x) // 1
上面代碼最后一行的圓括號不可少,否則會變成遞減運(yùn)算符剧防。
數(shù)值運(yùn)算符號和負(fù)數(shù)值運(yùn)算符植锉,都會返回一個新的值,而不會改變原始變量的值峭拘。
賦值運(yùn)算符
賦值運(yùn)算符(Assignment Operators)用于給變量賦值俊庇。
最常見的賦值運(yùn)算符,當(dāng)然就是等號(=)鸡挠,表達(dá)式x = y表示將y的值賦給x辉饱。
除此之外,JavaScript還提供其他11個復(fù)合的賦值運(yùn)算符拣展。
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
這些復(fù)合的賦值運(yùn)算符彭沼,都是先進(jìn)行指定運(yùn)算,然后將得到值返回給左邊的變量备埃。
比較運(yùn)算符
比較運(yùn)算符用于比較兩個值姓惑,然后返回一個布爾值褐奴,表示是否滿足比較條件。
2 > 1 // true
上面代碼比較2是否大于1于毙,返回true敦冬。
JavaScript一共提供了8個比較運(yùn)算符。
== 相等
=== 嚴(yán)格相等
!= 不相等
!== 嚴(yán)格不相等
< 小于
<= 小于或等于
大于
= 大于或等于
禁用 == 和 !=
JS里面只有比較運(yùn)算符為反回boolean
兩個等于號永遠(yuǎn)不準(zhǔn)用(面試時就直接說我覺得兩個等于號太復(fù)雜了不會)
===(三個等于號)
不是基本類型就不相等
只要是基本類型看值是不是相等
NaN不等于NaN
位運(yùn)算符
位運(yùn)算符用于直接對二進(jìn)制位進(jìn)行計算望众,一共有7個匪补。
或運(yùn)算(or):符號為|,表示若兩個二進(jìn)制位都為0烂翰,則結(jié)果為0夯缺,否則為1。
與運(yùn)算(and):符號為&甘耿,表示若兩個二進(jìn)制位都為1踊兜,則結(jié)果為1,否則為0佳恬。
否運(yùn)算(not):符號為~捏境,表示對一個二進(jìn)制位取反。
異或運(yùn)算(xor):符號為^毁葱,表示若兩個二進(jìn)制位不相同垫言,則結(jié)果為1,否則為0倾剿。
左移運(yùn)算(left shift):符號為<<筷频,詳見下文解釋。
右移運(yùn)算(right shift):符號為>>前痘,詳見下文解釋凛捏。
帶符號位的右移運(yùn)算(zero filled right shift):符號為>>
位運(yùn)算符只對整數(shù)起作用,如果一個運(yùn)算子不是整數(shù)芹缔,會自動轉(zhuǎn)為整數(shù)后再執(zhí)行坯癣。另外,雖然在JavaScript內(nèi)部最欠,數(shù)值都是以64位浮點(diǎn)數(shù)的形式儲存示罗,但是做位運(yùn)算的時候,是以32位帶符號的整數(shù)進(jìn)行運(yùn)算的芝硬,并且返回值也是一個32位帶符號的整數(shù)蚜点。
i = i | 0;
上面這行代碼的意思,就是將i(不管是整數(shù)或小數(shù))轉(zhuǎn)為32位整數(shù)吵取。
“或運(yùn)算”與“與運(yùn)算”
這兩種運(yùn)算比較容易理解禽额,就是逐位比較兩個運(yùn)算子锯厢∑す伲“或運(yùn)算”的規(guī)則是脯倒,兩個二進(jìn)制位之中只要有一個為1,就返回1捺氢,否則返回0藻丢。“與運(yùn)算”的規(guī)則是摄乒,兩個二進(jìn)制位之中只要有一個位為0悠反,就返回0,否則返回1馍佑。
0 | 3 // 3
0 & 3 // 0
上面兩個表達(dá)式斋否,0和3的二進(jìn)制形式分別是00和11,所以進(jìn)行“或運(yùn)算”會得到11(即3)拭荤,進(jìn)行“與運(yùn)算”會得到00(即0)茵臭。
位運(yùn)算只對整數(shù)有效,遇到小數(shù)時舅世,會將小數(shù)部分舍去旦委,只保留整數(shù)部分。所以雏亚,將一個小數(shù)與0進(jìn)行或運(yùn)算缨硝,等同于對該數(shù)去除小數(shù)部分,即取整數(shù)位罢低。
2.9 | 0 // 2
-2.9 | 0 // -2
需要注意的是蕴侣,這種取整方法不適用超過32位整數(shù)最大值2147483647的數(shù)没咙。
2147483649.4 | 0;
// -2147483647
左移右移運(yùn)算符:將一個數(shù)字乘/除以2、4、8
void運(yùn)算符
void 不管后面跟上什么都會返回undefined
void 0 // undefined
void(0) // undefined
逗號運(yùn)算符
逗號運(yùn)算符用于對兩個表達(dá)式求值岔擂,并返回后一個表達(dá)式的值。
'a', 'b' // "b"
var x = 0;
var y = (x++, 10);
x // 1
y // 10
運(yùn)算符優(yōu)先級
1突颊,記不住9
2丧枪,括號優(yōu)先級最高,逗號運(yùn)算符優(yōu)先級最低日杈,賦值倒數(shù)第二
3遣铝,結(jié)合律:w = x = y = z;
字符串轉(zhuǎn)義
\0 null(\u0000)
\b 后退鍵(\u0008)
\f 換頁符(\u000C)
\n 換行符(\u000A)
\r 回車鍵(\u000D)
\t 制表符(\u0009)
\v 垂直制表符(\u000B)
' 單引號(\u0027)
" 雙引號(\u0022)
\ 反斜杠(\u005C)
\uFFFF 對應(yīng) FFFF 的字符
Windows \r\n
Linux mac \n