為什麼我要放棄javaScript資料結構與演算法(第一章)—— JavaScript簡介
資料結構與演算法一直是我算比較薄弱的地方,希望通過閱讀《javaScript資料結構與演算法》可以有所改變,我相信接下來的記錄不單單對於我自己有幫助,也可以幫助到一些這方面的小白,接下來讓我們一起學習。
第一章 JavaScript簡介
眾所周知,JavaScript是一門非常強大的程式語言,不僅可以用於前端開發,也適用於後端開發,其中Node.js就是背後的技術。
JavaScript資料結構與演算法
那麼學習JavaScript資料結構與演算法有什麼作用呢?首要的作用是資料結構和演算法可以高效地解決常見的問題,這影響著程式碼的質量。其次,在計算機科學裡面,演算法是基礎的概念,是面試的時候的重頭戲。
環境搭建
瀏覽器是最簡單的開發環境,下載個Firefox或者Chrome都可以。
下載好瀏覽器之後可以搭載一個Web伺服器,方式有很多種,也都很簡單,可以自行百度。下面介紹Node.js.
使用Node.js 搭建伺服器
首先到Node.js官網下載和安裝Node.js。然後開啟終端應用,輸入一下命令安裝
npm i http-server -g
嫌安裝過程慢的,可以安裝一下淘寶映象,就可以用 cnpm
來安裝,具體安裝過程如下
npm install -g cnpm --registry=https://registry.npm.taobao.org
安裝完淘寶映象後,就可以用 cnpm
cnpm i http-server -g
安裝好 http-server
後,cd
進入到目標路徑後輸入 http-server
就可以在本地執行伺服器。
同樣的還有 anywhere
,也可以達到同樣的目的。
cnpm i anywhere -g
這樣,整個環境就搭建好了。
JavaScript基礎
變數
變數能儲存的資料可以在需要時設定、更新和攝取。賦給變數的值都有對應的型別。
JavaScript的型別有數字、字串、布林值、函式和物件。還有 undefined 和 null,以及陣列、日期和正則表示式。
注意:JavaScript不是強語言型別,跟後面我要學的TypeScript不一樣,這意味著宣告變數的時候不用指定變數的型別
除錯輸出變數值的時候有三種簡單的方法
方法 | 描述 |
---|---|
alert("x") | 將輸出到瀏覽器的警示視窗 |
console.log("x") | 把文字輸出到除錯工具的Console標籤 |
document.write("x") | 直接輸出到HTML頁面裡並被瀏覽器呈現 |
變數作用域
作用域指在編寫的演算法函式時,我們能夠訪問的變數(在使用時,函式作用域也可以是一個函式)。有區域性變數和全域性變數兩種。
操作符
在JavaScript裡有算數操作符、賦值操作符、比較操作符、邏輯操作符、位操作符、一元操作符和其他操作符。
算數操作符
算數操作符 | 描述 |
---|---|
+ | 加法 |
- | 減法 |
* | 乘法 |
/ | 除法 |
% | 取餘 |
++ | 遞增 |
- - | 遞減 |
賦值操作符
賦值操作符 | 描述 |
---|---|
= | 賦值 |
+= | (x += y) == ( x = x + y ) |
-= | (x -= y) == ( x = x - y ) |
*= | (x *= y) == ( x = x * y ) |
/= | (x /= y) == ( x = x / y ) |
%= | (x %= y) == ( x = x % y ) |
比較操作符
比較操作符 | 描述 |
---|---|
== | 相等 |
=== | 全等 |
!= | 不等 |
> | 大於 |
>= | 大於等於 |
< | 小於 |
<= | 小於等於 |
邏輯操作符
邏輯操作符 | 描述 |
---|---|
&& | 與 |
雙豎線 | 或 |
! | 非 |
位操作符
位操作符 | 描述 |
---|---|
& | 與 |
單豎線 | 或 |
~ | 非 |
^ | 異或 |
<< | 左移 |
>> | 右移 |
typeof
操作符可以返回變數或者表示式的型別。
console.log(typeof num); // number
console.log(typeof "num"); // string
console.log(typeof true); // boolean
console.log(typeof [1,2,3]); //object
console.log(typeof {num:"2"}); // object
真值和假值
true
和 false
在 javascript 中的轉換如下表
數值型別 | 轉換成布林值 |
---|---|
undefined | false |
null | false |
布林值 | true或者false |
數字 | +0/-0/NaN都是false其他是true |
字串 | 如果字串是空(長度是0)為false,其他為true |
物件 | true |
相等操作符
型別(x) | 型別(y) | 結果 |
---|---|---|
null | undefined | true |
undefined | null | true |
數字 | 字串 | x == toNumber(y) |
字串 | 數字 | toNumber(x) == y |
布林值 | 任何型別 | toNumber(x) == y |
任何型別 | 布林值 | x == toNumber(y) |
字串或數字 | 物件 | x == toPrimitive(y) |
物件 | 字串或數字 | toPrimitive(x) == y |
如果x和y是相同型別,javaScript會比較它們的值或者是物件值。其他沒有在上述表格中的情況都會返回false。
toNumber
和 toPrimitive
方法都是內部的,並根據以下表格對其進行估值
toNumber
方法對不同型別返回的結果如下表
值型別 | 結果 |
---|---|
undefined | NaN |
null | +0 |
布林值 | true=>1或者false=>+0 |
數字 | 數字對應的值 |
字串 | 將字串解析成數字。如果字串中包含字母,就返回NaN,如果是由數字字元組成的,就轉換成數字 |
物件 | Number(toPrimitive(value)) |
toPrimitive方法對不同型別返回的結果如下:
值型別 | 結果 |
---|---|
物件 | 如果物件的valueOf方法的結果是原始值,返回原始值。如果物件的toString方法返回原始值,就返回這個值,其他情況都返回一個操作。 |
"x" ? true : false // true
"x"(NaN) == true(1) // false
"x"(NaN) == false(+0) // false
那麼 ===
操作符呢?
相比較起來就簡單很多,如果比較的兩個值型別不同,比較的結果就是 false
,如果型別相同,就會根據下面的表格進行判斷。
型別(x) | 值 | 結果 |
---|---|---|
數字 | x和y數值相同(但不是NaN) | true |
字串 | x和y是相同的字元 | true |
布林值 | x和y同是false或者true | true |
物件 | x和y引用同個物件 | true |
"x" === true // false
"x" === "x" // true
var person1 = { name: 'John' }
var person2 = { name: 'John' }
person1 === person2 // false 不同的物件
控制結構
條件語句支援 if...else
和 switch
。迴圈支援 while
、do...while
和 for
。
條件語句
例項:判斷month
1. if...else
if(month === 1){
console.log('January');
}else if(month === 2){
console.log('February');
}...
else{
...
}
2. switch
switch(month){
case 1:
console.log('January');
break;
case 2:
console.log('February');
break;
...
default:
consolo.log(...)
}
3. && 與 || 運算子
(month == 1 && console.log('January')) || (month == 2 && console.log('February')) || ...
4. 三元運算子
month == 1 ? console.log('January') : month == 2 ? console.log('February') : ...
迴圈
處理陣列元素的時候經常會用到迴圈。
例項:輸出0到9
1. for
for(var i = 0;i < 10;i++){
console.log(i);
}
2.while
var i = 0;
while(i<10){
console.log(i);
i++
}
3.do ... while
var i = 0;
do{
console.log(i);
i++:
} while(i<10)
函式
函式在JavsScript中是很重要的。分為用傳引數、return或者是直接呼叫。
JavaScript面向物件程式設計
JavaScript裡的物件就是普通名值對的集合。建立一個普通物件有兩種方式。
// 第一種方式:
var obj = new Object();
// 第二種方式
obj = {
name:{
first:"賴",
last:"xx"
},
address: "jj"
}
可以看出,宣告JavaScript物件的時候,鍵值對中的鍵就是物件的屬性,值就是對應屬性的值。
在面向物件程式設計(OOP)中,物件是類的例項。一個類定義了物件的特徵。我們會建立很多類來表示演算法和資料結構。
// 宣告一個類來表示書
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
// 例項化這個類
var book = new Book('title', 'pages', 'isbn' );
//可以修改或者是訪問物件的屬性
book.title // 書名
book.title = "new title"; //修改書名
// 類可以包含函式,可以宣告和使用函式
Book.prototype.printTitle = function(){
console.log(this.title);
}
book.printTitle();
// 也可以直接在類的定義裡宣告函式
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
this.printIsbn = function() {
console.log(this.isbn);
}
}
book.printIsbn();
注意:在原型的例子裡, printTitle
函式只會建立一次,在所有例項中共享。如果在類的定義裡宣告,則每個例項都會建立自己的函式副本。使用原型方法可以節約記憶體和降低例項化的開銷。不過原型方法只能宣告公共函式和屬性,而類定義可以宣告只在類內部訪問的私有函式和屬性。
除錯工具
Firefox 和 Chrome 都支援除錯。這裡有一個瞭解 谷歌開發者工具的好教程,可以自己瞭解一下。
ECMAScript概述
ECMAScript是一種語言的規範,具體想知道的可以 點選這裡
ECMAScript6的功能
因為在別的地方有做了更詳細的筆記,在這裡就不累述,詳情點選下面。
補充:使用類進行面向物件程式設計
function Book(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
Book.prototype.printTitle = function() {
console.log(this.title);
}
ES6:
class Book {
constructor(title, pages, isbn){
this.title = title;
this.pages = pages;
this.isbn = isbn;
}
printTitle(){
console.log(this.title);
}
}
繼承
除了新的宣告類的方式,類的繼承也有簡化的語法。
clas ITBook extends Book {
constructor(title, pages, isbn, technology){
super(title, pages, isbn);
this.technology = technology;
}
printTitle(){
console.log(this.title);
}
}
我們可以用 extends
關鍵字擴充套件一個類並繼承它的行為,在建構函式中,我們可以通過 super
關鍵字引用父類的建構函式。
小結
本章主要講了如何搭建簡單的開發環境,也稍微地把javaScript基礎知識、和ECMAScript6過了一遍,為接下來的資料結構——陣列做鋪墊。
書籍連結: 學習JavaScript資料結構與演算法