JavaScript學習總結(一)——ECMAScript、BOM、DOM(核心、瀏覽器對象模型與文檔對象模型)

来源:http://www.cnblogs.com/best/archive/2017/12/12/8028168.html
-Advertisement-
Play Games

一、JavaScript簡介 JavaScript是一種解釋執行的腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型,它遵循ECMAScript標準。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,主要用來給HTML增加動態功能。 幾乎所有主流的語言 ...


一、JavaScript簡介

JavaScript是一種解釋執行的腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型,它遵循ECMAScript標準。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,主要用來給HTML增加動態功能。

幾乎所有主流的語言都可以編譯為JavaScript,進而能夠在所有平臺上的瀏覽器中執行,這也體現了JavaScript的強大性和在Web開發中的重要性。如Blade:一個Visual Studio擴展,可以將C#代碼轉換為JavaScript,Ceylon:一個可編譯為JavaScript的、模塊化的、靜態類型JVM語言。

JavaScript是一種可以同時運行在前端與後臺的語言,如Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境(類似Java或.NET)。 Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。 

1.1、javascript組成

ECMAScript,描述了該語言的語法和基本對象,如類型、運算、流程式控制制、面向對象、異常等。

文檔對象模型(DOM),描述處理網頁內容的方法和介面。

瀏覽器對象模型(BOM),描述與瀏覽器進行交互的方法和介面。

JavaScript由對象組成,一切皆為對象。

1.2、JavaScript腳本語言特點

a)、解釋型的腳本語言。JavaScript是一種解釋型的腳本語言,C、C++等語言先編譯後執行,而JavaScript是在程式的運行過程中逐行進行解釋。

基於對象。JavaScript是一種基於對象的腳本語言,它不僅可以創建對象,也能使用現有的對象。

b)、簡單。JavaScript語言中採用的是弱類型的變數類型,對使用的數據類型未做出嚴格的要求,是基於Java基本語句和控制的腳本語言,其設計簡單緊湊。

c)、動態性。JavaScript是一種採用事件驅動的腳本語言,它不需要經過Web伺服器就可以對用戶的輸入做出響應。在訪問一個網頁時,滑鼠在網頁中進行滑鼠點擊或上下移、視窗移動等操作JavaScript都可直接對這些事件給出相應的響應。

d)、跨平臺性。JavaScript腳本語言不依賴於操作系統,僅需要瀏覽器的支持。因此一個JavaScript腳本在編寫後可以帶到任意機器上使用,前提上機器上的瀏覽器支 持JavaScript腳本語言,目前JavaScript已被大多數的瀏覽器所支持。

二、ECMAScript(JavaScript核心與語法)

2.1、ECMAScript定義

1)、ECMAScript是一個標準(歐洲電腦製造商協會),JavaScript只是它的一個實現,其他實現包括ActionScript(Flash腳本)

2)、ECMAScript可以為不同種類的宿主環境提供核心的腳本編程能力,即ECMAScript不與具體的宿主環境相綁定,如JavaScript的宿主環境是瀏覽器,AS的宿主環境是Flash。、

3)、ECMAScript描述了以下內容:語法、類型、語句、關鍵字、保留字、運算符、對象等

2.2、數據類型

在JS中使用var關鍵詞聲明變數,變數的類型會根據其所賦值來決定(動態類型)。JS中數據類型分為原始數據類型(5種)和引用數據類型(Object類型)。

1)5種原始數據類型:Undefined、Null、Boolean、Number和String。需要註意的是JS中字元串屬於原始數據類型。

2)typeof運算符:查看變數類型,對變數或值調用typeof運算符將返回下列值之一:

    • undefined – 如果變數是 Undefined 類型的
    • boolean – 如果變數是 Boolean 類型的
    • number – 如果變數是 Number 類型的
    • string – 如果變數是 String 類型的
    • object – 如果變數是一種引用類型或 Null 類型的

