1.4.3JavaScript基礎(chǔ)

目錄

使用瀏覽器執(zhí)行前端 JavaScript

大多數(shù)瀏覽器通過(guò) F12 可以調(diào)出調(diào)試窗口,如圖所示。在調(diào)試窗口中可以執(zhí)行相關(guān)代碼。JS 是一種解釋性語(yǔ)言,由解釋器對(duì)代碼進(jìn)行解析。

console.log("Hello World!")

[圖片上傳失敗...(image-686ed8-1561872071507)]

在瀏覽器中,會(huì)集成 JS 的解析引擎,不同的瀏覽器擁有不同的解析引擎,這就使得 JS 的執(zhí)行在不同瀏覽器上有不同的解釋效果。

瀏覽器 引擎
IE/Edge Chakra
Firefox SpiderMonkey
Safari SFX
Chrome V8
Opera Carakan

嵌入在 HTML 中的 JS 代碼通常有以下幾種形式:

直接插入代碼塊
<script>console.log('Hello World!');</script>

加載外部 JS 文件
<script src="Hello.js"></script>

使用 HTML 標(biāo)簽中的事件屬性
<a href="javascript:alert('Hello')"></a>

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

作為弱類型的語(yǔ)言,JS 的變量聲明不需要指定數(shù)據(jù)類型:

var pi=3.14;
var pi='ratio of the circumference of a circle to its diameter';

當(dāng)然,可以通過(guò)“ new ”來(lái)聲明變量類型:

var pi=new String;
var pi=new Number;
var pi=new Boolean;
var pi=new Array;
var pi=new Object;

上一個(gè)示例也展示了 JS 的數(shù)據(jù)類型,分別是字符串、數(shù)字、布爾值、數(shù)組和對(duì)象。

有兩個(gè)特殊的類型是 Undefined 和 Null,形象一點(diǎn)區(qū)分,前者表示有坑在但坑中沒(méi)有值,后者表示沒(méi)有坑。另外,所有 JS 變量都是對(duì)象,但是需要注意的是,對(duì)象聲明的字符串和直接賦值的字符串并不嚴(yán)格相等。

JavaScript 編程邏輯

基礎(chǔ)

JS 語(yǔ)句使用分號(hào)分隔。

邏輯語(yǔ)句

if 條件語(yǔ)句:

if (condition)
{
  代碼塊
}
else
{
  代碼塊
}

switch 條件語(yǔ)句:

switch(n)
{
  case 1:
    代碼塊
    break;
  case 2:
    代碼塊
    break;
  default:
    代碼塊
}

for/for in 循環(huán)語(yǔ)句:

for (代碼1;代碼2;代碼3)
{
  代碼塊
}
for (x in xs)
{
  代碼塊
}

while/do while 循環(huán)語(yǔ)句:

while (條件)
{
  代碼塊
}
do
{
  代碼塊
}
while (條件);

JavaScript 打印數(shù)據(jù)

在瀏覽器中調(diào)試代碼時(shí),經(jīng)常用到的手段是打印變量。

函數(shù) 作用
window.alert() 彈出警告框
document.write() 寫入HTML文檔
console.log() 寫入瀏覽器控制臺(tái)

[圖片上傳失敗...(image-bf23c3-1561872071507)]

[圖片上傳失敗...(image-902050-1561872071507)]

JavaScript 框架

JS 同樣有許多功能強(qiáng)大的框架。大多數(shù)的前端 JS 框架使用外部引用的方式將 JS 文件引入到正在編寫的文檔中。

jQuery

jQuery 封裝了常用的 JS 功能,通過(guò)選擇器的機(jī)制來(lái)操縱 DOM 節(jié)點(diǎn),完成復(fù)雜的前端效果展示。

Angular

實(shí)現(xiàn)了前端的 MVC 架構(gòu),通過(guò)動(dòng)態(tài)數(shù)據(jù)綁定來(lái)簡(jiǎn)化數(shù)據(jù)轉(zhuǎn)遞流程。

React

利用組件來(lái)構(gòu)建前端UI的框架

Vue

