04ES5--基礎(chǔ)語法(一)

基礎(chǔ)語法

  • 基本概念:變量、標(biāo)識符、注釋、區(qū)塊
  • 條件語句:if-else、switch、三元運(yùn)算符
  • 循環(huán)語句:while、for、do-while、break和continue、標(biāo)簽(label)

這些語法都是完全相同的,沒有必要像個(gè)初學(xué)者一個(gè)個(gè)去了解了。只需要掌握一些JS中不一樣的地方即可。

1、變量提升(hoisting)

JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運(yùn)行。這造成的結(jié)果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)

console.log(a);
var a = 1;

等價(jià)于

var a;
console.log(a);
a = 1;

2、區(qū)塊(block)

區(qū)塊的表達(dá)方式:JavaScript 使用大括號,將多個(gè)相關(guān)的語句組合在一起,稱為“區(qū)塊”(block)。

對于var命令來說,JavaScript 的區(qū)塊不構(gòu)成單獨(dú)的作用域(scope)
ES5中的區(qū)塊:

{
  var a = 1;
}

a // 1

而在js中,對象的表達(dá)方式,也是這樣,不像oc中的對象都會以@開頭,例如下面的寫法,所以這里是需要轉(zhuǎn)變過來的概念。

@{
  @"key" : @"value";
}

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

JavaScript 的數(shù)據(jù)類型

1、七種數(shù)據(jù)類型

  • 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
  • 字符串(string):文本(比如Hello World)。
  • 布爾值(boolean):表示真?zhèn)蔚膬蓚€(gè)特殊值,即true(真)和false(假)
  • undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時(shí)沒有任何值
  • null:表示空值,即此處的值為空。
  • 對象(object):各種值組成的集合。
  • Symbol 類型:ES6 新增,后面補(bǔ)充

2、原始類型(primitive type)

它們是最基本的數(shù)據(jù)類型,不能再細(xì)分

  • 數(shù)值
  • 字符串
  • 布爾值

3、合成類型(complex type)

一個(gè)對象往往是多個(gè)原始類型的值的合成,可以看作是一個(gè)存放各種值的容器

  • 狹義的對象(object)
  • 數(shù)組(array)
  • 函數(shù)(function)

typeof 運(yùn)算符

  • typeof 運(yùn)算符:返回一個(gè)值的數(shù)據(jù)類型
  • instanceof 運(yùn)算符
  • Object.prototype.toString 方法

typeof的返回值

  • 數(shù)值、字符串、布爾值分別返回number、string、boolean
  • 函數(shù)返回function
  • undefined返回undefined
  • 對象返回object,空數(shù)組([])的類型也是object,null返回object

null 和 undefined

  • 在if語句中,它們都會被自動(dòng)轉(zhuǎn)為false,
  • null和undefined使用相等運(yùn)算符(==)甚至直接報(bào)告兩者相等
  • null是一個(gè)表示“空”的對象,轉(zhuǎn)為數(shù)值時(shí)為0
  • undefined是一個(gè)表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN

布爾值

相等運(yùn)算符多了 ===!== 的比較,其他的都大同小異

  • 兩元邏輯運(yùn)算符: && (And),|| (Or)
  • 前置邏輯運(yùn)算符: ! (Not)
  • 相等運(yùn)算符:===,!==,==,!=
  • 比較運(yùn)算符:>,>=,<,<=

轉(zhuǎn)換規(guī)則是除了下面六個(gè)值被轉(zhuǎn)為false,其他值都視為true

  • undefined
  • null
  • false
  • 0
  • NaN
  • ""或''(空字符串)

【注意】空數(shù)組([])和空對象({})對應(yīng)的布爾值,都是true。

數(shù)值

