HTML 代碼是由 “標簽” 構成的整體的 HTML 代碼是由一對 <html> </html> 包裹的<head> </hea" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 前端三劍客 HTML、CSS、JavaScript 入門到上手

前端三劍客 HTML、CSS、JavaScript 入門到上手

時間:2023-07-05 00:21:01 | 來源:網(wǎng)站運營

時間:2023-07-05 00:21:01 來源:網(wǎng)站運營

前端三劍客 HTML、CSS、JavaScript 入門到上手:

一. HTML基礎使用

HTML:超文本標記語言,是一種用于創(chuàng)建網(wǎng)頁的標準標記語言。

  1. HTML 代碼是由 “標簽” 構成的
  2. 整體的 HTML 代碼是由一對 <html> </html> 包裹的
  3. <head> </head> 標簽是頁面的頭部,標簽中寫頁面的屬性
  4. <body> </body> 標簽是頁面的主體,標簽中寫的是頁面顯示的內(nèi)容
  5. <title> </title> 標簽中寫的是頁面的標題

1.HTML 入門實例

<html> <head> <title>第?個??</title> </head> <body> hello world </body></html>這三個標簽組成了一個html的主體,也是一個最簡單的頁面。每個標簽,都分成了開始標簽和結(jié)束標簽,是成對出現(xiàn)的,標簽之間可以嵌套。

整體這些標簽就構成了一個 樹形 結(jié)構,稱為 DOM 樹(DOM Document Objective Model 文檔對象模型)

解釋一下這個模板:

<!DOCTYPE html> : 這一行是聲明了文檔類型,描述了當前文件是 html 文件

<html lang="en"> : 表示當前網(wǎng)頁使用的語言是 english?!?這里標記了語言也是方便了瀏覽器自帶的翻譯功能進行識別。

<head>標簽里面放的內(nèi)容主要是頁面的一些屬性,和頁面展示的內(nèi)容沒有太大關系。<meta charset="UTF-8">聲明我們這個頁面的字符編碼是 UTF-8,<tatle> 里面包裹的是瀏覽器標簽頁的默認標題。

<body>里面就是頁面要展示的內(nèi)容。

下面就要開始介紹 HTML 具體的語法細節(jié)了,值得一提的是,前端這里涉及的 HTML、CSS、JS 這三門語言,但是實際上,只有 JS 是一個可編程的語言,其他兩個都只是作用了頁面顯示的“信息”,語法規(guī)則中不表達“邏輯”,只是表示信息。下面介紹的就是組成一個頁面上的元素,也就是 HTML 語言的主體——標簽。

2 HTML 常見標簽

① 注釋標簽

ctrl + / 快捷鍵可以快速注釋/取消注釋。
<!-- 我是注釋 -->注釋不會顯示在界面上,目的是提高代碼的可讀性。

② 標題標簽

標題標簽有6個:<h1>...<h6> 數(shù)字越大,字體越小

③ 段落標簽

段落標簽是用 <p> 來定義的
段落標簽保證了每一個段落是存在在一行的,并且距離下一個段落中間會空有一行的間距。下面我們用lorem生成一個隨機的比較長的字符串再來測試一下我們的<p>標簽的展示效果:

這樣我們就比較清楚的看到每一個段落之間的效果了。

④ 換行標簽

段落標簽是用 <br> 來定義的
<p>不一樣的是,<br>他只會進行換行,不會分段使每段之間有一個空行,且 br 標簽是一個“單標簽”,只有開始標簽,沒有結(jié)束標簽。

HTML轉(zhuǎn)義字符

heml 語法里的有些特殊字符需要轉(zhuǎn)義才能夠正確的顯示,我們需要了解,比如空格,不是我們在代碼里輸出幾個空格頁面就會正確的顯示多個空格的,html 會把相鄰的空格合并成一個空格。而我們需要使用轉(zhuǎn)義字符 &nbsp; ,需要多少空格輸入多少次 &nbsp; 才能正確的顯示出來自己需要的樣式。 HTML轉(zhuǎn)義字符

⑤ 格式化標簽

格式化標簽是作用在文本上的,所以不難理解,格式化標簽不會像之前的塊級元素例如標題標簽一樣的會獨占一行,而是作為行內(nèi)元素直接作用在被標簽包裹的文本上的。

⑥ 圖片標簽

圖片標簽是用<img>來表示的,img 中的 src 屬性,就代表了圖片的路徑,同樣圖片的樣式和名稱也是由屬性來決定的。