MVVM 構(gòu)架的前端庫(kù),理論上講,將它定義為數(shù)據(jù)驅(qū)動(dòng)、組件化的框架,但這些概念也可能適用于其他框架,所以可能只有去真正使用到所有框架才能領(lǐng)悟到它們之間的區(qū)別。

其他

還有許許多多針對(duì)不同功能的框架,比如針對(duì)圖表可視化、網(wǎng)絡(luò)信息傳遞或者移動(dòng)端優(yōu)化等等。

雙向數(shù)據(jù)綁定

傳統(tǒng)基于 MVC 的架構(gòu)的思想是數(shù)據(jù)單向的傳送到 View 視圖中進(jìn)行顯示,但是有時(shí)我們還需要將視圖層的數(shù)據(jù)傳輸回模型層,這部分的功能就由前端 JS 來(lái)接手,因此許多近幾年出現(xiàn)的新框架都使用數(shù)據(jù)雙向綁定來(lái)完成MVVM的新構(gòu)架,這就帶給了用戶更多的權(quán)限接觸到程序的編程邏輯,進(jìn)而產(chǎn)生一些安全問(wèn)題,比較典型的就是許多框架曾經(jīng)存在的模板注入問(wèn)題。

JavaScript DOM 和 BOM

DOM 文檔對(duì)象模型,JS 通過(guò)操縱 DOM 可以動(dòng)態(tài)獲取、修改 HTML 中的元素、屬性、CSS 樣式,這種修改有時(shí)會(huì)帶來(lái) XSS 攻擊風(fēng)險(xiǎn)
BOM 瀏覽器對(duì)象模型,類比于 DOM,賦予 JS 對(duì)瀏覽器本身進(jìn)行有限的操縱,獲取 Cookie、地理位置、系統(tǒng)硬件或?yàn)g覽器插件信息等

JavaScript 混淆

由于前端代碼的可見(jiàn)性,出于知識(shí)產(chǎn)權(quán)或者其他目的,JS 代碼通過(guò)混淆的方法使得自己既能被瀏覽器執(zhí)行,又難以被人為解讀。常見(jiàn)的混淆方法有重命名變量名和函數(shù)名、擠壓代碼、拼接字符、使用動(dòng)態(tài)執(zhí)行函數(shù)在函數(shù)與字符串之間進(jìn)行替換等。下面對(duì)比代碼混淆前后的差異。

混淆前:

console.log('Hello World!');

混淆后:

console["\x6c\x6f\x67"]('\x48\x65\x6c\x6c\x6f \x57\x6f\x72\x6c\x64\x21');

更加復(fù)雜的混淆后:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('1.0(\'3 2!\');',4,4,'log|console|World|Hello'.split('|'),0,{}))

由于之前提到的特性,無(wú)論混淆有多么復(fù)雜,最終它都能夠在瀏覽器中被解釋執(zhí)行。

使用 Node.js 執(zhí)行后端 JavaScript

安裝完成 Node.js 后,我們可以嘗試編寫第一個(gè)后端 JS 程序。

1.打開(kāi)文本編輯器,寫入

console.log("Hello World");

并保存為 hello.js

2.使用

node hello.js

來(lái)執(zhí)行文件。

[圖片上傳失敗...(image-10fbae-1561872071507)]

Node.js 模塊

Node.js 同樣通過(guò)豐富的模塊提供強(qiáng)大的功能,模塊使用 npm 進(jìn)行管理。

  • events:事件模塊,提供事件觸發(fā)和事件監(jiān)聽(tīng)功能
  • util:核心功能模塊,用于彌補(bǔ)核心 JS 功能的不足
  • fs:文件操作模塊,提供文件操作 API
  • http:Web 協(xié)議模塊,提供 Web 協(xié)議交互功能
  • express:Web 框架,用于快速構(gòu)建 Web 應(yīng)用服務(wù)
  • vm:沙箱模塊,提供干凈的上下文環(huán)境

后端 JS 就會(huì)存在其他語(yǔ)言后端所同樣存在安全問(wèn)題,包括基礎(chǔ)的 Web 攻擊、服務(wù)端模板注入、沙箱逃逸、內(nèi)存溢出等問(wèn)題。

參考資料

來(lái)源:GitHub

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

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

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