第3章 基本概念

3.1 語法

3.1.1 區(qū)分大小寫

test和Test表示兩個(gè)不同的變量

3.1.2 標(biāo)識(shí)符

標(biāo)識(shí)符:指變量商膊,函數(shù),屬性的名字或者函數(shù)的參數(shù)
標(biāo)識(shí)符命名規(guī)則:
1.第一個(gè)字母必須是一個(gè)字母裂七,下劃線(_),或一個(gè)美元符號$
2.其他字符可以是字母鹃操,下劃線,美元符號或數(shù)字
3.不可以使用關(guān)鍵字作為標(biāo)識(shí)符
4春哨。推薦使用駝峰命名法荆隘,比如:changeColor

3.1.3 注釋

//單行注釋

/*
  *  多行注釋
  *
  */

3.1.4 嚴(yán)格模式

ECMAScript5 引入了嚴(yán)格模式概念

在頂部添加代碼:'user strict';

3.1.5 語句:

不能省略語句結(jié)尾分號原因:

  1. 如果省略,將會(huì)由解析器確定語句的結(jié)尾赴背,
  2. 加上分號椰拒,會(huì)避免很多錯(cuò)誤(例如不完整的輸入)
  3. 代碼結(jié)尾沒有分號,會(huì)導(dǎo)致壓縮錯(cuò)誤凰荚;
  4. 提高性能燃观,解析器不用在推測哪里插入分號耗費(fèi)時(shí)間
if (test)
   alert(test)   //有效,但容易出錯(cuò)便瑟,不推薦使用
if (test) {
   alert(test)   //推薦使用
}

3.2 關(guān)鍵字和保留字

關(guān)鍵字和保留字都不能作為標(biāo)識(shí)符或者屬性

3.3 變量

js中每個(gè)變量僅僅是一個(gè)用來保存值的占位符而已

3.4 數(shù)據(jù)類型

3.4.1 typeof操作符

typeof是一個(gè)操作符缆毁,而不是函數(shù)
用來檢測基本類型變量的數(shù)據(jù)類型

 typeof 15 ==> number

3.4.2 Undefined 類型

//聲明了未初始化的message,和未聲明的age到涂,都返回undefined
var message;

alert(message) ==> "undefined";
alert(age) ==> "undefined";

3.4.3 Null類型

typeof null ==> 'object'  ==> 從邏輯上講脊框,null表示一個(gè)空對象指針,所以會(huì)返回object

null 和 undefined 關(guān)系:

  1. undefined 派生自null ,所以 null == undefined ==> true;
  2. 無論什么情況下践啄,都沒有必要把一個(gè)變量的值顯式的設(shè)置為undefined;
  3. 如果定義的變量準(zhǔn)備在將來用于保存對象浇雹,那么最好將該變量初始化為null而不是其他值;

3.4.4 Boolean 類型

Boolean類型的字面值true和false是區(qū)分大小寫的,也就是說True和False都不是Boolean值屿讽,只是標(biāo)識(shí)符;

3.4.5 Number類型

八進(jìn)制字面量在嚴(yán)格模式下是無效的昭灵,會(huì)導(dǎo)致報(bào)錯(cuò)

  1. 浮點(diǎn)數(shù)值
    浮點(diǎn)數(shù):該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字
var floatNum = .1 //有效伐谈,但不推薦

浮點(diǎn)數(shù)存在的問題:

0.1 + 0.2 ==> 0.30000000000000004

解決方案: 使用toFixed() 來保留小數(shù)點(diǎn)后幾位

這是基于IEEE754數(shù)值的浮點(diǎn)計(jì)算通病烂完,其他語言也會(huì)出現(xiàn)這樣的問題

if (a + b == 0.3){      //這樣的判斷在浮點(diǎn)數(shù)下,會(huì)導(dǎo)致錯(cuò)誤
   alert('you got 0.3')
}
  1. 數(shù)值范圍:
    Infinity和-Infinity

  2. NaN
    非數(shù)值衩婚,是一個(gè)特殊的數(shù)值窜护,用來表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(防止錯(cuò)誤)

var aa = 'ww';
0/aa ==> NaN