如果我們還想設置圖片的尺寸:

從圖片標簽里我們接觸到了標簽的 “屬性” ,是的,在 html 的開始標簽里,可以給標簽設置一些屬性。且屬性是用 “ 鍵值對 ” 這樣的形式表示的。

鍵值對之間使用空格來分割;鍵值對之間使用 = 來分割;key不需要 " " ,value 內(nèi)容用 " " 包裹起來。

⑦ 超鏈接標簽

超鏈接標簽用<a> </a>來表示,其中的href屬性表示點擊后會跳轉(zhuǎn)到哪個頁面,target表示打開方式,默認是_self,在本標簽頁打開,如果設置為_blank,則用新的標簽頁打開。

外部鏈接

<a href="https://www.baidu.com">這是超鏈接,點擊跳轉(zhuǎn)到百度</a內(nèi)部鏈接

<a href="htmlDemo1.html">跳轉(zhuǎn)到自己文件夾中的另外一個html網(wǎng)頁</a>空鏈接

<a href="#">這是一個空連接</a>下載鏈接

<a href = "cat.zip">點擊下載這個壓縮包 </a>錨點鏈接

類似于目錄,點擊之后會跳轉(zhuǎn)到本頁面中的特定的位置。

⑧ 表格標簽

⑨ 列表標簽

⑩ 表單標簽

表單標簽是用戶和頁面交互的重要手段,是要讓用戶來“輸入”的。
form 標簽

用<form> </form>來創(chuàng)建一個表單標簽,借助 form 就可以允許用戶輸入一些信息,并且提交到 服務器 上。
input 標簽

onclick

onclick表示在點擊元素的時候觸發(fā),觸發(fā)的內(nèi)容就是 " " 里的代碼, 會被瀏覽器直接執(zhí)行。這里的alert就是彈出一個對話框。

上面頁面效果也可以使用代碼

<button onclick="alert('hello HTML')">這是一個按鈕</button>來實現(xiàn)。

label 標簽

每一個 html 元素(標簽),都可以設置一個唯一的 id,在一個頁面中,id 的取值不能重復。
通過這個 id 屬性,在 input 標簽設置選中框操作上搭配 label 標簽,實現(xiàn)通過點擊文字,也能選中的效果。
select 標簽

可以實現(xiàn)一個下拉菜單
textarea 標簽

是一個可以指定多行編輯框的標簽

? 無語義標簽

div 默認是一個塊級元素(獨占一行)
span 默認是一個行內(nèi)元素(不獨占一行)
前面的標簽,都是 “有語義” 的標簽,每個標簽都有一個明確的 “角色”;

但是相對于我們現(xiàn)在使用 HTML 語言顯示一個頁面,頁面的內(nèi)容相對來說比較復雜,交互效果比較豐富。也就是對“功能”的概念相對弱化,而更多的是體現(xiàn)出“展示效果”。

二. CSS 層疊樣式表

前面的 HTML 只是表示頁面的結(jié)構和內(nèi)容~ CSS 描述的是頁面的樣式(具體來說,就是描述了一個網(wǎng)頁的元素),讓一個頁面變得好看起來。

每一個 CSS 語句包含兩個部分:選擇器 + 應用的屬性

1 .CSS 的引入方式:

1.1 行內(nèi)樣式

在某個標簽中,引入 style 屬性,來指定樣式

1.2 內(nèi)聯(lián)樣式

寫在 style 標簽中,嵌入到 html 內(nèi)部的樣式
內(nèi)聯(lián)樣式只適合于特別簡單的情況,如果樣式比較復雜,不建議用這種寫法

1.3 外部樣式

把 CSS 代碼單獨提取出來,放到一個 .css 文件中,然后在 html 代碼里,通過 link 標簽,來引入該 CSS 文件。

2 選擇器

選擇器的功能就是選中頁面的元素(標簽)

2.1 基礎選擇器

用 html 的一個標簽名寫的選擇器
在 CSS 代碼中創(chuàng)建一個類名,此時具有該類名的元素,都會應用上相關的 CSS 屬性
給被選中的元素(標簽),設置個 id 屬性
直接選中頁面上的所有元素,一般最大的用途是 取消瀏覽器的默認樣式
經(jīng)典寫法:

2.2 復合選擇器