3)通過instanceof 運算符解決引用類型判斷問題

4)null 被認為是對象的占位符,typeof運算符對於null值返回“object”。

5)原始數據類型和引用數據類型變數在記憶體中的存放如下:

memory of datatype in js

6)JS中對類型的定義:一組值的集合。如Boolean類型的值有兩個:true、false。Undefined和Null 類型都只有一個值,分別是undefined和null。

Null 類型只有一個值,就是 null ; Undefined 類型也只有一個值,即 undefined 。 null 和 undefined 都可以作為字面量(literal)在 JavaScript 代碼中直接使用。

null 與對象引用有關係,表示為空或不存在的對象引用。當聲明一個變數卻沒有給它賦值的時候,它的值就是 undefined 。

undefined 的值會出現在如下情況:

從一個對象中獲取某個屬性,如果該對象及其 prototype 鏈 中的對象都沒有該屬性的時候,該屬性的值為 undefined 。

一個 function 如果沒有顯式的通過 return 來返回值給其調用者的話,其返回值就是 undefined 。有一個特例就是在使用new的時候。

JavaScript 中的 function 可以聲明任意個形式參數,當該 function 實際被調用的時候,傳入的參數的個數如果小於聲明的形式參數,那麼多餘的形式參數的值為 undefined 。

示例:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <script>
            //js對象
            var user = {
                name: "張學友",
                address: "中國香港"
            };
            console.log(user.age);  //訪問對象中的屬性,未定義
            
            var i;
            console.log(i);  //變數未賦值
            
            function f(n1){
                console.log(n1);
            }
            var result=f(); //參數未賦值
            
            console.log(result);  //當函數沒有返回值時為undefined
            
        </script>
    </body>

</html>

結果:

關於 null 和 undefined 有一些有趣的特性:

如果對值為 null 的變數使用 typeof 操作符的話,得到的結果是 object ;

而對 undefined 的值使用 typeof,得到的結果是 undefined 。

如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true

示例:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <script>
            //js對象
            var user = {
                name: "張學友",
                address: "中國香港"
            };
            console.log(typeof(user));
            console.log(typeof(null));
            console.log(typeof(undefined));
            console.log(user.name);
            console.log(user.age);
            
            if(user.age){
                console.log(user.age);
            }else{
                console.log("沒有age屬性");
            }
            //為false的情況
            var i;
            console.log(!!"");
            console.log(!!0);
            console.log(!!+0);
            console.log(!!-0);
            console.log(!!NaN);
            console.log(!!null);
            console.log(!!undefined);
            console.log(typeof(i));
            console.log(!!i);
            console.log(false);
            //是否不為數字,is Not a Number
            console.log(isNaN("Five"));
            console.log(isNaN("5"));
        </script>
    </body>

</html>

結果:

7) boolean類型的特殊性

8)、== 與 ===

JavaScript 中有兩個判斷值是否相等的操作符,== 與 === 。兩者相比,== 會做一定的類型轉換;而 === 不做類型轉換,所接受的相等條件更加嚴格。

===比較時會比較類型

當然與之對應的就是!=與!==

儘量使用===而不要使用==

            console.log("5"==5);  //true
            console.log("5"===5);  //false
            console.log("5"!=5);  //false
            console.log("5"!==5);  //true

2.3、局部變數和全局變數

在函數中聲明的變數只能在函數中使用,當你退出函數時,變數就會被釋放,這種變數被稱為局部變數。因為每個局部變數只在各自的函數中有效,所以你可以在不同的函數中使用名稱相同的變數。

如果在函數之外聲明變數,那麼頁面中所有的函數都可以使用它。在全局變數被聲明後,它們就開始生效了。在網頁被關閉後,變數才會失效。

註意:JS語言中,在代碼塊中聲明的變數屬於全局變數。

