1. 程式人生 > >從零開始,學習web前端之js基礎

從零開始,學習web前端之js基礎

js來源
Javascript作為web標準中的行為標準,最初起名叫LiveScript,它是Netscape開發出來一種指令碼語言,其目的是為了擴充套件基本的Html的功能,驗證web頁表單資訊,為web頁增加動態效果。為了趕上java的熱潮,Netscape和Sun公司一起開發了一種新的指令碼語言,他的語法和Java非常的類似,所以更名為:Javascript。

js歷史
因為 JavaScript 1.0 非常成功,成為web的必備元件,Netscape 在 Netscape Navigator 3.0 中釋出了 1.1 版。恰巧那個時候,微軟決定進軍瀏覽器,釋出了 IE 3.0 並搭載了一個 JavaScript 的克隆版,叫做 JScript。微軟步入 Web 瀏覽器領域的這重要一步雖然令其聲名狼藉,但也成為 JavaScript 語言發展過程中的重要一步。
在微軟進入後,有 3 種不同的 JavaScript 版本同時存在:Netscape Navigator 3.0 中的 JavaScript、IE 中的 JScript 以及 CEnvi 中的 ScriptEase。與 C 和其他程式語言不同的是,JavaScript 並沒有一個標準來統一其語法或特性,而這 3 中不同的版本恰恰突出了這個問題。隨著業界擔心的增加,這個語言的標準化顯然已經勢在必行。

ECMAScript
ECMAScript是一種由Ecma國際前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association。
正是因為JavaScript 並沒有一個標準來統一其語法或特性,所以歐洲的這個ECMA的組織,牽頭制定JavaScript的標準,取名為ECMAScript。
簡單來說ECMAScript不是一門語言,而是一個標準。符合這個標準的比較常見的有:JavaScript、Action Script(Flash中用的語言)。
ECMAScript是標準,javascript是實現

JS組成
JS = ECMAScript + DOM + BOM

ECMAScript(前身為歐洲計算機制造商協會)
JavaScript的語法規範
DOM(Document Object Model 的簡稱)
JavaScript操作網頁上元素的API
BOM(Browser Object Model 的簡稱)
JavaScript操作瀏覽器部分功能的API

引入方式
內嵌式:直接在html文件中編寫js程式碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title
>
</head> <body> </body> </html> <script> alert("hello") </script>

外鏈式:鏈入一個外js檔案

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
</html>
<script type="text/javascript" src="js/index.js" ></script>

輸出訊息的幾種方式

alert()  在頁面彈出一個對話方塊,早期JS除錯使用。
confirm()  在頁面彈出一個對話方塊, 常配合if判斷使用。
console.log()  將資訊輸入到控制檯,用於js除錯。
prompt() 彈出對話方塊,用於接收使用者輸入的資訊。
document.write()在頁面輸出訊息,不僅能輸出資訊,還能輸出標籤。

示例:

alert("hello");

這裡寫圖片描述

confirm("關閉瀏覽器?");

這裡寫圖片描述

console.log("hello");

按F12選擇console或控制檯可以看見
這裡寫圖片描述

prompt("姓名");

這裡寫圖片描述

document.write("hello")
document.write("<h1>hello</h1>")

這裡寫圖片描述

變數

會變化的量。
變數是用來儲存資料的容器。

命名規則
駝峰命名規則:userName
遵從規則:
1.變數命名必須以字母或是下標符號”_”或者”$”為開頭。
2.變數名長度不能超過255個字元。
3.變數名中不允許使用空格,首個字不能為數字。
4.不用使用指令碼語言中保留的關鍵字及保留符號作為變數名。
5.變數名區分大小寫。(javascript是區分大小寫的語言)

定義變數

var name;//定義變數

給變數賦值

var name;//定義變數
name="yzq"//給變數賦值

定義並賦值
在實際的開發中我們一般在定義變數的時候直接賦值

var name="yzq"  =號是賦值運算子

資料型別

簡單資料型別

  • 數值型別 number
  • 字串型別 String
  • 布林型別 boolean
  • 未定義 undefined

number

進位制
常用的進位制

  • 二進位制 基數為2,逢2進1
  • 八進位制 基數為8,逢8進1
  • 十進位制 滿10進1
  • 十六進位制 由0-9,A-F組成,字母不區分大小寫。

浮點數
因為精度丟失問題,所以不要判斷計算後的兩個浮點數是否相等。

