《javaScript高級程序設計》讀書筆記(一)

以下內(nèi)容可能存在個人理解的部分,并非完全參照原文

如有疑問,請以書中內(nèi)容為準

第一章 JavaScript簡介

這里需要注意的是JavaScript不等同于ECMAScript,JavaScript包含ECMAScript、DOM和BOM

另外DOM也不是JavaScript專有的,也有其他語言實現(xiàn)了DOM(QML好像就是類似DOM的實現(xiàn))

第二章 在HTML中使用JavaScript

把JavaScript插入到HTML中需要用到<script>元素

這里需要注意的要點有:

  1. 所有<script>元素會根據(jù)它們在html文件中的先后順序依次被解析。如果引用多個JavaScript文件時要注意它們之間的依賴關系
  2. <script>中使用defer屬性的腳本會被延遲到整個頁面都解析完畢再運行(即先下載后運行)
  3. 使用async屬性可以讓腳本使當前腳本不必等待其他腳本,也不必阻塞文檔呈現(xiàn),一旦腳本可用,就會異步執(zhí)行,但不能保證執(zhí)行順序
  4. 如果不適用defer和async可以將<script>元素放到頁面最后,即</body>標簽前面,這樣也可以使腳本在頁面加載后解析運行

在現(xiàn)實當中延遲腳本不一定會按順序執(zhí)行,所以最好只包含一個延遲腳本

可以使用<noscript>在不支持腳本的瀏覽器中使用代替的內(nèi)容,在啟用了腳本的情況下,瀏覽器不會顯示<noscript>中的內(nèi)容

第三章 基本概念

這一章內(nèi)容很多很雜

3.1 語法

ECMAScript的語法大量借鑒了C以及其他類C語言,而且ECMAScript比它們更加寬松。

ECMAScript中的一切都區(qū)分大小寫

3.2 關鍵字和保留字

debugger是ES5新增的關鍵字

ES6之后使用了let、class、import、const、super、extends,這些在ES5都是保留字

3.3 變量

ECMAScript中的變量可以保存任何類型的數(shù)據(jù)。

聲明但未初始化的變量會保存一個特殊的值——undefined

 var msg;
 console.log(msg); // undefined

注意,用var定義的變量將成為定義該變量作用域中的局部變量

如果在函數(shù)內(nèi)使用var定義一個變量,這個變量在函數(shù)退出后就會被銷毀

function test(){
    var msg = 'test';
}
test();
alert(msg); //error

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

ECMAScript中有5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number、String

還有一種復雜數(shù)據(jù)類型——Object

注意Object是復雜數(shù)據(jù)類型而不是簡單數(shù)據(jù)類型

ECMAScript不支持自定義類型,所有值都是上面6種類型之一

使用typeof操作符可以檢測變量的數(shù)據(jù)類型,并返回一個字符串:

  • "undefined"——如果這個值未定義
  • "boolean"——如果這個值是布爾值
  • "string"——如果這個值是字符串
  • "number"——如果這個值是數(shù)值
  • "object"——如果這個值是對象或null
  • "function"——如果這個值是函數(shù)

typeof是操作符而不是函數(shù),因此可以使用typeof(msg)也可以使用typeof msg

typeof null會返回"object",因為null會被認為是一個空的對象引用

正則表達式現(xiàn)在會返回"object"

從技術角度講,函數(shù)在ECMAScript中是對象不是數(shù)據(jù)類型,然而為了區(qū)分函數(shù)和其他對象,因此讓typeof操作符返回"function"

Undefined

Undefined類型只有一個值,就是undefined

不需要顯示地把一個變量初始化為undefined,雖然我感覺沒人這么傻

對于未聲明的變量和未初始化的變量,typeof都會返回"undefined"

顯示地初始化變量便可以使用typeof來判斷變量是否被聲明

Null

Null類型也只有一個值,這個值為null

undefined值派生自null,因此會出現(xiàn)比較奇怪的情況

alert(null == undefined); //true

用嚴格等可以將它們區(qū)分開

alert(null === undefined); //false

推薦將準備保存對象的變量初始化為null

Boolean

Boolean類型的字面值truefalse是區(qū)分大小寫的,True和False不是Boolean值

可以調(diào)用函數(shù)Boolean()將其他值轉(zhuǎn)換為Boolean類型,轉(zhuǎn)換規(guī)則:

數(shù)據(jù)類型 轉(zhuǎn)換為true 轉(zhuǎn)換為false
string 任何非空字符串 ""(空字符串)
Number 任何非零數(shù)值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined 不存在 undefined

Number

除了以十進制表示,整數(shù)還可以通過八進制或十六進制的字面值來表示

其中八進制第一位必須是0,如果字面值中的數(shù)值超過了范圍,該值將被當作十進制數(shù)值解析

var octalNum1 = 070; // 八進制的56
var octalNum2 = 079; // 無效 解析為79
var octalNum3 = 08;  // 無效 解析為8

十六進制前兩位必須為0x,字母A~F可以大寫也可以小寫

var hexNum1 = 0xA;  // 十六進制的10
var hexNum2 = 0x1f; // 十六進制的31

在進行計算時,所有八進制和十六進制的數(shù)值最終都會被轉(zhuǎn)換成十進制

八進制字面量在嚴格模式下會報錯
浮點數(shù)小數(shù)點前面可以沒有整數(shù),但不推薦

var floatNum = .1; //有效,但不推薦

由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)的兩倍,ECMAScript會盡量將浮點數(shù)轉(zhuǎn)換為整數(shù)

var floatNum1 = 1.;    // 小數(shù)點后沒有數(shù)字 解析為1
var floatNum2 = 10.0;  // 整數(shù) 解析為10

