第3章 基本概念

3.1 語法

3.1.1 區分大小寫

test和Test表示兩個不同的變量

3.1.2 標識符

標識符:指變量,函數,屬性的名字或者函數的參數
標識符命名規則:
1.第一個字母必須是一個字母,下劃線(_),或一個美元符號$
2.其他字符可以是字母,下劃線,美元符號或數字
3.不可以使用關鍵字作為標識符
4。推薦使用駝峰命名法,比如:changeColor

3.1.3 注釋

//單行注釋

/*
  *  多行注釋
  *
  */

3.1.4 嚴格模式

ECMAScript5 引入了嚴格模式概念

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

3.1.5 語句:

不能省略語句結尾分號原因:

  1. 如果省略,將會由解析器確定語句的結尾,
  2. 加上分號,會避免很多錯誤(例如不完整的輸入)
  3. 代碼結尾沒有分號,會導致壓縮錯誤;
  4. 提高性能,解析器不用在推測哪里插入分號耗費時間
if (test)
   alert(test)   //有效,但容易出錯,不推薦使用
if (test) {
   alert(test)   //推薦使用
}

3.2 關鍵字和保留字

關鍵字和保留字都不能作為標識符或者屬性

3.3 變量

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

3.4 數據類型

3.4.1 typeof操作符

typeof是一個操作符,而不是函數
用來檢測基本類型變量的數據類型

 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表示一個空對象指針,所以會返回object

null 和 undefined 關系:

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

3.4.4 Boolean 類型

Boolean類型的字面值true和false是區分大小寫的,也就是說True和False都不是Boolean值,只是標識符;

3.4.5 Number類型

八進制字面量在嚴格模式下是無效的,會導致報錯

  1. 浮點數值
    浮點數:該數值中必須包含一個小數點,并且小數點后面必須至少有一位數字
var floatNum = .1 //有效,但不推薦

浮點數存在的問題:

0.1 + 0.2 ==> 0.30000000000000004

解決方案: 使用toFixed() 來保留小數點后幾位

這是基于IEEE754數值的浮點計算通病,其他語言也會出現這樣的問題

if (a + b == 0.3){      //這樣的判斷在浮點數下,會導致錯誤
   alert('you got 0.3')
}
  1. 數值范圍:
    Infinity和-Infinity

  2. NaN
    非數值,是一個特殊的數值,用來表示一個本來要返回數值的操作數未返回數值的情況(防止錯誤)

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

js中,任何數值除以非數值會返回NaN,因此不會影響代碼執行

NaN擁有兩個非同尋常的特點:

  1. 任何涉及NaN的操作,都會返回NaN
  2. NaN與任何值都不相等,包括自己;

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

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

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

parseInt原理:
parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式。會忽略字符串前面的空格,直至找到第一個非空字符。如果第一個字符不是
數字或者負號,parseInt()會返回NaN。也就是說,parseInt()轉換空字符串會返回NaN,如果第一個是數字字符,parseInt()會繼續解析第二個字符,
直到解析完所有后續字符或者遇到一個非數字字符

例如:

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

parseInt接收第二個參數,表示轉換時使用的基數
parseInt(12,10)  ==> 表示用十進制來解析

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

parseFloat()和parseInt()區別:

  1. 都是字符串中第一個小數點有效,第二個無效
parseInt('22.34.45') ==》 22
parseFloat('22.34.45')  ==> 22.34

2.parseFloat() 始終會忽略前導的0,且parseFloat()只解析十進制的值

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.轉義字符:

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

2.轉換為字符串

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

toString()問題:null和undefined沒有這個方法,調用時會報錯

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

  1. 如果值有toString(),則調用;
  2. 如果值為null,則返回null;
  3. 如果值為undefined,則返回undefined;

3.4.7 Object 類型

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

3.5 操作符

3.5.1 一元操作符

只能操作一個值的操作符叫一元操作符

  1. 遞增和遞減操作符

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

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

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

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. 邏輯與
    &&
    邏輯與操作符屬于短路操作,如果第一個操作數能決定結果,那么就不會再對第二個操作數求值

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

3.5.3 乘性操作符

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

3.求模(求余數)

var result = 26 % 5;

3.5.4 加法操作符

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

3.5.5 關系操作符

< >  <= >=

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;

可轉換為:

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會自動調用Boolean()轉換函數將這個表達式結果轉換為一個布爾值
   //
}

3.6.2 do-while 語句

后測試循環語句,只有在循環體中代碼執行之后,才會測試出口條件

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

3.6.3 while 語句

前測試循環語句,在循環體內代碼被執行之前,就會對出口條件求值;

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

3.6.4 for語句

前測試循環語句

for(;;){   //無限循環,會導致瀏覽器崩潰,可以試試;
   console.log(11)
}

3.6.5 for in 語句

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

3.6.6 break 和 continue 語句

break: 立即退出循環,強制繼續執行循環后的語句;
continue: 立即退出循環,從循環的頂部繼續執行;

3.6.7 with語句

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

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;
}

缺點:嚴格模式下不允許使用with語句,否則將會視為語法錯誤

一般情況下,作用域鏈只會被with和catch語句影響。當使創建用with的時候,函數會創建一個新的活動對象,推到最前端,該對象就是with的對象。這就意味著所有的局部變量都處于第二個作用域鏈對象中去了,這也就是為什么要避免使用with的原因。
由于大量使用with語句會導致性能下降,同時也會造成調試代碼困難,因此不建議使用with

3.6.8 switch語句

省略break關鍵字,會導致執行完當前case后,繼續執行下一個case

3.7 函數

3.7.1 理解參數

ECMAScript不介意傳遞進來多少個參數,也不在乎傳進來參數是什么數據類型。
在函數體內,可以通過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每一個參數

獲取函數的參數數量:arguments.length;

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

可以看到打印結果:

image.png

3.7.2 沒有重載

其他語言(Java)中,可以為一個函數編寫兩個定義,只要這兩個定義的簽名(接受的參數的類型和數量)不同即可,ECMAScript函數沒有簽名,
因為其參數是由包含零或多個值的數組來表示的,而沒有函數簽名,真正的重載是不可能做到的;

如果在ECMAScript中定義了兩個名字相同的函數,則該名字只屬于后定義的函數;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容

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