示例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var num=0.07;
            console.log(num*100);//輸出的值為7.000000000000001
        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

數值範圍
由於記憶體的限制,ECMAScript 並不能儲存世界上所有的數值
最小值:Number.MIN_VALUE,這個值為: 5e-324
最大值:Number.MAX_VALUE,這個值為: 1.7976931348623157e+308
無窮大:Infinity
無窮小:-Infinity

示例:

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

        <script>
            console.log(Number.MAX_VALUE);
            console.log(Number.MIN_VALUE)
            console.log(1/0);
            console.log(-1/0);
        </script>

    </head>
    <body>

    </body>
</html>

這裡寫圖片描述
NaN
Not a Number的簡寫

console.log(“abc”/18);  //結果是NaN

Undefined和任何數值計算都為NaN;
NaN 與任何值都不相等,包括 NaN 本身
isNaN() :任何不能被轉換為數值的值都會導致這個函式返回 true

isNaN(NaN);// true
isNaN(“blue”); // true
isNaN(123); // false

示例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var a="aaaa"/11;
            console.log(a);
            console.log(isNaN(a));//true
            console.log(isNaN(NaN));//true
            console.log(isNaN(123));//false

        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

String

定義方式
用引號時,可單可雙,不可一單一雙。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var a="hello";
            var b='hello';
            console.log(a);
            console.log(b);
        </script>
    </head>
    <body>
    </body>
</html>

轉義符
無法輸出的字元,先輸出/,再輸出字元。
例:想在雙引號中輸出雙引號,需要轉義符

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var a="h'el'lo";
            var b='h、/"el\lo';      
            var c="aaaa\"dsd\'sa";//這裡雙引號需要轉義符
            console.log(a);
            console.log(b);
            console.log(c);
        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

字串拼接
通過+拼接字串

示例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var a="hello";
            var b="world";
            console.log(a+" "+b);

        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

字串不可變
字串比較特殊,一旦給值後就無法再修改他的值。如果再賦值,相當於重新建立的一個String物件,而原有的字串會被回收。

Boolean

boolean型別有兩個字面量:true和false,區分大小寫。(大寫不對)
雖然Boolean 型別的字面值只有兩個,但 ECMAScript 中所有型別的值都有與這兩個 Boolean 值等價的值

注意:
true,任何非0數字,任何字串,任何物件都可以表示true。
例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            var a=2;
            if (a){
                alert(a);
            }else {
                alert("false")
            }
        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

false、0 、“”、undefined 、null為false
例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            if (""){
                alert(true);
            }else {
                alert("false")
            }
        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述
if判斷時會把()內的值強行轉換成boolean型別進行判斷。

undefined和null
null和undefined有很大的相似性。
null == undefined的結果(true)也就更加能說明這點。但是null ===undefined的結果(false)。
不過相似歸相似,還是有區別的,就是和數字運算時,10 + null結果為:10;10 + undefined結果為:NaN。
任何資料型別和undefined運算都是NaN;
任何值和null運算,null可看做0運算。

資料型別轉換

轉換成字串型別

  1. 變數+“” 或者 變數+“abc”
  2. String(變數)
  3. 變數.toSting() 注意:undefined和null不可以,Null和undefined無toString方法。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            a=111;
            console.log(typeof(a+""));
            console.log(typeof(a+"sdas"));
            console.log(typeof(a+"sdas"));
            console.log(typeof String(a));
            console.log(typeof (a.toString()))
        </script>
    </head>
    <body>
    </body>
</html>

這裡寫圖片描述

轉換為number型別

1)變數-*/一個數字(有非數字字元會出現NaN)

    <script>
            var a="1";
            console.log(a-0); //1
            console.log(typeof (a-0));//number
            console.log(a/1);//1
            console.log(typeof (a-1));//number
            console.log(a*1);//1
            console.log(typeof (a*1));//number

            console.log("1aa"-1);//NaN
        </script>

2) Number(變數)(有非數字字元會出現NaN)

    <script>
        var a = "1.4";
        console.log(Number(a)); //1.4
        console.log(typeof Number(a));//number
        console.log(Number(true))//1
        console.log(Number(false));//0
        console.log(Number("1aa"));//NaN
    </script>

需要注意的是:
Number(“”)返回0
console.log(Number(true))返回1
console.log(Number(false));返回0