實現(xiàn)選擇器能夠選中 某個元素 里面的后代元素的方法,用多個選擇器組合使用
一種選擇器嵌套另外一種選擇器的方式
并列的寫多個選擇器

3 常用元素屬性

CSS語法文檔 - MDN

3.1 字體屬性

① 字體樣式

body { font-family: '微軟雅?'; font-family: 'Microsoft YaHei'; }② 字體大小

p { font-size: 20px; }③ 字體粗細

p { font-weight: bold; font-weight: 700; }④ 文字樣式

/* 設置傾斜 */font-style: italic;/* 取消傾斜 */font-style: normal;

3.2 文本屬性

① 文本的顏色

我們的顯示器是由很多很多的 “像素” 構成的. 每個像素視為?個點, 這個點就能反映出?個具體的顏?. 我們使用 R (red), G (green), B (blue) 的?式表示顏色(色光三原?). 三種顏?按照不同的比例搭配, 就能混合出各種五彩斑斕的效果.

color: red;color: #ff0000;color: rgb(255, 0, 0);在 rgb 中通過不同的分量拉不同的值,就能得到不同的顏色。

rgba :透明度。

② 文本對齊

③ 文本裝飾

④ 文本對齊

text-indent: [值];

3.3 背景屬性

① 背景顏色

background-color: [指定顏?]② 背景圖片

background-image: url(...);③ 背景平鋪

background-repeat: [平鋪?式]④ 背景尺寸

background-size: length|percentage|cover|contain;

三. JS 基礎語法

JavaScript (簡稱 JS)

1.JavaScript 和 HTML 和 CSS 之間的關系

2.JavaScript 的書寫形式

1. 行內(nèi)式

直接嵌入到 html 元素內(nèi)部

<input type="button" value="點我一下" onclick="alert('haha')">注意, JS 中字符串常量可以使用單引號表示, 也可以 使用雙引號表示.

HTML 中推薦使用雙引號, JS 中推薦使用單引號.

2. 內(nèi)嵌式

寫到 script 標簽中

<script> alert("haha");</script>3. 外部式

寫到單獨的 .js 文件中

<script src="hello.js"></script>


alert("hehe");注意, 這種情況下 script 標簽中間不能寫代碼. 必須空著(寫了代碼也不會執(zhí)行).

適合代碼多的情況.

3.變量的使用

基本用法

創(chuàng)建變量(變量定義/變量聲明/變量初始化)

var name = 'zhangsan';var age = 20;
var 是 JS 中的關鍵字, 表示這是一個變量.
= 在 JS 中表示 “賦值”, 相當于把數(shù)據(jù)放到內(nèi)存的盒子中. = 兩側(cè)建議有一個空格
每個語句最后帶有一個 ; 結(jié)尾. JS 中可以省略 ; 但是建議還是加上.
注意, 此處的 ; 為英文分號. JS 中所有的標點都是英文標點.
初始化的值如果是字符串, 那么就要使用單引號或者雙引號引起來.
初始化的值如果是數(shù)字, 那么直接賦值即可.
使用變量

console.log(age); // 讀取變量內(nèi)容age = 30; // 修改變量內(nèi)容
為啥動漫中的角色都是要先喊出技能名字再真正釋放技能?
就是因為變量要先聲明才能使用.
代碼示例: 彈框提示用戶輸入信息, 再彈框顯示.

var name = prompt("請輸入姓名:");var age = prompt("請輸入年齡:");var score = prompt("請輸入分數(shù)");alert("您的姓名是: " + name);alert("您的年齡是: " + age);alert("您的分數(shù)是: " + score);也可以把三個輸出內(nèi)容合并成一次彈框

var name = prompt("請輸入姓名:");var age = prompt("請輸入年齡:");var score = prompt("請輸入分數(shù)");alert("您的姓名是: " + name + "/n" + "您的年齡是: " + age + "/n" + "您的分數(shù)是: " + score + "/n");
JavaScript 中還支持使用 let 定義變量. 用法和 var 基本類似. 用法上的差異此處暫時不討論.
理解 動態(tài)類型

JS 的變量類型是程序運行過程中才確定的(運行到 = 語句才會確定類型)

var a = 10; // 數(shù)字var b = "hehe"; // 字符串隨著程序運行, 變量的類型可能會發(fā)生改變.

var a = 10; // 數(shù)字a = "hehe"; // 字符串這一點和 C Java 這種靜態(tài)類型語言差異較大.