js中,任何數(shù)值除以非數(shù)值會(huì)返回NaN非春,因此不會(huì)影響代碼執(zhí)行

NaN擁有兩個(gè)非同尋常的特點(diǎn):

  1. 任何涉及NaN的操作柱徙,都會(huì)返回NaN
  2. NaN與任何值都不相等,包括自己奇昙;

isNaN() 檢測是否是數(shù)值有問題:
isNaN('') ==> false

isNaN()把空字符串或空格當(dāng)作0處理

  1. 數(shù)值轉(zhuǎn)換
    有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值
    Number() ==> 用于任何數(shù)據(jù)類型
    由于Number在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理护侮,因此在處理整數(shù)上常用
parseInt()函數(shù);
parseInt()和parseFloat() ==> 用于把字符串轉(zhuǎn)為數(shù)值

parseInt原理:
parseInt()函數(shù)在轉(zhuǎn)換字符串時(shí),更多的是看其是否符合數(shù)值模式储耐。會(huì)忽略字符串前面的空格羊初,直至找到第一個(gè)非空字符。如果第一個(gè)字符不是
數(shù)字或者負(fù)號,parseInt()會(huì)返回NaN长赞。也就是說晦攒,parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN,如果第一個(gè)是數(shù)字字符得哆,parseInt()會(huì)繼續(xù)解析第二個(gè)字符脯颜,
直到解析完所有后續(xù)字符或者遇到一個(gè)非數(shù)字字符

例如:

parseInt('123blue') ==> 123
parseInt('') ==> NaN
parseInt(22.5) ==> 22

parseInt接收第二個(gè)參數(shù),表示轉(zhuǎn)換時(shí)使用的基數(shù)
parseInt(12,10)  ==> 表示用十進(jìn)制來解析

不指定基數(shù)意味著讓parseInt()自己決定如何解析輸入的字符串贩据,為了避免錯(cuò)誤的解析栋操,建議無論什么情況下都明確指定基數(shù);

parseFloat()和parseInt()區(qū)別:

  1. 都是字符串中第一個(gè)小數(shù)點(diǎn)有效饱亮,第二個(gè)無效
parseInt('22.34.45') ==》 22
parseFloat('22.34.45')  ==> 22.34

2.parseFloat() 始終會(huì)忽略前導(dǎo)的0矾芙,且parseFloat()只解析十進(jìn)制的值

parseFloat('1234blue') ==》 1234
parseFloat('oxA') ==》 0
parseFloat('22.5') ==> 22.5
parseFloat('22.34.5') ==> 22.34
parseFloat('0908.5') ==> 908.5

3.4.6 String類型

1.轉(zhuǎn)義字符:

\n 換行 ==》 'he said, \n'
\' 單引號 ==》 'he said,\'hey.\''
\" 雙引號 ==》 'he said,\"hey.\''

2.轉(zhuǎn)換為字符串

toString() ==> var num = 123; num.toString() ==> '123'

toString()問題:null和undefined沒有這個(gè)方法,調(diào)用時(shí)會(huì)報(bào)錯(cuò)

如果不確定需要轉(zhuǎn)換的字符串是不是null和undefined近上,則建議使用String()
String()詳解:

  1. 如果值有toString(),則調(diào)用剔宪;
  2. 如果值為null,則返回null戈锻;
  3. 如果值為undefined歼跟,則返回undefined;

3.4.7 Object 類型

Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中

3.5 操作符

3.5.1 一元操作符

只能操作一個(gè)值的操作符叫一元操作符

  1. 遞增和遞減操作符

前置型:變量的值在語句被求值以前改變

++age  ==  age = age + 1;
--age  ==  age = age - 1;

后置型:遞增遞減操作是在語句被求值之后才執(zhí)行

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2 ==> 22;
var num4 = num1 + num2 ==> 21
  1. 一元加和減操作符

一元加操作符

+'01' ==> 1
+'1.1' ==> 1.1
+'z' ==> NaN
+false ==> 0

一元減操作符

-‘01’ ==》 -1
-‘1.1’ ==》 -1.1
-‘z’ ==> NaN
-false ==> -0