整數(shù)和浮點(diǎn)數(shù)

  • JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存,即使整數(shù)也是如此。所以,1與1.0是相同的,是同一個(gè)數(shù)

  • 數(shù)值精度(浮點(diǎn)數(shù)的64個(gè)二進(jìn)制位)

    • 第1位:符號位,0表示正數(shù),1表示負(fù)數(shù)
    • 第2位到第12位(共11位):指數(shù)部分
    • 第13位到第64位(共52位):小數(shù)部分(即有效數(shù)字)
    • 精度最多只能到53個(gè)二進(jìn)制位,這意味著,絕對值小于等于2的53次方的整數(shù),即-2^532^53
    • “正向溢出”,即 JavaScript 無法表示這么大的數(shù),這時(shí)就會返回Infinity
    • “負(fù)向溢出”,即 JavaScript 無法表示這么小的數(shù),這時(shí)會直接返回0
  • 數(shù)值的表示法

    • 十進(jìn)制:沒有前導(dǎo)0的數(shù)值。
    • 八進(jìn)制:有前綴0o0O的數(shù)值,或者有前導(dǎo)0、且只用到0-7的八個(gè)阿拉伯?dāng)?shù)字的數(shù)值。
    • 十六進(jìn)制:有前綴0x0X的數(shù)值。
    • 二進(jìn)制:有前綴0b0B的數(shù)值。

特殊數(shù)值

  1. 正零和負(fù)零:JavaScript 內(nèi)部實(shí)際上存在2個(gè)0:一個(gè)是+0,一個(gè)是-0,區(qū)別就是64位浮點(diǎn)數(shù)表示法的符號位不同。它們是等價(jià)的。

  2. NaN:表示“非數(shù)字”(Not a Number),主要出現(xiàn)在將字符串解析成數(shù)字出錯(cuò)的場合。

    • 0除以0也會得到NaN。
    • 使用typeof可以看到起數(shù)據(jù)類型依然是Number
    • NaN不等于任何值,包括它本身。
    • NaN與任何數(shù)(包括它自己)的運(yùn)算,得到的都是NaN
  3. Infinity:表示“無窮”

    • 第一個(gè)場景是一個(gè)表達(dá)式的計(jì)算結(jié)果太大,超出了能夠表示的范圍,因此返回Infinity
    • 第二個(gè)場景是0除以0會得到NaN,而非0數(shù)值除以0,會返回Infinity
    • Infinity表示正的無窮
    • -Infinity表示負(fù)的無窮
    • Infinity還有很多特殊的運(yùn)算法則,有時(shí)間了可以看看

與數(shù)值相關(guān)的全局方法

1、parseInt()

  • parseInt方法用于將字符串轉(zhuǎn)為整數(shù)
  • 如果字符串頭部有空格,空格會被自動(dòng)去除
  • 如果parseInt的參數(shù)不是字符串,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換
  • 字符串轉(zhuǎn)為整數(shù)的時(shí)候,是一個(gè)個(gè)字符從左往右依次轉(zhuǎn)換,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進(jìn)行下去,返回已經(jīng)轉(zhuǎn)好的部分
  • 如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號除外),返回NaN
  • 如果字符串以0x或0X開頭,parseInt會將其按照十六進(jìn)制數(shù)解析。

進(jìn)制轉(zhuǎn)換:第二個(gè)參數(shù)(2到36之間),表示被解析的值的進(jìn)制

這個(gè)里有非常多的用法,但是我們在實(shí)際的使用中,知道以下幾個(gè)使用場景就可以了

parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

2、parseFloat()

  • parseFloat方法用于將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù)。
  • parseFloat方法會自動(dòng)過濾字符串前導(dǎo)的空格。
  • 如果參數(shù)不是字符串,或者字符串的第一個(gè)字符不能轉(zhuǎn)化為浮點(diǎn)數(shù),則返回NaN。

parseFloat 與 Number 之間的區(qū)別

parseFloat(true)  // NaN
Number(true) // 1

parseFloat(null) // NaN
Number(null) // 0

parseFloat('') // NaN
Number('') // 0

parseFloat('123.45#') // 123.45
Number('123.45#') // NaN