3) parseInt()和parseFloat()(譯為取整和取浮點數)

        var a = "1.4";
        console.log(parseInt(a)); //1
        console.log(typeof parseInt(a));//number
        console.log(parseInt(true))//NaN
        console.log(parseInt(false));//NaN
        console.log(parseInt("1aa"));//1
        console.log(parseFloat("1.221aaa"));//1.221

注意:
parseInt(“”)和parseFloat(“”)返回NaN
parseInt(變數):如果變數中收割字元為字母則結果為NaN,否則取出現首個非數字前的整數。
parseFloat(變數):如果變數中收割字元為字母則結果為NaN。否則取出現首個非數字前的浮點數。(沒有小數取整)

轉換為boolean型別
任何資料型別都可以轉換成boolean型別
1)Boolean(變數);

    <script>
        console.log(Boolean("111"));//true
        console.log(Boolean(0));//false
        console.log(Boolean(1));//true
    </script>

2)!!變數(兩個感嘆號 變數)

        console.log(!1);//false
        console.log(!!1);//true
        console.log(!0);//true
        console.log(!!0);//false

第一個邏輯非操作 會基於無論什麼運算元返回一個與之相反的布林值
第二個邏輯非操作 則對該布林值求反
於是就得到了這個值真正對應的布林值

操作符

操作符種類
一、算數運算子(+—*/…)
a) 一元運算子:正號、負號、++、–、平方等一個變數就能運算
b) 二元運算子:+-*/%等兩個變數才能運算
c) 三元運算子: 值1?值2:值3;

二、邏輯運算子( ||&& ! )(或且非)
三、比較運算子(<、>、==、>=…)
四、賦值運算子(=、+=、-=、*=、/=、%=)

優先順序

優先順序從高到底
() 優先順序最高
一元運算子 ++ – !
算數運算子 先* / % 後 + -
關係運算符 > >= < <=
相等運算子 == != === !==
邏輯運算子 先&& 後||

&&和||運算

1)&&連結兩個boolean型別,有一個是false結果就是false。兩個都為true時才為true。
2)||連結兩個boolean型別,有一個是true結果就是true。兩個都為false時才為false。

 console.log(false && true);//false
 console.log(true && true);//true
 console.log(false || true);//true
 console.log(false || false);//false

流程控制

選擇結構

if語句
If語句用法有三種
1.if(條件1){程式1}
2.if(條件1){程式1}else{程式2}
3.if(條件1){程式1}else if(條件2){程式2}…else{程式n}

if 語句 - 只有當指定條件為 true 時,使用該語句來執行程式碼
if…else 語句 - 當條件為 true 時執行程式碼,當條件為 false 時執行其他程式碼
if…else if….else 語句 - 使用該語句來選擇多個程式碼塊之一來執行

示例:

    <script>
        var a=1;
        if (a==1){
            alert(1);
        }else if(a==2) {
            alert(2);
        }else if (a==3){
            alert(3);
        }
    </script>

這裡寫圖片描述

switch
語法

switch(n)
{
case 1:
  執行程式碼塊 1
  break;
case 2:
  執行程式碼塊 2
  break;
default:
  n 與 case 1case 2 不同時執行的程式碼
}

工作原理:首先設定表示式 n(通常是一個變數)。隨後表示式的值會與結構中的每個 case 的值做比較。如果存在匹配,則與該 case 關聯的程式碼塊會被執行。使用 break 來阻止程式碼自動地向下一個 case 執行。
注意:
break可以省略,如果省略,程式碼會繼續執行下一個case
switch 語句在比較值時使用的是全等(===)操作符,因此不會發生型別轉換
(例如,字串 “10” 不等於數值 10)。

        var a = 1;
        switch (a) {
            case "1":
                console.log("字串1")
                break;
            case 1:
                console.log(1);
                break;

            default:
                console.log("default");
                break;
        }

這裡寫圖片描述

迴圈結構

for 迴圈
語法:
for (語句 1; 語句 2; 語句 3)
{
被執行的程式碼塊
}
語句 1 在迴圈(程式碼塊)開始前執行
語句 2 定義執行迴圈(程式碼塊)的條件
語句 3 在迴圈(程式碼塊)已被執行之後執行

示例:

    <script>

       for(var i=0;i<10;i++){
           console.log(i);
       }
    </script>

這裡寫圖片描述