C, C++, Java, Go 等語言是靜態(tài)類型語言. 一個變量在創(chuàng)建的時候類型就確定了, 不能在運行時發(fā)生改變.
如果嘗試改變, 就會直接編譯報錯.

4.基本數(shù)據(jù)類型

JS 中內(nèi)置的幾種類型

number 數(shù)字類型

JS 中不區(qū)分整數(shù)和浮點數(shù), 統(tǒng)一都使用 “數(shù)字類型” 來表示.

數(shù)字進制表示

計算機中都是使用二進制來表示數(shù)據(jù), 而人平時都是使用十進制.

因為二進制在使用過程中不太方便(01太多會看花眼).

所以在日常使用二進制數(shù)字時往往使用 八進制 和 十六進制 來表示二進制數(shù)字.

var a = 07; // 八進制整數(shù), 以 0 開頭var b = 0xa; // 十六進制整數(shù), 以 0x 開頭var c = 0b10; // 二進制整數(shù), 以 0b 開頭注意:

各種進制之間的轉(zhuǎn)換, 不需要手工計算, 直接使用計算器即可.
特殊的數(shù)字值

var max = Number.MAX_VALUE;// 得到 Infinityconsole.log(max * 2);// 得到 -Infinityconsole.log(-max * 2);// 得到 NaNconsole.log('hehe' - 10);注意:

  1. 負無窮大 和 無窮小 不是一回事. 無窮小指無限趨近與 0, 值為 1 / Infinity
  2. ‘hehe’ + 10 得到的不是 NaN, 而是 ‘hehe10’, 會把數(shù)字隱式轉(zhuǎn)成字符串, 再進行字符串拼接.
  3. 可以使用 isNaN 函數(shù)判定是不是一個非數(shù)字.
console.log(isNaN(10)); // falseconsole.log(isNaN('hehe' - 10)); // true

string 字符串類型

基本規(guī)則

字符串字面值需要使用引號引起來, 單引號雙引號均可.

var a = "haha";var b = 'hehe';var c = hehe; // 運行出錯如果字符串中本來已經(jīng)包含引號咋辦?

var msg = "My name is "zhangsan""; // 出錯var msg = "My name is /"zhangsan/""; // 正確, 使用轉(zhuǎn)義字符. /" 來表示字符串內(nèi)部的引號. var msg = "My name is 'zhangsan'"; // 正確, 搭配使用單雙引號var msg = 'My name is "zhangsan"'; // 正確, 搭配使用單雙引號轉(zhuǎn)義字符

有些字符不方便直接輸入, 于是要通過一些特殊方式來表示.

求長度

使用 String 的 length 屬性即可

var a = 'hehe';console.log(a.length);var b = '哈哈';console.log(b.length);結(jié)果:

42單位為字符的數(shù)量

字符串拼接

使用 + 進行拼接

var a = "my name is ";var b = "zhangsan";console.log(a + b);注意, 數(shù)字和字符串也可以進行拼接

var c = "my score is ";var d = 100;console.log(c + d);注意, 要認準相加的變量到底是字符串還是數(shù)字

console.log(100 + 100); // 200console.log('100' + 100); // 100100

boolean 布爾類型

表示 “真” 和 “假”

boolean 原本是數(shù)學中的概念 (布爾代數(shù)).
在計算機中 boolean 意義重大, 往往要搭配條件/循環(huán)完成邏輯判斷.
Boolean 參與運算時當做 1 和 0 來看待.

console.log(true + 1);console.log(false + 1)這樣的操作其實是不科學的. 實際開發(fā)中不應該這么寫.

undefined 未定義數(shù)據(jù)類型

如果一個變量沒有被初始化過, 結(jié)果就是 undefined, 是 undefined 類型

var a;console.log(a)undefined 和字符串進行相加, 結(jié)果進行字符串拼接

console.log(a + "10"); // undefined10undefined 和數(shù)字進行相加, 結(jié)果為 NaN

console.log(a + 10);

null 空值類型

null 表示當前的變量是一個 “空值”.

var b = null;console.log(b + 10); // 10console.log(b + "10"); // null10注意:

null 和 undefined 都表示取值非法的情況, 但是側(cè)重點不同.
null 表示當前的值為空. (相當于有一個空的盒子)
undefined 表示當前的變量未定義. (相當于連盒子都沒有)

5.運算符

JavaScript 中的運算符和 Java 用法基本相同. 此處不做詳細介紹了.

算術運算符