3.5.2 布爾操作符

  1. 邏輯非
!{} ==> false
!{name:'wang'} ==> false
  1. 邏輯與
    &&
    邏輯與操作符屬于短路操作格遭,如果第一個(gè)操作數(shù)能決定結(jié)果哈街,那么就不會(huì)再對第二個(gè)操作數(shù)求值

  2. 邏輯或
    ||
    邏輯或也是短路操作;

3.5.3 乘性操作符

  1. 乘法
var result = 44 * 45;
  1. 除法
var result = 66 / 11;

3.求模(求余數(shù))

var result = 26 % 5;

3.5.4 加法操作符

  1. 加法
var result = 66 + 1;
  1. 減法
var result = 66 - 1;

3.5.5 關(guān)系操作符

< >  <= >=

3.5.6 相等操作符

  1. 相等和不相等
==  !=
null == undefined ==> true
NaN == NaN ==》 true
true == 1 ==> true
true == 2 ==> false
  1. 全等和不全等
    === !==

3.5.7 條件操作符

var flag = this.value ? true : false;

3.5.8 賦值操作符

var num = 10;
num = num + 10;

可轉(zhuǎn)換為:

var num = 10;
num += 10;

類似的還有:

num *= 10  ==  num = num * 10;
num /= 10  ==  num = num / 10;
num %= 10  ==  num = num % 10;
num -= 10  ==  num = num - 10;

3.5.9 逗號操作符

var num,age,name;

3.6 語句

3.6.1 if語句

if( condition ){  // ECMAScript會(huì)自動(dòng)調(diào)用Boolean()轉(zhuǎn)換函數(shù)將這個(gè)表達(dá)式結(jié)果轉(zhuǎn)換為一個(gè)布爾值
   //
}

3.6.2 do-while 語句

后測試循環(huán)語句拒迅,只有在循環(huán)體中代碼執(zhí)行之后骚秦,才會(huì)測試出口條件

var i = 0;
do {
   i += 2
} while ( i < 10 );

3.6.3 while 語句

前測試循環(huán)語句,在循環(huán)體內(nèi)代碼被執(zhí)行之前璧微,就會(huì)對出口條件求值作箍;

var i = 0;
while( i < 10 ){
    i += 2;
}

3.6.4 for語句

前測試循環(huán)語句

for(;;){   //無限循環(huán),會(huì)導(dǎo)致瀏覽器崩潰前硫,可以試試胞得;
   console.log(11)
}

3.6.5 for in 語句

用來枚舉對象的屬性
如果要迭代的對象是null, undefined,則會(huì)終止循環(huán)
所以在使用for in之前屹电,要確保該對象不是null或undefined

3.6.6 break 和 continue 語句

break: 立即退出循環(huán)阶剑,強(qiáng)制繼續(xù)執(zhí)行循環(huán)后的語句;
continue: 立即退出循環(huán)危号,從循環(huán)的頂部繼續(xù)執(zhí)行牧愁;

3.6.7 with語句

with語句作用主要是將代碼的作用域設(shè)置到一個(gè)特定的對象中,定義with語句主要是為了簡化多次編寫同一個(gè)對象的工作外莲;

var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;

使用with語句改寫:

with(location){
    var qs = search.substring(1);
    var hostName = hostname;
    var url = href;
}

缺點(diǎn):嚴(yán)格模式下不允許使用with語句猪半,否則將會(huì)視為語法錯(cuò)誤

一般情況下,作用域鏈只會(huì)被with和catch語句影響。當(dāng)使創(chuàng)建用with的時(shí)候磨确,函數(shù)會(huì)創(chuàng)建一個(gè)新的活動(dòng)對象沽甥,推到最前端,該對象就是with的對象俐填。這就意味著所有的局部變量都處于第二個(gè)作用域鏈對象中去了安接,這也就是為什么要避免使用with的原因。
由于大量使用with語句會(huì)導(dǎo)致性能下降英融,同時(shí)也會(huì)造成調(diào)試代碼困難,因此不建議使用with

3.6.8 switch語句