for(;;){程式} 死迴圈;

while
語法
while (條件)
{
需要執行的程式碼
}
While 迴圈會在指定條件為真時迴圈執行程式碼塊。
示例

    <script>
        var i=0;

       while (i<5){
           i++;
           console.log(i);
       }
    </script>

這裡寫圖片描述

死迴圈:
while(true){
}

do..while
語法:
do
{
需要執行的程式碼
}
while (條件);

do/while 迴圈是 while 迴圈的變體。該迴圈會執行一次程式碼塊,在檢查條件是否為真之前,然後如果條件為真的話,就會重複這個迴圈。

示例:

    <script>
        var i = 0;
        do {
            console.log(i)
        } while (i > 0);
    </script>

這裡寫圖片描述

break和continue
break : 立刻跳出迴圈,不再執行該迴圈中的任何程式;
示例

    <script>
        var i=0;
      while (true){
          if (i==3){
              break;
          }
          i++;
          console.log(i);
      }
    </script>

這裡寫圖片描述

continue : 跳出本次迴圈,進入下一次迴圈中繼續執行程式;
示例:

    <script>
        for (var i = 0; i < 10; i++) {
            if (i == 5)continue
            console.log(i);
        }
    </script>

這裡寫圖片描述

陣列

陣列是一種資料型別,可以儲存多個數據。

陣列的定義
1.字面量定義

var arr={1,2,3};

2.物件定義

var  arr  =  new Array(引數);
引數位置一個數值時為陣列長度,多個數值時為陣列中的元素。

陣列的操作
獲取陣列的長度
陣列的長度 = 陣列名.length;
可以通過修改陣列的長度來改變陣列中元素的個數,如果改小了,陣列從後面刪除元素。(偽陣列的長度可以修改,但是不能修改裡面的元素)

    <script>
        var arr = new Array(1, 2, 3, 4, 5, 6);
        console.log(arr.length);
        console.log(arr);
        arr.length = 3;
        console.log(arr.length);
        console.log(arr);

    </script>

這裡寫圖片描述

獲取陣列元素
陣列中的指定元素 = 陣列名[索引值];
陣列的索引代表的是陣列中的元素在陣列中的位置,從0開始。
如果獲取陣列中元素是,陣列名[索引值],沒有指定索引(元素沒那麼多),系統不報錯,而是給定值為undefined;

示例:

    <script>
        var arr = [1, 2, 3, 4, 5];
        console.log(arr[0]);//1
        console.log(arr[3]);//4
        console.log(arr[5]);//undefined
    </script>

遍歷陣列
遍歷陣列就是獲取陣列中每一個元素
一般通過for迴圈來遍歷陣列

示例:

    <script>
        var arr = [1, 2, 3, 4, 5];
        for (var i = 0; i < arr.length; i++) {
            console.log(arr[i]);
        }
    </script>

這裡寫圖片描述

函式

函式是什麼
函式就是可重複使用的程式碼塊。

函式的定義
函式就是包裹在花括號中的程式碼塊,前面使用了關鍵詞 function:

function functionname()
 {
執行程式碼
}

當呼叫該函式時,會執行函式內的程式碼。
可以在某事件發生時直接呼叫函式(比如當用戶點選按鈕時),並且可由 JavaScript 在任何位置進行呼叫。
JavaScript 對大小寫敏感。關鍵詞 function 必須是小寫的,並且必須以與函式名稱相同的大小寫來呼叫函式

示例:

    <script>
        /*定義函式*/
        function fn() {
            alert("我是個函式")
        }
        /*呼叫函式*/
        fn();
    </script>

引數

