JavaScript(一)基本語(yǔ)法搁痛、常見(jiàn)語(yǔ)句、操作符

一宇弛、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的組成.jpg

三亿鲜、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 教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凳怨,一起剝皮案震驚了整個(gè)濱河市瑰艘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肤舞,老刑警劉巖紫新,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異李剖,居然都是意外死亡芒率,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)篙顺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偶芍,“玉大人,你說(shuō)我怎么就攤上這事德玫》梭埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵宰僧,是天一觀的道長(zhǎng)萄窜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)撒桨,這世上最難降的妖魔是什么查刻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮凤类,結(jié)果婚禮上穗泵,老公的妹妹穿的比我還像新娘。我一直安慰自己谜疤,他們只是感情好佃延,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布现诀。 她就那樣靜靜地躺著,像睡著了一般履肃。 火紅的嫁衣襯著肌膚如雪仔沿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天尺棋,我揣著相機(jī)與錄音封锉,去河邊找鬼。 笑死膘螟,一個(gè)胖子當(dāng)著我的面吹牛成福,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆残,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼奴艾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了内斯?” 一聲冷哼從身側(cè)響起蕴潦,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俘闯,沒(méi)想到半個(gè)月后品擎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡备徐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年萄传,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜猾。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秀菱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹭睡,到底是詐尸還是另有隱情衍菱,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布肩豁,位于F島的核電站脊串,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏清钥。R本人自食惡果不足惜琼锋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟昭。 院中可真熱鬧缕坎,春花似錦、人聲如沸篡悟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荷腊,卻和暖如春艳悔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背女仰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工猜年, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人董栽。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像企孩,于是被迫代替她去往敵國(guó)和親锭碳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 本文是大神廖雪峰的JavaScript教程學(xué)習(xí)筆記勿璃。并不是教程擒抛,如有需要,請(qǐng)前往廖雪峰大神大博客. 一补疑、數(shù)據(jù)類(lèi)型和...
    0o凍僵的企鵝o0閱讀 444評(píng)論 0 4
  • 為方便閱讀歧沪,該內(nèi)容需具備一定的HTML+CSS基礎(chǔ)。 為什么學(xué)習(xí)JavaScript 一莲组、為什么JavaScrip...
    百草紀(jì)閱讀 300評(píng)論 0 1
  • JavaScript ( **JS **) 是一種輕量級(jí)解釋型的诊胞,或是JIT編譯型的程序設(shè)計(jì)語(yǔ)言,有著 函數(shù)優(yōu)先 ...
    garble閱讀 377評(píng)論 0 0
  • 《冒牌心理醫(yī)生》目錄<冒醫(yī)的所有文章都在這里 第4章 我有一所房子 幾乎可以確診了锹杈,第二種推斷撵孤,她得上了精神分裂,...
    原鹿閱讀 304評(píng)論 0 0
  • 一竭望、 什么叫時(shí)差邪码? 因?yàn)槭澜鐒澐譃?4個(gè)時(shí)區(qū)。你每飛行15個(gè)經(jīng)度咬清,時(shí)間就會(huì)變化一個(gè)小時(shí)闭专。 向東要加一小時(shí),向西則要...
    夏花de解憂雜貨鋪閱讀 2,583評(píng)論 12 21