賦值運算符 & 復合賦值運算符

比較運算符

邏輯運算符

用于計算多個 boolean 表達式的值.

位運算

移位運算

6.條件語句

if 語句

基本語法格式

條件表達式為 true, 則執(zhí)行 if 的 { } 中的代碼

// 形式1if (條件) { 語句}// 形式2if (條件) { 語句1} else { 語句2}// 形式3if (條件1) { 語句1} else if (條件2) { 語句2 } else if .... { 語句...} else { 語句N}

三元表達式

是 if else 的簡化寫法.

條件 ? 表達式1 : 表達式2條件為真, 返回表達式1 的值. 條件為假, 返回表達式2 的值.

注意, 三元表達式的優(yōu)先級是比較低的.

switch

更適合多分支的場景.

switch (表達式) { case 值1: 語句1; break; case 值2: 語句2: break; default: 語句N;}用戶輸入一個整數(shù), 提示今天是星期幾

var day = prompt("請輸入今天星期幾: ");switch (parseInt(day)) { case 1: console.log("星期一"); break; case 2: console.log("星期二"); break; case 3: console.log("星期三"); break; case 4: console.log("星期四"); break; case 5: console.log("星期五"); break; case 6: console.log("星期六"); break; case 7: console.log("星期日"); break; default: console.log("輸入有誤");}

7.循環(huán)語句

重復執(zhí)行某些語句

while 循環(huán)

while (條件) { 循環(huán)體;}執(zhí)行過程:

代碼示例1: 打印 1 - 10

var num = 1;while (num <= 10) { console.log(num); num++;}代碼示例2:計算 5 的階乘

var result = 1;var i = 1;while (i <= 5) { result *= i; i++;}console.log(result)

continue

結(jié)束這次循環(huán)

吃五個李子, 發(fā)現(xiàn)第三個李子里有一只蟲子, 于是扔掉這個, 繼續(xù)吃下一個李子.

var i = 1;while (i <= 5) { if (i == 3) { i++; continue; } console.log("我在吃第" + i + "個李子"); i++;}


我在吃第1個李子我在吃第2個李子我在吃第4個李子我在吃第5個李子代碼示例:找到 100 - 200 中所有 3 的倍數(shù)