可以使用e表示法(科學計數(shù)法),e可以大寫也可以小寫

var floatNum = 1.125e7; // 等于11250000

浮點數(shù)的最高精度是17位小數(shù),但在計算時其精度遠遠不如整數(shù)

例如,0.1+0.2的結果不是0.3而是0.30000000000000004

if (a + b == 0.3){      // 不要這么做
    alert("a+b=0.3");
}

永遠不要測試某個特定的浮點數(shù)值
ECMAScipt中的最小值保存在Number.MIN_VALUE中,在大多數(shù)瀏覽器中為5e-324

最大值保存在Number.MAX_VALUE中,在大多數(shù)瀏覽器中為1.7976931348623157e+308

如果某個數(shù)超出JavaScript數(shù)值范圍,這個數(shù)將被轉(zhuǎn)換成Infinity,負數(shù)轉(zhuǎn)換成-Infinity

可以使用isFinity來確定一個數(shù)是不是有窮的

alert(isFinite(Number.MAX_VALUE + Number.MAX_VALUE)); // false

訪問Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY也可以得到負和正的Infinity

NaN(Not a Number)是一個特殊的數(shù)值,表示本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(不會拋出錯誤)

NaN有兩個特點:

  1. 任何涉及NaN的操作都會返回NaN
  2. NaN與任何值都不想等,包括NaN本身

isNaN()函數(shù)可以幫我們確定一個數(shù)是否“不是數(shù)值”,非數(shù)值類型會先轉(zhuǎn)換為數(shù)值類型再判定

alert(isNaN(10));       // false
alert(isNaN("10"));     // false
alert(isNaN("blue"));   // true(不能轉(zhuǎn)換為數(shù)值)
alert(isNaN(true));     // false

有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()parseInt()parseFloat()

Number()在轉(zhuǎn)換字符串時比較復雜而且不夠合理,因此在處理整數(shù)時常用的是parseInt()函數(shù)

var num1 = Number("hello");     // NaN
var num2 = Number("66hello");   // NaN
var num3 = Number("070");       // 70
var num4 = Number("");          // 0
var num5 = Number("0xA");       // 10 解析為16進制
var num6 = parseInt("hello");   // NaN
var num7 = parseInt("66hello"); // 66
var num8 = parseInt("070");     // 70 ES3會理解為8進制,ES5之后會忽略前導0解析為10進制
var num9 = parseInt("");        // NaN
var num10 = parseInt(22.5);      // 22
var num11 = parseInt("0xA");     // 10

為了消除parseInt()函數(shù)可能導致的困惑,可以提供第二個參數(shù),指定轉(zhuǎn)換使用的基數(shù)(即多少進制)

var num1 = parseInt("0xAF", 16); // 175
var num2 = parseInt("AF", 16);   // 175
var num3 = parseInt("AF");       // NaN

推薦在任何時候都指定轉(zhuǎn)換使用的基數(shù),一般情況下為10

parseFloat()會始終忽略前導0

var num1 = parseFloat("1234blue"); // 1234
var num2 = parseFloat("0xA");      // 10
var num3 = parseFloat("22.5");     // 22.5
var num3 = parseFloat("22.34.5");  // 22.34
var num3 = parseFloat("0908.5");   // 908.5
var num3 = parseFloat("3.125e7");  // 31250000

能解析為整數(shù)的數(shù)parseFloat()會返回整數(shù)

String

字符串可以用雙引號""可以用單引號''表示

ECMAScript中的字符串是不可變的,一旦創(chuàng)建值就不能改變

如果要改變某個變量保存的字符串,要先銷毀原來的字符串,然后再用一個包含新值的字符串填充該變量

var lang = "Java";
lang = lang + "Script";

在實現(xiàn)第二行代碼時,操作過程如下:

  1. 首先創(chuàng)建一個能容納10個字符的新字符串
  2. 然后在這個字符串中填充"Java"和"Script"
  3. 銷毀原來的字符串"Java"和字符串"Script"

可以使用toString()方法來把一個值轉(zhuǎn)換為字符串

var age = 11;
var ageString = age.toString();       // "11"
var found = true;
var foundAsString = found.toString(); // "true"

nullundefined沒有toString()方法

再調(diào)用數(shù)值的toString()方法時可以傳入一個參數(shù)來決定輸出數(shù)值的基數(shù)

如果值可能是nullundefined,還可以使用String()函數(shù)

  • 如果值有toString()方法則使用該方法
  • 如果是null則返回"null"
  • 如果是undefined則返回"undefined"

Object

對象可以通過執(zhí)行new操作符后跟要創(chuàng)建的對象類型的名稱來創(chuàng)建

在ECMAScript中,Object類型是所有其它實例的基礎,即Object類型具有的方法和屬性也同樣存在于更具體的對象中

Object的每個實例都具有下列屬性和方法:

  • constructor:保存著構造函數(shù)
  • hasOwnProperty(propertyName):檢查屬性在當前對象實例(而不是原型)中是否存在
  • isPrototypeOf(object):檢查傳入的對象是否為當前對象的原型
  • propertyIsEnumerable(propertyName):檢查給定的屬性是否能使用for-in語句枚舉
  • toLocaleString():返回對象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對應
  • toString():返回對象的字符串
  • valueOf():返回對象的字符串、數(shù)值或布爾值表示,通常與toString()方法的返回值相同

ECMA-262中對象的行為不一定適用于JavaScript中的其他對象,比如BOM和DOM都屬于瀏覽器中的宿主對象,不一定繼承Object


第三章還有一些東西 留到下次再整理

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

相關閱讀更多精彩內(nèi)容

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