JavaScript是一種對數據類型變數要求不太嚴格的語言,所以不必聲明每一個變數的類型,變數聲明儘管不是必須的,但在使用變數之前先進行聲明是一種好的習慣。可以使用 var 語句來進行變數聲明。如:var men = true; // men 中存儲的值為 Boolean 類型。

變數命名

JavaScript 是一種區分大小寫的語言,因此將一個變數命名為best和將其命名為Best是不一樣的。
另外,變數名稱的長度是任意的,但必須遵循以下規則:

  •  1.第一個字元必須是一個字母(大小寫均可)、或一個下劃線(_)或一個美元符 ($)。
  •  2.後續的字元可以是字母、數字、下劃線或美元符。
  •  3.變數名稱不能是保留字。

可以不使用var定義變數,但這樣定義的變數是全局變數。

 示例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script>
            function a(){
                var n1=1;
                n2=2;  //聲明n2時未使用var,所以n2是全局變數,儘量避免
                console.log(n1+","+n2);
            }
            a();
            console.log(n2);
            console.log(window.n2);
            console.log(window.n1);
            console.log(n1);
        </script>
    </body>

</html>

結果:

2.4、數組(Array)

①js中,數組元素類型可以不一致。

②js中,數組長度可以動態改變。

③接著上述代碼,typeof arr 和 arr instanceof Array 分別輸出object和true。

            console.log(typeof(names));  //object
            console.log(names instanceof Array);  //true
            console.log("" instanceof String);  //false 不是對象類型
            console.log(true instanceof Boolean);  //false

數組對象與方法

Array 對數組的內部支持
Array.concat( ) 連接數組
Array.join( ) 將數組元素連接起來以構建一個字元串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最後一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字元串
Array.toString( ) 將數組轉換成一個字元串
Array.unshift( ) 在數組頭部插入一個元素

2.4.1、創建

var arrayObj = new Array();
var arrayObj = new Array([size]);
var arrayObj = new Array([element0[, element1[, ...[, elementN]]]]);

示例:

            var array11 = new Array();  //空數組
            var array12 = new Array(5);  //指定長度,可越界
            var array13 = new Array("a","b","c",1,2,3,true,false);  //定義並賦值
            var array14=[];  //空數組,語法糖
            var array15=[1,2,3,"x","y"];  //定義並賦值

2.4.2、訪問與修改

var testGetArrValue=arrayObj[1]; 

arrayObj[1]= "值";

            //4.2、訪問與修改
            array12[8]="hello array12";  //賦值或修改
            console.log(array12[8]);   //取值
            //遍歷
            for (var i = 0; i < array13.length; i++) {
                console.log("arrayl3["+i+"]="+array13[i]);
            }
            //枚舉
            for(var i in array15){ 
                console.log(i+"="+array15[i]);  //此處的i是下標
            }

結果:

2.4.3、添加元素

將一個或多個新元素添加到數組未尾,並返回數組新長度

arrayObj. push([item1 [item2 [. . . [itemN ]]]]);

將一個或多個新元素添加到數組開始,數組中的元素自動後移,返回數組新長度

arrayObj.unshift([item1 [item2 [. . . [itemN ]]]]);

將一個或多個新元素插入到數組的指定位置,插入位置的元素自動後移,返回被刪除元素數組,deleteCount要刪除的元素個數

arrayObj.splice(insertPos,deleteCount,[item1[, item2[, . . . [,itemN]]]])

示例代碼:

            //4.3、添加元素
            var array31=[5,8];
            //添加到末尾
            array31.push(9);
            var len=array31.push(10,11);
            console.log("長度為:"+len+"——"+array31);
            //添加到開始
            array31.unshift(4);
            var len=array31.unshift(1,2,3);
            console.log("長度為:"+len+"——"+array31);
            //添加到中間
            var len=array31.splice(5,1,6,7);  //從第5位開始插入,刪除第5位後的1個元素,返回被刪除元素
            console.log("被刪除:"+len+"——"+array31);

運行結果:

2.4.4、刪除