省略break關(guān)鍵字,會(huì)導(dǎo)致執(zhí)行完當(dāng)前case后歇式,繼續(xù)執(zhí)行下一個(gè)case

3.7 函數(shù)

3.7.1 理解參數(shù)

ECMAScript不介意傳遞進(jìn)來多少個(gè)參數(shù)驶悟,也不在乎傳進(jìn)來參數(shù)是什么數(shù)據(jù)類型。
在函數(shù)體內(nèi)材失,可以通過arguments對象來訪問這個(gè)參數(shù)數(shù)組痕鳍,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)

獲取函數(shù)的參數(shù)數(shù)量:arguments.length;

function nums(num1,num2) {
    console.log(arguments)
}
nums(1,2,3)

可以看到打印結(jié)果:

image.png

3.7.2 沒有重載

其他語言(Java)中龙巨,可以為一個(gè)函數(shù)編寫兩個(gè)定義笼呆,只要這兩個(gè)定義的簽名(接受的參數(shù)的類型和數(shù)量)不同即可,ECMAScript函數(shù)沒有簽名旨别,
因?yàn)槠鋮?shù)是由包含零或多個(gè)值的數(shù)組來表示的诗赌,而沒有函數(shù)簽名,真正的重載是不可能做到的秸弛;

如果在ECMAScript中定義了兩個(gè)名字相同的函數(shù)铭若,則該名字只屬于后定義的函數(shù);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末递览,一起剝皮案震驚了整個(gè)濱河市叼屠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绞铃,老刑警劉巖镜雨,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儿捧,居然都是意外死亡荚坞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門纯命,熙熙樓的掌柜王于貴愁眉苦臉地迎上來西剥,“玉大人,你說我怎么就攤上這事亿汞〔t空!?“怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咆畏。 經(jīng)常有香客問我南捂,道長,這世上最難降的妖魔是什么旧找? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任溺健,我火速辦了婚禮,結(jié)果婚禮上钮蛛,老公的妹妹穿的比我還像新娘鞭缭。我一直安慰自己,他們只是感情好魏颓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布岭辣。 她就那樣靜靜地躺著,像睡著了一般甸饱。 火紅的嫁衣襯著肌膚如雪沦童。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天叹话,我揣著相機(jī)與錄音偷遗,去河邊找鬼。 笑死驼壶,一個(gè)胖子當(dāng)著我的面吹牛氏豌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辅柴,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼箩溃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碌嘀?” 一聲冷哼從身側(cè)響起涣旨,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎股冗,沒想到半個(gè)月后霹陡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡止状,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年烹棉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怯疤。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浆洗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出集峦,到底是詐尸還是另有隱情伏社,我是刑警寧澤抠刺,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站摘昌,受9級特大地震影響速妖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聪黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一罕容、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稿饰,春花似錦锦秒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梧喷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脖咐,已是汗流浹背铺敌。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屁擅,地道東北人偿凭。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像派歌,于是被迫代替她去往敵國和親弯囊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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

  • 本章內(nèi)容 語法 數(shù)據(jù)類型 流控制語句 理解函數(shù) 3.1 語法 3.1.1 區(qū)分大小寫 區(qū)分大小寫 3.1.2 標(biāo)識(shí)...
    悶油瓶小張閱讀 719評論 0 0
  • 什么是 JavaScript 語言胶果? JavaScript 是一種輕量級的腳本語言匾嘱。所謂“腳本語言”(script...
    oWSQo閱讀 1,790評論 0 1
  • 夜晚又一次失戀了 月亮難過地扭過臉去 星星開始低聲嗚咽 柳葉含著淚悲鳴 花兒垂頭喪氣 螢火蟲也早早睡了 湖水有一聲...
    上官飛鴻閱讀 247評論 0 13
  • 熊貓雙魚圖~ 紙本水墨~
    小微繪話閱讀 388評論 11 2
  • 時(shí)間是這個(gè)世界上最公正無私的東西之一,你怎么打發(fā)時(shí)間早抠,時(shí)間就這么打發(fā)你霎烙,且沒有商量的余地。 一個(gè)人十年八年后的光景...
    大張冰閱讀 135評論 0 4