JS基本語法

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莉擒,隨后出現(xiàn)的幾起案子酿炸,更是在濱河造成了極大的恐慌,老刑警劉巖涨冀,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件填硕,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扁眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門壮莹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人姻檀,你說我怎么就攤上這事命满。” “怎么了绣版?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵胶台,是天一觀的道長。 經(jīng)常有香客問我杂抽,道長诈唬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任缩麸,我火速辦了婚禮讯榕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘匙睹。我一直安慰自己愚屁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布痕檬。 她就那樣靜靜地躺著霎槐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梦谜。 梳的紋絲不亂的頭發(fā)上丘跌,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音唁桩,去河邊找鬼闭树。 笑死,一個胖子當(dāng)著我的面吹牛荒澡,可吹牛的內(nèi)容都是我干的报辱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼单山,長吁一口氣:“原來是場噩夢啊……” “哼碍现!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起米奸,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昼接,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悴晰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慢睡,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了漂辐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻弄。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖者吁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饲帅,我是刑警寧澤复凳,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站灶泵,受9級特大地震影響育八,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赦邻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一髓棋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惶洲,春花似錦按声、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铐料,卻和暖如春渐裂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钠惩。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工柒凉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篓跛。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓膝捞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愧沟。 傳聞我的和親對象是個殘疾皇子绑警,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量计盒、變量、屬性芽丹、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 883評論 0 2
  • 基本語法 直接量 變量 標(biāo)識符 標(biāo)識符就是指變量北启、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)咕村,最好采用駝峰大小寫格式场钉,也就是...
    YM雨蒙閱讀 596評論 0 3
  • 關(guān)于 Swift 重要這個文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,301評論 1 27
  • wbsy001閱讀 154評論 2 2
  • 現(xiàn)在就是滿嘴的噠噠噠噠噠噠懈涛。大聲逛万,小聲,還有調(diào)調(diào)的批钠。 這次到爸爸老家宇植,還算可以的。有他表姐和他玩埋心,床也夠大讓他滾指郁。...
    林小夏199閱讀 487評論 0 1