一宇弛、JS概述
關(guān)于JavaScript的歷史鸡典,語(yǔ)言特點(diǎn),略涯肩。
二轿钠、JavaScript的組成
JavaScript是ECMAScript、文檔對(duì)象模型(document object model:DOM)病苗、瀏覽器對(duì)象模型(brower object model:BOM)由三部分構(gòu)成疗垛,其核心是ECMAScript,它描述了該語(yǔ)言的語(yǔ)法和基本對(duì)象硫朦;DOM 描述了處理網(wǎng)頁(yè)內(nèi)容的方法和接口贷腕,通過(guò) DOM,可以訪問(wèn)所有的 HTML 元素咬展,連同它們所包含的文本和屬性泽裳,可以對(duì)其中的內(nèi)容進(jìn)行修改和刪除,同時(shí)也可以創(chuàng)建新的元素破婆;BOM 描述了與瀏覽器進(jìn)行交互的方法和接口涮总,BOM提供了獨(dú)立于內(nèi)容而與瀏覽器窗口進(jìn)行交互的對(duì)象,例如可以移動(dòng)祷舀,調(diào)整瀏覽器大小的window對(duì)象瀑梗,可以用于導(dǎo)航的location對(duì)象與history對(duì)象烹笔,可以獲取瀏覽器,操作系統(tǒng)與用戶屏幕信息的navigator與screen對(duì)象抛丽,可以使用document作為訪問(wèn)HTML文檔的入口谤职,管理框架的frames對(duì)象等。
三亿鲜、JavaScript的引入方式
3.1外部引入
在<script></script>標(biāo)簽里面src=“ ”允蜈;中添加鏈接
<script type="text/javascript" src="yuanmi.js">
// 如果鏈接了外部JS文件,script標(biāo)簽里面的JS代碼就不執(zhí)行了
// 此處不能加JS代碼
</script>
3.2內(nèi)部引入
在script標(biāo)簽內(nèi)添加
<script type="text/javascript">
<!-- script標(biāo)簽可以有多個(gè)蒿柳,按順序執(zhí)行 -->
console.log("你好饶套!")
</script>
四、基本概念
1垒探、ECMAscript中的一切(變量凤跑、函數(shù)名,操作符)都區(qū)分大小寫(xiě)
2叛复、標(biāo)志符(標(biāo)識(shí)符(identifier)指的是用來(lái)識(shí)別各種值的合法名稱(chēng)。最常見(jiàn)的標(biāo)識(shí)符就是變量名扔仓,以及后面要提到的函數(shù)名):第一個(gè)字符必須是一個(gè)字母褐奥,下劃線、美元符號(hào)翘簇。其他字符可以是字符撬码、下劃線。美元符號(hào)版保、或者是數(shù)字
JavaScript 有一些保留字呜笑,不能用作標(biāo)識(shí)符:
arguments、break彻犁、case叫胁、catch、class汞幢、const驼鹅、continue、debugger森篷、
default输钩、delete、do仲智、else买乃、enum、eval钓辆、export剪验、extends肴焊、false、
finally碉咆、for抖韩、function、if疫铜、implements茂浮、import、in壳咕、instanceof席揽、
interface、let谓厘、new幌羞、null、package竟稳、private属桦、protected、public他爸、
return聂宾、static、super诊笤、switch系谐、this、throw讨跟、true纪他、try、typeof晾匠、var茶袒、void、while凉馆、with弹谁、yield。
3句喜、注釋
- 單行注釋?zhuān)?/
- 多行注釋?zhuān)?* */
4预愤、變量:ECMAscript的變量是松散型的,所謂松散型就是可以用來(lái)保存任何類(lèi)型的數(shù)據(jù)咳胃、定義時(shí)要用var操作符植康,如果在函數(shù)中使用var定義一個(gè)變量,那么這個(gè)變量在函數(shù)退出 后就會(huì)被銷(xiāo)毀展懈,如果省略var销睁,那么這個(gè)變量就成為全局變量供璧,可以在函數(shù)外的任何一個(gè)地方被訪問(wèn)到,但是冻记,不推薦這么使用睡毒。
- 變量是對(duì)值的具名引用,變量就是為“值”起名冗栗,然后引用這個(gè)名字演顾,就等同于引用這個(gè)值
- 如果只是聲明變量而沒(méi)有賦值,則該變量的值是undefined
- 變量的類(lèi)型沒(méi)有限制隅居,變量可以隨時(shí)更改類(lèi)型钠至。
- 第二次聲明的時(shí)候還進(jìn)行了賦值,則會(huì)覆蓋掉前面的值胎源。
- 變量提升:JavaScript 引擎的工作方式是棉钧,先解析代碼,獲取所有被聲明的變量涕蚤,然后再一行一行地運(yùn)行宪卿。這造成的結(jié)果,就是所有的變量的聲明語(yǔ)句万栅,都會(huì)被提升到代碼的頭部愧捕,這就叫做變量提升。表示變量已聲明申钩,但還未賦值
五、數(shù)據(jù)類(lèi)型
JavaScript 語(yǔ)言的每一個(gè)值瘪阁,都屬于某一種數(shù)據(jù)類(lèi)型撒遣。JavaScript 的數(shù)據(jù)類(lèi)型,共有六種管跺。(ES6 又新增了第七種 Symbol 類(lèi)型的值义黎,本文不涉及。)
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):文本(比如Hello World)豁跑。
- 布爾值(boolean):表示真?zhèn)蔚膬蓚€(gè)特殊值廉涕,即true(真)和false(假)
- undefined:表示“未定義”或不存在,即由于目前沒(méi)有定義艇拍,所以此處暫時(shí)沒(méi)有任何值
- null:表示空值狐蜕,即此處的值為空。
- 對(duì)象(object):各種值組成的集合卸夕。
通常层释,數(shù)值、字符串快集、布爾值這三種類(lèi)型贡羔,合稱(chēng)為原始類(lèi)型(primitive type)的值廉白,即它們是最基本的數(shù)據(jù)類(lèi)型,不能再細(xì)分了乖寒。對(duì)象則稱(chēng)為合成類(lèi)型(complex type)的值跳夭,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類(lèi)型的值的合成,可以看作是一個(gè)存放各種值的容器眉菱。至于undefined和null帆锋,一般將它們看成兩個(gè)特殊值。
5.1 undefined
- 1马澈、定義一個(gè)變量瓢省,但是沒(méi)有初始化,會(huì)得到undefined
- 2痊班、變量未定義勤婚,會(huì)得到undefined
- 3、函數(shù)中return不帶任何返回值時(shí)涤伐,函數(shù)停止執(zhí)行會(huì)返回undefined
- 4馒胆、函數(shù)參數(shù)arguments,沒(méi)有傳遞值的命名參數(shù)將自動(dòng)被賦予undefined
- 5凝果、對(duì)象沒(méi)有賦值的屬性
var o = new Object(); o.p // undefined
5.2 Null
- null是只有一個(gè)值得數(shù)據(jù)類(lèi)型祝迂,這個(gè)特殊值是null
- null值表示一個(gè)空對(duì)象指針,如果保存對(duì)象的變量還沒(méi)有真正的保存對(duì)象器净,就應(yīng)該明確的讓該變量保存null值
特殊情況: - alert(null == undefined)//true
- alert(null === undefined)//false
5.3 Boolean
該類(lèi)型有2個(gè)字面量值true和false型雳,經(jīng)常用在流程控制語(yǔ)句和選擇判斷語(yǔ)句,
常見(jiàn)false值,除了false值都基本都是true
- 1.數(shù)字0山害、
- 2.NaN纠俭、
- 3.“ ”,空字符串
- 4.false
- 5.undefined
- 6.null
下列運(yùn)算符會(huì)返回布爾值:
- 前置邏輯運(yùn)算符: ! (Not)
- 相等運(yùn)算符:===浪慌,!==冤荆,==,!=
- 比較運(yùn)算符:>权纤,>=钓简,<,<=
5.4 Number
1汹想、浮點(diǎn)數(shù):所謂浮點(diǎn)數(shù)外邓,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),且小數(shù)點(diǎn)后面至少有一位數(shù)字古掏,由于保存浮點(diǎn)數(shù)的內(nèi)存空間是保存整數(shù)的2倍坐榆,因此,如果小數(shù)點(diǎn)后面沒(méi)有任何數(shù)字冗茸,或者本身就是一個(gè)整數(shù)(1.0)席镀,那么該值會(huì)被轉(zhuǎn)化成整數(shù)匹中,但是浮點(diǎn)數(shù)計(jì)算會(huì)產(chǎn)生四舍五入誤差的問(wèn)題。
2豪诲、數(shù)值范圍:由于內(nèi)存的限制顶捷,ECMAScript 并不能保存世界上所有的數(shù)值。ECMAScript 能夠表示的最小數(shù)值保 存在 Number.MIN_VALUE 中——在大多數(shù)瀏覽器中屎篱,這個(gè)值是 5e-324;能夠表示的最大數(shù)值保存在 Number.MAX_VALUE 中——在大多數(shù)瀏覽器中服赎,這個(gè)值是 1.7976931348623157e+308。如果某次計(jì)算的 結(jié)果得到了一個(gè)超出 JavaScript 數(shù)值范圍的值交播,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)換成特殊的 Infinity 值重虑。具 體來(lái)說(shuō),如果這個(gè)數(shù)值是負(fù)數(shù)秦士,則會(huì)被轉(zhuǎn)換成-Infinity(負(fù)無(wú)窮)缺厉,如果這個(gè)數(shù)值是正數(shù),則會(huì)被轉(zhuǎn) 換成 Infinity(正無(wú)窮)隧土。
isFinite():這個(gè)函數(shù)在參數(shù)位于最小和最大值之間會(huì)返回true
3提针、NaN
這個(gè)數(shù)值表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回的情況(這樣不會(huì)拋出錯(cuò)誤)
任何設(shè)計(jì)NAN的操作都會(huì)返回NaN,其次曹傀,NaN與任何值都不相等辐脖,包括NaN本身
isNaN():任何不能被轉(zhuǎn)化成數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true
- 數(shù)值轉(zhuǎn)化
Number():可以轉(zhuǎn)化任何類(lèi)型數(shù)據(jù)
parseInt():專(zhuān)門(mén)用于把字符串轉(zhuǎn)化成整數(shù)
parseFloat():專(zhuān)門(mén)用于把字符串轉(zhuǎn)化成浮點(diǎn)數(shù)
5.5 String
多個(gè)字符的有序序列,雙引號(hào)和單引號(hào)引起來(lái)的都是字符串
轉(zhuǎn)化成字符串
toString()皆愉,String()
兩者區(qū)別:
1嗜价、除了null和undefined值,任何值都有toString()
2幕庐、toSring()接受一個(gè)參數(shù)久锥,表示進(jìn)制
3、String()能夠?qū)⑷魏晤?lèi)型的值都轉(zhuǎn)換成字符串toString()規(guī)則:值如果有toString翔脱,則調(diào)用該方法,如果值是null媒鼓,則返回“null”届吁,如果值是undefined,返回‘undefined’
六绿鸣、檢測(cè)數(shù)值類(lèi)型
typeof()
typeof()是用來(lái)檢測(cè)給定變量的數(shù)據(jù)類(lèi)型疚沐,對(duì)一種值使用typeof操作符可能返回下列某個(gè)字符串
‘undefined’:這個(gè)值未定義
‘boolean’:這個(gè)值是布爾類(lèi)型
‘string’:這個(gè)值是字符串
‘number’:這個(gè)值是數(shù)值
‘object’:這個(gè)值是對(duì)象或者null
‘function’:這個(gè)值是函數(shù)
typeof操作符用來(lái)區(qū)分函數(shù)和其他對(duì)象是有必要的
instanceof運(yùn)算符
Object.prototype.toString方法
七、語(yǔ)句
7.1 條件語(yǔ)句
if語(yǔ)句
// if結(jié)構(gòu)先判斷一個(gè)表達(dá)式的布爾值潮模,然后根據(jù)布爾值的真?zhèn)瘟粱祝瑘?zhí)行不同的語(yǔ)句
if (布爾值){
語(yǔ)句;
}
// 或者
if (布爾值) 語(yǔ)句;
if else語(yǔ)句
if (布爾值) {
// 滿足條件時(shí),執(zhí)行的語(yǔ)句
} else {
// 不滿足條件時(shí)擎厢,執(zhí)行的語(yǔ)句
}
if ...else 語(yǔ)句
if (m === 0) {
// ...
} else if (m === 1) {
// ...
} else if (m === 2) {
// ...
} else {
// ...
}
switch語(yǔ)句
// 選擇執(zhí)行相應(yīng)的case究流。如果所有case都不符合辣吃,則執(zhí)行最后的default部分
// switch語(yǔ)句內(nèi)部采用的是“嚴(yán)格相等運(yùn)算符”
switch (x) {
case 1:
console.log('x 等于1');
break;
case 2:
console.log('x 等于2');
break;
default:
console.log('x 等于其他值');
}
三元運(yùn)算符 ?:
// 如果“條件”為true,則返回“表達(dá)式1”的值芬探,否則返回“表達(dá)式2”的值神得。
(條件) ? 表達(dá)式1 : 表達(dá)式2
't' ? 'hello' : 'world' // "hello"
0 ? 'hello' : 'world' // "world"
7.2 循環(huán)語(yǔ)句
while循環(huán)
// While語(yǔ)句包括一個(gè)循環(huán)條件和一段代碼塊,只要條件為真偷仿,就不斷循環(huán)執(zhí)行代碼塊哩簿。
while (條件) {
語(yǔ)句;
}
// 或者
while (條件) 語(yǔ)句;
for 循環(huán)
// 初始化表達(dá)式(initialize):確定循環(huán)變量的初始值,只在循環(huán)開(kāi)始時(shí)執(zhí)行一次酝静。
// 條件表達(dá)式(test):每輪循環(huán)開(kāi)始時(shí)节榜,都要執(zhí)行這個(gè)條件表達(dá)式,只有值為真别智,才繼續(xù)進(jìn)行循環(huán)宗苍。
// 遞增表達(dá)式(increment):每輪循環(huán)的最后一個(gè)操作,通常用來(lái)遞增循環(huán)變量亿遂。
for (初始化表達(dá)式; 條件; 遞增表達(dá)式) {
語(yǔ)句
}
for語(yǔ)句的三個(gè)部分(initialize浓若、test、increment)蛇数,可以省略任何一個(gè)挪钓,也可以全部省略。
for ( ; ; ){
console.log('Hello World');
}
上面代碼省略了for語(yǔ)句表達(dá)式的三個(gè)部分耳舅,結(jié)果就導(dǎo)致了一個(gè)無(wú)限循環(huán)碌上。
do while語(yǔ)句:至少執(zhí)行一次
// do...while循環(huán)與while循環(huán)類(lèi)似,唯一的區(qū)別就是先運(yùn)行一次循環(huán)體浦徊,然后判斷循環(huán)條件馏予。
// 不管條件是否為真,do...while循環(huán)至少運(yùn)行一次盔性,這是這種結(jié)構(gòu)最大的特點(diǎn)霞丧。另外,while語(yǔ)句后面的分號(hào)注意不要省略冕香。
do
語(yǔ)句
while (條件);
// 或者
do {
語(yǔ)句
} while (條件);
break 語(yǔ)句和 continue 語(yǔ)句
break語(yǔ)句用于跳出代碼塊或循環(huán)蛹尝。
continue語(yǔ)句用于立即終止本輪循環(huán),返回循環(huán)結(jié)構(gòu)的頭部悉尾,開(kāi)始下一輪循環(huán)
for (var i = 0; i < 5; i++) {
console.log(i);
if (i === 3)
break;
}
// 0
// 1
// 2
// 3
// 上面代碼執(zhí)行到i等于3突那,就會(huì)跳出循環(huán)
var i = 0;
while (i < 100){
i++;
if (i % 2 === 0) continue;
console.log('i 當(dāng)前為:' + i);
}
// 上面代碼只有在i為奇數(shù)時(shí),才會(huì)輸出i的值构眯。如果i為偶數(shù)愕难,則直接進(jìn)入下一輪循環(huán)
標(biāo)簽(label)
JavaScript 語(yǔ)言允許,語(yǔ)句的前面有標(biāo)簽(label),相當(dāng)于定位符猫缭,用于跳轉(zhuǎn)到程序的任意位置.
標(biāo)簽可以是任意的標(biāo)識(shí)符葱弟,但不能是保留字,語(yǔ)句部分可以是任意語(yǔ)句饵骨。
標(biāo)簽通常與break語(yǔ)句和continue語(yǔ)句配合使用翘悉,跳出特定的循環(huán)。
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// break命令后面加上了top標(biāo)簽(注意居触,top不用加引號(hào))妖混,滿足條件時(shí),直接跳出雙層循環(huán)轮洋。如果break語(yǔ)句后面不使用標(biāo)簽制市,則只能跳出內(nèi)層循環(huán),進(jìn)入下一次的外層循環(huán)弊予。
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) continue top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2
// continue命令后面有一個(gè)標(biāo)簽名祥楣,滿足條件時(shí),會(huì)跳過(guò)當(dāng)前循環(huán)汉柒,直接進(jìn)入下一輪外層循環(huán)误褪。如果continue語(yǔ)句后面不使用標(biāo)簽,則只能進(jìn)入下一輪的內(nèi)層循環(huán)碾褂。
八兽间、操作符
++
: 自增
++
// 運(yùn)算子首先轉(zhuǎn)為數(shù)值,然后加上1或者減去1正塌。它們會(huì)修改原始變量
// 自增和自減運(yùn)算符是僅有的兩個(gè)具有副作用的運(yùn)算符嘀略,其他運(yùn)算符都不會(huì)改變變量的值
var x = 1;
++x // 2
x // 2
--
: 自減
var x = 2;
--x // 1
x // 1
// 自增和自減運(yùn)算符有一個(gè)需要注意的地方,
// 就是放在變量之后乓诽,會(huì)先返回變量操作前的值帜羊,再進(jìn)行自增/自減操作;
// 放在變量之前鸠天,會(huì)先進(jìn)行自增/自減操作讼育,再返回變量操作后的值
var x = 1;
var y = 1;
// x是先返回當(dāng)前值,然后自增稠集,所以得到1
x++ // 1
++y // 2
// y是先自增奶段,然后返回新的值,所以得到2
+
:加號(hào)操作符
// 1. 用來(lái)求兩個(gè)數(shù)值的和
// 2. 兩個(gè)字符串相加巍杈,這時(shí)加法運(yùn)算符會(huì)變成連接運(yùn)算符忧饭,返回一個(gè)新的字符串扛伍,將兩個(gè)原字符串連接在一起
// 3. 一個(gè)運(yùn)算子是字符串筷畦,另一個(gè)運(yùn)算子是非字符串,這時(shí)非字符串會(huì)轉(zhuǎn)成字符串,再連接在一起
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
// 4. 重載:加法運(yùn)算符是在運(yùn)行時(shí)決定鳖宾,到底是執(zhí)行相加吼砂,還是執(zhí)行連接。也就是說(shuō)鼎文,運(yùn)算子的不同渔肩,導(dǎo)致了不同的語(yǔ)法行為,這種現(xiàn)象稱(chēng)為“重載”(overload)
// 5. 對(duì)象的相加
// 如果運(yùn)算子是對(duì)象拇惋,必須先轉(zhuǎn)成原始類(lèi)型的值周偎,然后再相加
// 對(duì)象轉(zhuǎn)成原始類(lèi)型的值,首先,自動(dòng)調(diào)用對(duì)象的valueOf方法,一般來(lái)說(shuō)撑帖,
// 對(duì)象的valueOf方法總是返回對(duì)象自身蓉坎,這時(shí)再自動(dòng)調(diào)用對(duì)象的toString方法,將其轉(zhuǎn)為字符串胡嘿,知道了這個(gè)就可以自己定義valueOf方法或toString方法蛉艾,得到想要的結(jié)果
var obj = { p: 1 };
obj.valueOf().toString() // "[object Object]"
var obj = {
valueOf: function () {
return 1;
}
};
obj + 2 // 3
// 如果運(yùn)算子是一個(gè)Date對(duì)象的實(shí)例,那么會(huì)優(yōu)先執(zhí)行toString方法
var obj = new Date();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };
obj + 2 // "hello2"
-
:主要用來(lái)表示負(fù)數(shù)
// 具有將一個(gè)值轉(zhuǎn)為數(shù)值的功能衷敌,只不過(guò)得到的值正負(fù)相反
var x = 1;
-x // -1
-(-x) // 1
**
: 指數(shù)運(yùn)算符
// 指數(shù)運(yùn)算符(**)完成指數(shù)運(yùn)算勿侯,前一個(gè)運(yùn)算子是底數(shù),后一個(gè)運(yùn)算子是指數(shù)缴罗。
2 ** 4 // 16
// 指數(shù)運(yùn)算符是右結(jié)合助琐,而不是左結(jié)合。即多個(gè)指數(shù)運(yùn)算符連用時(shí)瞒爬,先進(jìn)行最右邊的計(jì)算
2 ** 3 ** 2
// 512
乘性操作符
乘法:*
除法: /
求模:%
// 余數(shù)運(yùn)算符(%)返回前一個(gè)運(yùn)算子被后一個(gè)運(yùn)算子除弓柱,所得的余數(shù)
// 運(yùn)算結(jié)果的正負(fù)號(hào)由第一個(gè)運(yùn)算子的正負(fù)號(hào)決定。
// 為了得到負(fù)數(shù)的正確余數(shù)值侧但,可以先使用絕對(duì)值函數(shù)
-1 % 2 // -1
1 % -2 // 1
// 錯(cuò)誤的寫(xiě)法
function isOdd(n) {
return n % 2 === 1;
}
isOdd(-5) // false
isOdd(-4) // false
// 正確的寫(xiě)法
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false
===
: 全等
// 如果兩個(gè)值的類(lèi)型不同矢空,直接返回false
1 === "1" // false
// 同一類(lèi)型的原始類(lèi)型的值(數(shù)值、字符串禀横、布爾值)比較時(shí)屁药,值相同就返回true,值不同就返回false
1 === 0x1 // true
//NaN與任何值都不相等(包括自身)柏锄。另外酿箭,正0等于負(fù)0
NaN === NaN // false
+0 === -0 // true
// 復(fù)合類(lèi)型值: 兩個(gè)復(fù)合類(lèi)型(對(duì)象、數(shù)組趾娃、函數(shù))的數(shù)據(jù)比較時(shí)缭嫡,不是比較它們的值是否相等,而是比較它們是否指向同一個(gè)地址
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
// 如果兩個(gè)變量引用同一個(gè)對(duì)象抬闷,則它們相等妇蛀。
var v1 = {};
var v2 = v1;
v1 === v2 // true
//對(duì)于兩個(gè)對(duì)象的比較耕突,嚴(yán)格相等運(yùn)算符比較的是地址,而大于或小于運(yùn)算符比較的是值评架。
//undefined和null與自身嚴(yán)格相等
undefined === undefined // true
null === null // true
var v1;
var v2;
v1 === v2 // true
!==
:不全等
// 先求嚴(yán)格相等運(yùn)算符的結(jié)果眷茁,然后返回相反值
1 !== '1' // true
// 等同于
!(1 === '1')
==
:相等
// 1、原始類(lèi)型的值會(huì)轉(zhuǎn)換成數(shù)值再進(jìn)行比較
'1' == true // true
// 等同于 Number('1') === Number(true)
// 等同于 1 ===
'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1
// 2纵诞、對(duì)象(這里指廣義的對(duì)象上祈,包括數(shù)組和函數(shù))與原始類(lèi)型的值比較時(shí),對(duì)象轉(zhuǎn)換成原始類(lèi)型的值浙芙,再進(jìn)行比較登刺。
// 對(duì)象與數(shù)值比較時(shí),對(duì)象轉(zhuǎn)為數(shù)值
[1] == 1 // true
// 等同于 Number([1]) == 1
// 對(duì)象與字符串比較時(shí)嗡呼,對(duì)象轉(zhuǎn)為字符串
[1] == '1' // true
// 等同于 String([1]) == '1'
[1, 2] == '1,2' // true
// 等同于 String([1, 2]) == '1,2'
// 對(duì)象與布爾值比較時(shí)塘砸,兩邊都轉(zhuǎn)為數(shù)值
[1] == true // true
// 等同于 Number([1]) == Number(true)
[2] == true // false
// 等同于 Number([2]) == Number(true)
// 3、undefined和null與其他類(lèi)型的值比較時(shí)晤锥,結(jié)果都為false掉蔬,它們互相比較時(shí)結(jié)果為true
false == null // false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
// 4、相等運(yùn)算符的缺點(diǎn)
// 相等運(yùn)算符隱藏的類(lèi)型轉(zhuǎn)換矾瘾,會(huì)帶來(lái)一些違反直覺(jué)的結(jié)果
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
!=
: 不等運(yùn)算符
// 它的算法就是先求相等運(yùn)算符的結(jié)果女轿,然后返回相反值
1 != '1' // false
// 等同于
!(1 == '1')
>
: 大于
//1、是否都是字符串壕翩,如果是的蛉迹,就按照字典順序比較(實(shí)際上是比較 Unicode 碼點(diǎn))
'cat' > 'catalog' // false
//2、如果不是字符串放妈,就會(huì)將兩個(gè)運(yùn)算子都轉(zhuǎn)成數(shù)值北救,再比較數(shù)值的大小
5 > '4' // true
// 等同于 5 > Number('4')
// 即 5 > 4
true > false // true
// 等同于 Number(true) > Number(false)
// 即 1 > 0
2 > true // true
// 等同于 2 > Number(true)
// 即 2 > 1
// 3、這里需要注意與NaN的比較芜抒。任何值(包括NaN本身)與NaN比較珍策,返回的都是false。
1 > NaN // false
1 <= NaN // false
'1' > NaN // false
'1' <= NaN // false
NaN > NaN // false
NaN <= NaN // false
// 4宅倒、如果運(yùn)算子是對(duì)象攘宙,會(huì)轉(zhuǎn)為原始類(lèi)型的值,再進(jìn)行比較拐迁。
[2] > [1] // true
// 等同于 [2].valueOf().toString() > [1].valueOf().toString()
// 即 '2' > '1'
[2] > [11] // true
// 等同于 [2].valueOf().toString() > [11].valueOf().toString()
// 即 '2' > '11'
{ x: 2 } >= { x: 1 } // true
// 等同于 { x: 2 }.valueOf().toString() >= { x: 1 }.valueOf().toString()
// 即 '[object Object]' >= '[object Object]'
小于:<
大于等于:>=
小于等于:<=
=
: 賦值操作符
// 將 1 賦值給變量 x
var x = 1;
// 將變量 y 的值賦值給變量 x
var x = y;
// 賦值運(yùn)算符還可以與其他運(yùn)算符結(jié)合蹭劈,形成變體
// 等同于 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
布爾操作符
!
:邏輯非
// 取反運(yùn)算符是一個(gè)感嘆號(hào),用于將布爾值變?yōu)橄喾粗迪哒伲磘rue變成false铺韧,false變成true
!true // false
!false // true
!undefined // true
!null // true
!0 // true
!NaN // true
!"" // true
!54 // false
!'hello' // false
![] // false
!{} // false
&&
:且運(yùn)算符
// 如果第一個(gè)運(yùn)算子的布爾值為true,則返回第二個(gè)運(yùn)算子的值(注意是值缓淹,不是布爾值)哈打;
// 如果第一個(gè)運(yùn)算子的布爾值為false工窍,則直接返回第一個(gè)運(yùn)算子的值,且不再對(duì)第二個(gè)運(yùn)算子求值前酿。
't' && 'f' // "f"
't' && (1 + 2) // 3
'' && 'f' // ""
'' && '' // ""
var x = 1;
(1 - 1) && ( x += 1) // 0
x // 1
// 且運(yùn)算符可以多個(gè)連用,這時(shí)返回第一個(gè)布爾值為false的表達(dá)式的值鹏溯。如果所有表達(dá)式的布爾值都為true罢维,則返回最后一個(gè)表達(dá)式的值
true && 'foo' && '' && 4 && 'foo' && true
// ''
1 && 2 && 3
// 3
||
: 或運(yùn)算符
// 如果第一個(gè)運(yùn)算子的布爾值為true,則返回第一個(gè)運(yùn)算子的值丙挽,且不再對(duì)第二個(gè)運(yùn)算子求值肺孵;
// 如果第一個(gè)運(yùn)算子的布爾值為false,則返回第二個(gè)運(yùn)算子的值
't' || '' // "t"
't' || 'f' // "t"
// 或運(yùn)算符可以多個(gè)連用颜阐,這時(shí)返回第一個(gè)布爾值為true的表達(dá)式的值平窘。如果所有表達(dá)式都為false,則返回最后一個(gè)表達(dá)式的值
false || 0 || '' || 4 || 'foo' || true
// 4
false || 0 || ''
// ''
function saveText(text) {
text = text || '';
// ...
}
// 或者寫(xiě)成
saveText(this.text || '')
本文參考:JavaScript 教程