3、isNaN()

  • isNaN方法可以用來判斷一個(gè)值是否為NaN
  • isNaN只對數(shù)值有效,如果傳入其他值,會被先轉(zhuǎn)成數(shù)值。所以,對于字符串、對象和數(shù)組,isNaN都返回true
  • 但不是所有的字符串、對象和數(shù)組都返回true,如果他們能被正常解析成數(shù)字,那就返回false

使用isNaN之前,最好判斷一下數(shù)據(jù)類型

function myIsNaN(value) {
  return typeof value === 'number' && isNaN(value);
}

判斷NaN更可靠的方法是,利用NaN為唯一不等于自身的值的這個(gè)特點(diǎn),進(jìn)行判斷

function myIsNaN(value) {
  return value !== value;
}

4、isFinite()

isFinite方法返回一個(gè)布爾值,表示某個(gè)值是否為正常的數(shù)值

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

Infinity、-Infinity、NaN和undefined這幾個(gè)值會返回false,

isFinite對于其他的數(shù)值都會返回true

字符串

上面的數(shù)值這節(jié)寫了非常多的筆記,主要是因?yàn)樗@里提供了一些常用API,對他們的使用需要了解,所以進(jìn)行了一個(gè)記錄。這節(jié)主要是講字符串,這是非常非常重要的篇幅了,同樣的,也是只記錄不同的內(nèi)容,那些所有語言都相同的特性,就沒必要浪費(fèi)筆墨了。特別說明下字符集相關(guān)的內(nèi)容,如果遇到了再來查閱資料即可,這里不做過多研究。

使用特性

  • 單引號字符串的內(nèi)部,可以使用雙引號
  • 雙引號字符串的內(nèi)部,可以使用單引號
  • 如果要在單引號字符串的內(nèi)部使用單引號,或雙引號字符串內(nèi)部使用雙引號,都需要在引號錢加反斜杠,用來轉(zhuǎn)義
  • 字符串默認(rèn)只能寫在一行內(nèi),分成多行將會報(bào)錯(cuò)。如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。
  • 連接運(yùn)算符(+)可以連接多個(gè)單行字符串,將長字符串拆成多行書寫,輸出的時(shí)候也是單行

轉(zhuǎn)義

  • \0 :null(\u0000)
  • \b :后退鍵(\u0008)
  • \f :換頁符(\u000C)
  • \n :換行符(\u000A)
  • \r :回車鍵(\u000D)
  • \t :制表符(\u0009)
  • \v :垂直制表符(\u000B)
  • ' :單引號(\u0027)
  • " :雙引號(\u0022)
  • \ :反斜杠(\u005C)

字符串與數(shù)組

  1. 可以使用數(shù)組的方括號運(yùn)算符,用來返回某個(gè)位置的字符
  2. 如果方括號中的數(shù)字超過字符串的長度,或者方括號中根本不是數(shù)字,則返回undefined。
  3. length屬性返回字符串的長度,該屬性也是無法改變的

Base64 轉(zhuǎn)碼

  1. 使用 Base64 編碼處理一些不可打印的符號,比如 ASCII 碼0到31的符號
  2. 使用 Base64 編碼以文本格式傳遞二進(jìn)制數(shù)據(jù)

JavaScript 原生提供兩個(gè) Base64 相關(guān)的方法。(這兩個(gè)方法不適合非 ASCII 碼的字符,會報(bào)錯(cuò))

  • btoa():任意值轉(zhuǎn)為 Base64 編碼
  • atob():Base64 編碼轉(zhuǎn)為原來的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

將非 ASCII 碼字符轉(zhuǎn)為 Base64 編碼

  • 中間插入一個(gè)轉(zhuǎn)碼環(huán)節(jié)
  • 再使用這兩個(gè)方法
function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

這篇文章關(guān)于字符串的介紹其實(shí)不太夠的,還需要查閱其他文章來解鎖更多字符的用法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容