移除最後一個元素並返回該元素值

arrayObj.pop();

移除最前一個元素並返回該元素值,數組中元素自動前移

arrayObj.shift(); 

刪除從指定位置deletePos開始的指定數量deleteCount的元素,數組形式返回所移除的元素

arrayObj.splice(deletePos,deleteCount); 

示例:

            //4.4、刪除
            var array41=[1,2,3,4,5,6,7,8];
            console.log("array41:"+array41);
            //刪除最後一個元素,並返回
            var e=array41.pop();
            console.log("被刪除:"+e+"——"+array41);
            //刪除首部元素,並返回
            var e=array41.shift();
            console.log("被刪除:"+e+"——"+array41);
            //刪除指定位置與個數
            var e=array41.splice(1,4);  //從索引1開始刪除4個
            console.log("被刪除:"+e+"——"+array41);

結果:

2.4.5、截取和合併

以數組的形式返回數組的一部分,註意不包括 end 對應的元素,如果省略 end 將複製 start 之後的所有元素

arrayObj.slice(start, [end]); 

將多個數組(也可以是字元串,或者是數組和字元串的混合)連接為一個數組,返回連接好的新的數組

arrayObj.concat([item1[, item2[, . . . [,itemN]]]]); 

示例: 

            //4.5、截取和合併
            var array51=[1,2,3,4,5,6];
            var array52=[7,8,9,0,"a","b","c"];
            //截取,切片
            var array53=array51.slice(2);  //從第3個元素開始截取到最後
            console.log("被截取:"+array53+"——"+array51);
            var array54=array51.slice(1,4);  //從第3個元素開始截取到索引號為3的元素
            console.log("被截取:"+array54+"——"+array51);
            //合併
            var array55=array51.concat(array52,["d","e"],"f","g");
            console.log("合併後:"+array55);

結果:

2.4.6、拷貝

返回數組的拷貝數組,註意是一個新的數組,不是指向

arrayObj.slice(0); 

返回數組的拷貝數組,註意是一個新的數組,不是指向

arrayObj.concat(); 

因為數組是引用數據類型,直接賦值並沒有達到真正實現拷貝,地址引用,我們需要的是深拷貝。

2.4.7、排序

反轉元素(最前的排到最後、最後的排到最前),返回數組地址

arrayObj.reverse(); 

對數組元素排序,返回數組地址

arrayObj.sort(); 

arrayObj.sort(function(obj1,obj2){}); 

示例:

            var array71=[4,5,6,1,2,3];
            array71.sort();
            console.log("排序後:"+array71);
            var array72=[{name:"tom",age:19},{name:"jack",age:20},{name:"lucy",age:18}];
            array72.sort(function(user1,user2){
                return user1.age<user2.age;
            });
            console.log("排序後:");
            for(var i in array72) console.log(array72[i].name+","+array72[i].age);

結果:

2.4.8、合併成字元

返回字元串,這個字元串將數組的每一個元素值連接在一起,中間用 separator 隔開。

arrayObj.join(separator); 

示例代碼:

            //4.8、合併成字元與將字元拆分成數組
            var array81=[1,3,5,7,9];
            var ids=array81.join(",");
            console.log(ids);
            
            //拆分成數組
            var text="hello nodejs and angular";
            var array82=text.split(" ");
            console.log(array82);

運行結果:

所有代碼:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>數組操作</title>
    </head>

    <body>
        <script type="text/javascript">
            //4.1、創建
            var array11 = new Array();  //空數組
            var array12 = new Array(5);  //指定長度,可越界
            var array13 = new Array("a","b","c",1,2,3,true,false);  //定義並賦值
            var array14=[];  //空數組,語法糖
            var array15=[1,2,3,"x","y"];  //定義並賦值
            
            //4.2、訪問與修改
            array12[8]="hello array12";  //賦值或修改
            console.log(array12[8]);   //取值
            //遍歷
            for (var i = 0; i < array13.length; i++) {
                //console.log("arrayl3["+i+"]="+array13[i]);
            }
            //枚舉
            for(var i in array15){ 
                //console.log(i+"="+array15[i]);  //此處的i是下標
            }
            
            //4.3、添加元素
            var array31=[5,8];
            //添加到末尾
            array31.push(9);
            var len=array31.push(10,11);
            console.log("長度為:"+len+"——"+array31);
            //添加到開始
            array31.unshift(4);
            var len=array31.unshift(1,2,3);
            console.log("長度為:"+len+"——"+array31);
            //添加到中間
            var len=array31.splice(5,1,6,7);  //從第5位開始插入,刪除第5位後的1個元素,返回被刪除元素
            console.log("被刪除:"+len+"——"+array31);
            
            //4.4、刪除
            var array41=[1,2,3,4,5,6,7,8];
            console.log("array41:"+array41);
            //刪除最後一個元素,並返回
            var e=array41.pop();
            console.log("被刪除:"+e+"——"+array41);
            //刪除首部元素,並返回
            var e=array41.shift();
            console.log("被刪除:"+e+"——"+array41);
            //刪除指定位置與個數
            var e=array41.splice(1,4);  //從索引1開始刪除4個
            console.log("被刪除:"+e+"——"+array41);
            
            //4.5、截取和合併
            var array51=[1,2,3,4,5,6];
            var array52=[7,8,9,0,"a","b","c"];
            //截取,切片
            var array53=array51.slice(2);  //從第3個元素開始截取到最後
            console.log("被截取:"+array53+"——"+array51);
            var array54=array51.slice(1,4);  //從第3個元素開始截取到索引號為3的元素
            console.log("被截取:"+array54+"——"+array51);
            //合併
            var array55=array51.concat(array52,["d","e"],"f","g");
            console.log("合併後:"+array55);
            
            //4.7、排序
            var array71=[4,5,6
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面的話 惰性函數表示函數執行的分支只會在函數第一次調用的時候執行,在第一次調用過程中,該函數會被覆蓋為另一個按照合適方式執行的函數,這樣任何對原函數的調用就不用再經過執行的分支了。本文將詳細介紹惰性函數 使用背景 因為各瀏覽器之間的行為的差異,經常會在函數中包含了大量的if語句,以檢查瀏覽器特性, ...
  • <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body> <div style="border: 1px solid red; width: 1000px;margin: 0px ...
  • [1]常見場景 [2]函數防抖 [3]函數節流 [4]數組分塊 [5] ...
  • <!doctype html><html><head><meta charset="utf-8"><title></title></head> <body><tr> <td><input id="copy_{$key}" onclick="getUrl('{$key}')" value="複製文件鏈 ...
  • Web前端技術由 html、css 和 javascript 三大部分構成,是一個龐大而複雜的技術體系,其複雜程度不低於任何一門後端語言。而我們在學習它的時候往往是先從某一個點切入,然後不斷地接觸和學習新的知識點,因此對於初學者很難理清楚整個體系的脈絡結構。本文將對Web前端知識體系進行簡單的梳理, ...
  • > 關於譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是 CSS 里最閃耀的一瞥;總結,是 JavaScript 中最嚴謹的邏輯。經過捶打磨練,成就了本書的中文版。本書包含了函數式編程之精髓,希望可以幫助大家在學習函數式編程的道路上走的更順暢。比心。 本書主要探... ...
  • 1、set ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重覆的值。 使用add方法向 Set 結構加入成員。 2、size 確定set結構中有幾個元素。 3、add/delete/has/clear ...
  • 目錄 前言 JavaScript加減乘除運算 decimal.js加減乘除運算 前言 開發過程中免不了有浮點運算,JavaScript浮點運算的精度問題會帶來一些困擾 JavaScript 只有一種數字類型 ( Number ) JavaScript採用 IEEE 754 標準雙精度浮點(64),6 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...