1. 程式人生 > >為什麼我要放棄javaScript資料結構與演算法(第一章)—— JavaScript簡介

為什麼我要放棄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就可以在本地執行伺服器。

使用Node.js 搭建伺服器

同樣的還有 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

真值和假值

truefalse在 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。

toNumbertoPrimitive方法都是內部的,並根據以下表格對其進行估值

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 結果
數字 xy數值相同(但不是NaN) true
字串 xy是相同的字元 true
布林值 xy同是false或者true true
物件 xy引用同個物件 true
"x" === true // false
"x" === "x" // true
var person1 = { name: 'John' }
var person2 = { name: 'John' }
person1 === person2 // false 不同的物件

控制結構

條件語句支援 if...elseswitch。迴圈支援 whiledo...whilefor

條件語句

例項:判斷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資料結構與演算法