1)形參
形式上參與運算的變數,無實際值,為實參佔位置,就像一`個軀殼一樣。(可以理解為函式的內部變數外部無法訪問)
2)實參
實際參與運算的變數。形參為他佔位置,真實參與運算的變數。

        /*定義函式*/
        function sum(a,b) {
          console.log(a+b);
        }
        /*呼叫函式*/
        sum(1,2);//傳入實際引數

這裡寫圖片描述

返回值
有時,我們會希望函式將值返回呼叫它的地方。通過使用 return 語句就可以實現。在使用 return 語句時,函式會停止執行,並返回指定的值。

    <script>
        /*定義函式*/
        function add(a, b) {
            return a + b;//將計算後的值返回
        }
        /*呼叫函式*/
        var sum = add(1, 2);//傳入實際引數
        console.log(sum);//3
    </script>

注意
1. 如果函式沒有顯示的使用 return語句 ,那麼函式有預設的返回值:undefined
2. 如果函式使用 return語句,那麼跟在return後面的值,就成了函式的返回值
3. 如果函式使用 return語句,但是return後面沒有任何值,那麼函式的返回值 也是:undefined
4. 函式使用return語句後,這個函式會在執行完 return 語句之後停止並立即退出,也就是說return後面的所有其他程式碼都不會再執行。

變數和作用域(函式中的變數需要函式執行後才能使用)

全域性變數(成員變數)
哪裡都可以訪問到的變數。(進入script立即定義的變數和沒有var的變數)

區域性變數
函式內部的變數,只有函式內部可以訪問到。(函式內部用var定義的變數和形參)

    <script>
        var a = "111";//全域性變數
        b = "222"//全域性變數
        function fn() {
            var c = "333";//區域性變數
            d = "444";//全域性變數
        }
        fn();//函式內的變數必須先初始化(呼叫函式),然後才能訪問
        console.log(a);//111
        console.log(b);//222
        console.log(c);//訪問不到,c是區域性變數
        console.log(d);//444
    </script>

隱式全域性變數

隱式全域性變數就是隱藏的全域性變數不好被發現。
示例

function  fn(){
var  a  =  b  =  c  =  1;   // b和c就是隱式全域性變數(等號)
var  a = 1;  b = 2;  c = 3;     // b和c就是隱式全域性變數(分號)
var  a = 1 ,  b = 2 ,  c = 3;    // b和c就不是隱式全域性變數(逗號)
}

預解析
js的解析器在頁面載入的時候會檢查語法是否有錯誤,並提升變數宣告。

    <script>
        console.log(aaa);//這裡會輸出undefined
        var aaa=1;
    </script>

在頁面載入時,解析器會提升變數宣告,但不會提升值
上面的程式碼在解析過後相當於:

    <script>
        var aaa;
        console.log(aaa);//這裡會輸出undefined
        aaa=1;
    </script>

物件

什麼是物件
JavaScript 中的所有事物都是物件:字串、數值、陣列、函式……
此外,JavaScript 允許自定義物件。
物件具有一定的特性和行為。
javascript是基於物件的語言。只能創建出一類物件(都是Object型別);

物件的屬性和方法
屬性是與物件相關的值。
方法是能夠在物件上執行的動作。

訪問物件的屬性
語法
objectName.propertyName

訪問物件的方法
語法
objectName.methodName()

建立物件的方法
1.通過new Object建立

    <script>
        /*建立物件*/
        var person = new Object();
        /*定義屬性*/
        person.name = "yzq";
        person.age = 23;
        /*定義方法*/
        person.work = function () {
            console.log("工作");
        }
        /*呼叫物件的屬性和方法*/
        console.log(person.name);
        person.work();

    </script>

這裡寫圖片描述

2.物件字面量

    <script>
        /*字面量物件*/
        var p = {
            name: "yzq",
            age: 23,
            work: function () {
                console.log("工作");
            }
        }

        console.log(p.age);
        p.work();
    </script>

3.通過函式構造物件

    <script>
        function person(name, age) {
            this.name = name;
            this.age = age;
            this.work = work;
            function work() {
                console.log("工作");
            }
        }

        var p = new person("yzq", 23);
        console.log(p.name);
        p.work();
    </script>

這裡寫圖片描述

this關鍵字
this只出現在函式中。
誰呼叫函式,this就指的是誰。

示例:

        function test() {
            console.log(this);
        }
        test();  //window.test();
        //上面的this是window,實際是window呼叫test()

        /*字面量物件*/
        var p = {
            name: "yzq",
            age: 23,
            changeName: function (newName) {
                this.name = newName;
            }
        }

        p.changeName("喻志強");//changeName中的this就是p
        console.log(p.name);//輸出 喻志強

        // 建構函式中的this始終是new的當前物件

javascript中的內建物件

javascript給我們提供了很多內建物件,我們可以直接呼叫這些物件的屬性和方法。
參考網站

如果你覺得本文對你有幫助,麻煩動動手指頂一下,算是對本文的一個認可。也可以關注我web前端的部落格專欄,我會不定期的更新,如果文中有什麼錯誤的地方,還望指正,謝謝!