var num = 100;while (num <= 200) { if (num % 3 != 0) { num++; // 這里的 ++ 不要忘記! 否則會死循環(huán). continue; } console.log("找到了 3 的倍數(shù), 為:" + num); num++;}

break

結(jié)束整個循環(huán)

吃五個李子, 發(fā)現(xiàn)第三個李子里有半個蟲子, 于是剩下的也不吃了.

var i = 1;while (i <= 5) { if (i == 3) { break; } console.log("我在吃第" + i + "個李子"); i++;}


我在吃第1個李子我在吃第2個李子代碼示例: 找到 100 - 200 中第一個 3 的倍數(shù)

var num = 100;while (num <= 200) { if (num % 3 == 0) { console.log("找到了 3 的倍數(shù), 為:" + num); break; } num++;}// 執(zhí)行結(jié)果找到了 3 的倍數(shù), 為:102

for 循環(huán)

for (表達式1; 表達式2; 表達式3) { 循環(huán)體}執(zhí)行過程:

  1. 先執(zhí)行表達式1, 初始化循環(huán)變量
  2. 再執(zhí)行表達式2, 判定循環(huán)條件
  3. 如果條件為 false, 結(jié)束循環(huán)
  4. 如果條件為 true, 則執(zhí)行循環(huán)體代碼.
  5. 執(zhí)行表達式3 更新循環(huán)變量
代碼示例1: 打印 1 - 10 的數(shù)字

for (var num = 1; num <= 10; num++) { console.log(num);}**代碼示例2:**計算 5 的階乘

var result = 0;for (var i = 1; i <= 5; i++) { result *= i;}console.log("result = " + result);

8.數(shù)組

創(chuàng)建數(shù)組

使用 new 關鍵字創(chuàng)建

// Array 的 A 要大寫var arr = new Array();使用字面量方式創(chuàng)建 [常用]

var arr = [];var arr2 = [1, 2, 'haha', false]; // 數(shù)組中保存的內(nèi)容稱為 "元素"注意: JS 的數(shù)組不要求元素是相同類型.

這一點和 C, C++, Java 等靜態(tài)類型的語言差別很大. 但是 Python, PHP 等動態(tài)類型語言也是如此.

獲取數(shù)組元素

使用下標的方式訪問數(shù)組元素(從 0 開始)

var arr = ['小豬佩奇', '小豬喬治', '小羊蘇西'];console.log(arr);console.log(arr[0]);console.log(arr[1]);console.log(arr[2]);arr[2] = '小貓凱迪';console.log(arr);如果下標超出范圍讀取元素, 則結(jié)果為 undefined

console.log(arr[3]); // undefinedconsole.log(arr[-1]); // undefined注意: 不要給數(shù)組名直接賦值, 此時數(shù)組中的所有元素都沒了.

相當于本來 arr 是一個數(shù)組, 重新賦值后變成字符串了.
var arr = ['小豬佩奇', '小豬喬治', '小羊蘇西'];arr = '小貓凱迪';

新增數(shù)組元素

1. 通過修改 length 新增

相當于在末尾新增元素. 新增的元素默認值為 undefined

var arr = [9, 5, 2, 7];arr.length = 6;console.log(arr);console.log(arr[4], arr[5]);2. 通過下標新增

如果下標超出范圍賦值元素, 則會給指定位置插入新元素

var arr = [];arr[2] = 10;console.log(arr)此時這個數(shù)組的 [0] 和 [1] 都是 undefined

3. 使用 push 進行追加元素

代碼示例: 給定一個數(shù)組, 把數(shù)組中的奇數(shù)放到一個 newArr 中.

var arr = [9, 5, 2, 7, 3, 6, 8];var newArr = [];for (var i = 0; i < arr.length; i++) { if (arr[i] % 2 != 0) { newArr.push(arr[i]); }}console.log(newArr);

刪除數(shù)組中的元素

使用 splice 方法刪除元素

var arr = [9, 5, 2, 7];// 第一個參數(shù)表示從下表為 2 的位置開始刪除. 第二個參數(shù)表示要刪除的元素個數(shù)是 1 個arr.splice(2, 1);console.log(arr);// 結(jié)果[9, 5, 7]arr.length, length 使用的時候不帶括號, 此時 length 就是一個普通的變量(稱為成員變量, 也叫屬性)

arr.push(), arr.splice() 使用的時候帶括號, 并且可以傳參數(shù), 此時是一個函數(shù) (也叫做方法)

9.函數(shù)

語法格式

// 創(chuàng)建函數(shù)/函數(shù)聲明/函數(shù)定義function 函數(shù)名(形參列表) { 函數(shù)體 return 返回值;}// 函數(shù)調(diào)用函數(shù)名(實參列表) // 不考慮返回值返回值 = 函數(shù)名(實參列表) // 考慮返回值function hello() { console.log("hello");}// 如果不調(diào)用函數(shù), 則沒有執(zhí)行打印語句hello();// 調(diào)用函數(shù)hello();// 定義函數(shù)function hello() { console.log("hello");}

關于參數(shù)個數(shù)

實參和形參之間的個數(shù)可以不匹配. 但是實際開發(fā)一般要求形參和實參個數(shù)要匹配

  1. 如果實參個數(shù)比形參個數(shù)多, 則多出的參數(shù)不參與函數(shù)運算
sum(10, 20, 30); // 302.如果實參個數(shù)比形參個數(shù)少, 則此時多出來的形參值為 undefined

sum(10); // NaN, 相當于 num2 為 undefined. JS 的函數(shù)傳參比較靈活, 這一點和其他語言差別較大. 事實上這種靈活性往往不是好事.

函數(shù)表達式

另外一種函數(shù)的定義方式

var add = function() { var sum = 0; for (var i = 0; i < arguments.length; i++) { sum += arguments[i]; } return sum;}console.log(add(10, 20)); // 30console.log(add(1, 2, 3, 4)); // 10console.log(typeof add); // function此時形如 function() { } 這樣的寫法定義了一個匿名函數(shù), 然后將這個匿名函數(shù)用一個變量來表示.

后面就可以通過這個 add 變量來調(diào)用函數(shù)了.

JS 中函數(shù)是一等公民, 可以用變量保存, 也可以作為其他函數(shù)的參數(shù)或者返回值.

作用域

某個標識符名字在代碼中的有效范圍.

在 ES6 標準之前, 作用域主要分成兩個

// 全局變量var num = 10;console.log(num);function test() { // 局部變量 var num = 20; console.log(num);}function test2() { // 局部變量 var num = 30; console.log(num);}test();test2();console.log(num);// 執(zhí)行結(jié)果10203010創(chuàng)建變量時如果不寫 var, 則得到一個全局變量.

function test() { num = 100;}test();console.log(num);// 執(zhí)行結(jié)果100另外, 很多語言的局部變量作用域是按照代碼塊(大括號)來劃分的, JS 在 ES6 之前不是這樣的.

if (1 < 2) { var a = 10;}console.log(a);

作用域鏈

背景:

內(nèi)部函數(shù)可以訪問外部函數(shù)的變量. 采取的是鏈式查找的方式. 從內(nèi)到外依次進行查找.

var num = 1;function test1() { var num = 10; function test2() { var num = 20; console.log(num); } test2();}test1();// 執(zhí)行結(jié)果20執(zhí)行 console.log(num) 的時候, 會現(xiàn)在 test2 的局部作用域中查找 num. 如果沒找到, 則繼續(xù)去 test1 中查找. 如果還沒找到, 就去全局作用域查找.

JavaScript 的對象和 Java 的對象的區(qū)別

1. JavaScript 沒有 “類” 的概念

對象其實就是 “屬性” + “方法” .

類相當于把一些具有共性的對象的屬性和方法單獨提取了出來, 相當于一個 “月餅模子”

在 JavaScript 中的 “構造函數(shù)” 也能起到類似的效果.

而且即使不是用構造函數(shù), 也可以隨時的通過 { } 的方式指定出一些對象

在 ES6 中也引入了 class 關鍵字, 就能按照類似于 Java 的方式創(chuàng)建類和對象了.
2. JavaScript 對象不區(qū)分 “屬性” 和 “方法”

JavaScript 中的函數(shù)是 “一等公民”, 和普通的變量一樣. 存儲了函數(shù)的變量能夠通過 ( ) 來進行調(diào)用執(zhí)行.

3. JavaScript 對象沒有 private / public 等訪問控制機制.

對象中的屬性都可以被外界隨意訪問.

4. JavaScript 對象沒有 “繼承”

繼承本質(zhì)就是 “讓兩個對象建立關聯(lián)”. 或者說是讓一個對象能夠重用另一個對象的屬性/方法.

JavaScript 中使用 “原型” 機制實現(xiàn)類似的效果.

例如: 創(chuàng)建一個 cat 對象和 dog 對象, 讓這兩個對象都能使用 animal 對象中的 eat 方法.

通過 __proto__ 屬性來建立這種關聯(lián)關系 (proto 翻譯作 “原型”)

當eat方法被調(diào)用的時候,先在自己的方法列表中尋找, 如果找不到,就去找原型中的方法, 如果原型中找不到, 就去原型的原型中去尋找… 最后找到Object那里, 如果還找不到, 那就是未定義了。

關于原型鏈的內(nèi)容比較復雜, 此處不做過多討論。

5. JavaScript 沒有 “多態(tài)”

多態(tài)的本質(zhì)在于 “程序猿不必關注具體的類型, 就能使用其中的某個方法”.

C++ / Java 等靜態(tài)類型的語言對于類型的約束和校驗比較嚴格. 因此通過 子類繼承父類, 并重寫父類的方法的方式 來實現(xiàn)多態(tài)的效果.

但是在 JavaScript 中本身就支持動態(tài)類型, 程序猿在使用對象的某個方法的時候本身也不需要對對象的類型做出明確區(qū)分. 因此并不需要在語法層面上支持多態(tài).

例如:

在 Java 中已經(jīng)學過 ArrayList 和 LinkedList. 為了讓程序猿使用方便, 往往寫作

List<String> list = new ArrayList<>()然后我們可以寫一個方法:

void add(List<String> list, String s) { list.add(s); }我們不必關注 list 是 ArrayList 還是 LinkedList, 只要是 List 就行. 因為 List 內(nèi)部帶有 add 方法.

當我們使用 JavaScript 的代碼的時候

function add(list, s) { list.add(s)}add 對于 list 這個參數(shù)的類型本身就沒有任何限制. 只需要 list 這個對象有 add 方法即可. 就不必像 Java 那樣先繼承再重寫繞一個圈子.

JavaScript 進階




原出處:CSDN
原作者:阿布~
原文鏈接:https://blog.csdn.net/weixin_46448719/article/details/124383884


關鍵詞:入門

74
73
25
news

版權所有? 億企邦 1997-2025 保留一切法律許可權利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