當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

JavaScript基礎(chǔ)
2021-10-22 16:58:11

1.JS的HelloWorld

  alert('控制瀏覽器彈出一個警告框');

  document.write('向body中輸出一個內(nèi)容');

  console.log('向控制臺輸出一個內(nèi)容');

?

2.JS編寫位置

  可以將JS代碼寫到

    標(biāo)簽的onclick屬性中:<button onclick="alert('你點(diǎn)了我');">點(diǎn)我</button>點(diǎn)擊執(zhí)行

    超鏈接的href屬性中:<a href="javascript:alert('你點(diǎn)了超鏈接');">點(diǎn)我</a>點(diǎn)擊執(zhí)行,可阻止超鏈接的默認(rèn)跳轉(zhuǎn)事件

  以上兩種方式雖然可以,但是他們屬于結(jié)構(gòu)與行為耦合,不方便維護(hù),所以不推薦使用

  寫到script標(biāo)簽中也可以,這種方式稱為:內(nèi)嵌式,與之對應(yīng)的還可以引入外部的js文件:

    <script src="外部js文件路徑"></script>

  這么做的優(yōu)勢是可以在不同的頁面中同時引用,推薦使用。

  PS:script標(biāo)簽一旦用于引入外部文件就不能再在標(biāo)簽中編寫代碼了,即使編寫瀏覽器也會忽略,如果需要可創(chuàng)建一個新script標(biāo)簽。

?

3.JS的基本語法

  /**/? 多行注釋

  //? ? 單行注釋

  被注釋的語句不會執(zhí)行

  JS中嚴(yán)格區(qū)分大小寫;以分號結(jié)尾(英文分號);會自動忽略多個空格和換行;

?

4.字面量和變量

  字面量:都是一些不可改變的值,都是可以直接使用的,但是一般不會直接使用字面量,例如:1 2 3 4 5,

  變量:可以保存字面量,而且變量的值可以任意改變,例如:a=1;

  聲明變量:在JS中可以用var關(guān)鍵字來聲明一個變量,例如:var a=1;

  還可以用letconst關(guān)鍵字定義。詳細(xì)使用說明參考阮一峰的《ECMAScript 6 入門》的let和const命令一章

?

5.標(biāo)識符

  在js中所有的可以由我們自主命名的都可以稱為是標(biāo)識符,例如:變量、函數(shù)名、屬性名都屬于標(biāo)識符,命名規(guī)則參考Java

  PS:JS底層保存的標(biāo)識符實(shí)際上是采用Unicode編碼,所以理論上所有的utf-8中含有的內(nèi)容都可以作為標(biāo)識符

  ? ? ? ? 例如:var 鋤禾日當(dāng)午=789;//但是一般不這么用

?

6.數(shù)據(jù)類型

  數(shù)據(jù)類型指的就是字面量的類型,在JS中一共有七種數(shù)據(jù)類型:

    String? 字符串:文本 ,例:var str = 'hello';var str = "hello";?   

           PS:單雙引號不能混著用,但是雙引號中可以放單引號,單引號中也可以放雙引號,例:'hello."World"!'。

           Base64轉(zhuǎn)碼:btoa():任意值轉(zhuǎn)為 Base64 編碼

                 atob():Base64 編碼轉(zhuǎn)為原來的值

    Number? 數(shù)值 :包括整數(shù)和f浮點(diǎn)數(shù)(小數(shù)),例:var num = 1;var num = 0.1;  

           JS中可以表示的數(shù)字的最大值:Number.MAX_VALUE,最小值:Number.MIN_VALUE,

           超出這兩個范圍的值分別被表示為Infinity-Infinity,表示正無窮大和負(fù)無窮大

          ? 其中NaN是一個特殊值,它是唯一不等于自身的值,且不等于任何值,與任何值的運(yùn)算結(jié)果都是NaN?

          ? 英文全稱是:Not a Number,但是它的類型是Number

          ? PS:

            JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲存,即使整數(shù)也是如此。

            所以,11.0是相同的,是同一個數(shù)。

              1 === 1.0 // true

            這就是說,JavaScript 語言的底層根本沒有整數(shù),所有數(shù)字都是小數(shù)(64位浮點(diǎn)數(shù))。容易造成混淆的是,

            某些運(yùn)算只有整數(shù)才能完成,此時 JavaScript 會自動把64位浮點(diǎn)數(shù),轉(zhuǎn)成32位整數(shù),然后再進(jìn)行運(yùn)算。

            由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。

              0.1 +?0.2 ===?0.3// false

              0.3 / 0.1    // 2.9999999999999996

              (0.3 - 0.2) === (0.2 - 0.1)// false

    boolean? 布爾值:只有兩個:truefalse,分別表示真和假

          undefined、nullfalse、0、NaN、空字符串('')的值都是false,其他的值都是true

    null? 空值

    undefined? 未定義

    Object對象:包括了狹義上的對象、數(shù)組和函數(shù)

      狹義上的對象:Object

        定義:var obj={foo:'Hello',bar:'World'}; 或?var obj={'foo':'Hello','bar':'World'};

        讀?。?code>obj['foo']? 或 obj.foo

        修改:obj['foo'] = 'abc'? 或??obj.foo = 'abc'

        刪除:delete obj.p? // true? 刪除成功,當(dāng)該屬性存在且不能刪除時會返回false

        添加:obj['a'] = '123'? 或? obj.a = '123'

        遍歷:for(var key in obj){console.log('key:'+key);  console.log('value:'+obj[key]);}

        查看一個對象本身的所有屬性:Object.keys(obj);? ?//['foo', 'bar']

        屬性是否存在:in運(yùn)算符:  'foo' in obj; // true  存在返回true,不存在返回false

        with語句:with(obj){foo = '123';  bar = '321'}等同于obj.foo = '123';obj.bar='321'

      數(shù)組:Array

        定義:var array = ['a', 'b', 'c'];

        length屬性:array.length //3   

        讀?。?code>array[0] //'a' 或 array['0'] //'a'

        修改:array[0] = 'aaa'? 或??array['0'] = 'aaa'

        刪除:delete a[2]; //['aaa', 'b']? ?或?? array.length = 2; //['aaa', 'b']

        添加:array.push('c');? //['aaa', 'b', 'c']  

        遍歷:for(var key in array){}forEach()?,for(var i=0;i<array.length;i++){}

        屬性是否存在:in運(yùn)算符:'1' in array;// true?或?1 in array;//true 存在返回true,不存在返回false

               原理:數(shù)組是一個鍵值為索引的對象,可以console.log(array);看看輸出結(jié)果

        數(shù)組常用的幾個函數(shù):

         ?。?)push():該方法可以向數(shù)組的末尾添加一個或多個元素,并返回添加后數(shù)組的長度。

              例:array.push("a")array.push("a","b")

         ?。?)pop():該方法可以刪除數(shù)組的最后一個元素,并返回被刪除的元素。例:array.pop()

          (3)unshift():向數(shù)組的開頭添加一個或多個元素,并返回?cái)?shù)組的長度。

          (4)shift():刪除數(shù)組的第一個元素,并返回被刪除的元素。

        其他函數(shù):

         ?。?)concat():連接兩個或更多數(shù)組,并返回結(jié)果。

              例:arr3 = arr1.concat(arr2) 或?arr4 = arr1.concat(arr2,arr3)

         ?。?)join():把數(shù)組的所有元素融入一個字符串,元素通過指定的分隔父進(jìn)行分隔,默認(rèn)為逗號分隔。

              例:arr = ['a','bc','def']; arr.join();//a,bc,def?

              或? arr = ['a','bc','def']; arr.join('*');//a*bc*def

         ?。?)reverse():顛倒數(shù)組中元素的順序,會改變原數(shù)組。例:arr.reverse();//['def','bc','a']

          (8)slice():接受兩個參數(shù),如 (1, 3)。該方法會從開始參數(shù)選取元素,直到結(jié)束參數(shù)(不包括)為止。

         ?。?)sort():對數(shù)組的元素進(jìn)行排序。排序順序可以按字母或數(shù)字,也可以升序(向上)或降序(向下)。

                默認(rèn)情況下,sort()?方法將按字母和升序?qū)⒅底鳛樽址M(jìn)行排序。

                  var fruits = ["Banana", "Orange", "Apple", "Mango"];

                  fruits.sort();//Apple,Banana,Mango,Orange

                這適用于字符串("Apple" 出現(xiàn)在 "Banana" 之前)。但是,如果數(shù)字按字符串排序,則 "25"

                大于 "100" ,因?yàn)?"2" 大于 "1"。正因?yàn)槿绱?,sort()?方法在對數(shù)字進(jìn)行排序時會產(chǎn)生不正確

                的結(jié)果??梢酝ㄟ^提供“比較函數(shù)”來解決此問題。會改變原數(shù)組。

?                例:按升序?qū)?shù)組中的數(shù)字進(jìn)行排序:

                    var points = [40, 100, 1, 5, 25, 10];

                    points.sort(function(a, b){return a-b});

                  按降序?qū)?shù)組中的數(shù)字進(jìn)行排序:

                    var points = [40, 100, 1, 5, 25, 10];

                    points.sort(function(a, b){return b-a});

         ?。?0)splice():刪除元素,并向數(shù)組添加新元素。

              例:在位置 2,添加新項(xiàng)目,并刪除 1 個項(xiàng)目:

                  var fruits = ["Banana", "Orange", "Apple", "Mango"];

                  fruits.splice(2, 1, "Lemon", "Kiwi");

         ?。?1)forEach():方法按順序?yàn)閿?shù)組中的每個元素調(diào)用一次函數(shù)??捎糜跀?shù)組的遍歷。

            ......

            更多函數(shù)參考《JavaScript數(shù)組參考手冊》

      函數(shù):Function

        聲明:function print(msg){console.log(msg);}? 或? var print = function(msg){console.log(msg);}?

           或? var print = new Function('msg', 'console.log(msg)');//構(gòu)造函數(shù)聲明

           如果同一個函數(shù)被多次聲明,后面的聲明就會覆蓋前面的聲明。

           如果有同名的參數(shù),則取最后出現(xiàn)的那個值。

        調(diào)用:print('打印數(shù)據(jù)');

        關(guān)于return:JavaScript 引擎遇到return語句,就直接返回return后面的那個表達(dá)式的值,后面即使還有語句,

              也不會得到執(zhí)行。也就是說,return語句所帶的那個表達(dá)式,就是函數(shù)的返回值。return語句不是必

              需的,如果沒有的話,該函數(shù)就不返回任何值,或者說返回undefined。

        函數(shù)的屬性:print.name? //'print'  print.length //1,返回函數(shù)參數(shù)的個數(shù),但如有參數(shù)設(shè)置了默認(rèn)值則返回0

              設(shè)置參數(shù)默認(rèn)值:function f(a=1, b){}

              print.toString() //返回函數(shù)的源代碼 :function print(msg){console.log(msg);}

        關(guān)于arguments:

              由于 JavaScript 允許函數(shù)有不定數(shù)目的參數(shù),所以需要一種機(jī)制可以在函數(shù)體內(nèi)部讀取所有參數(shù)。

              這就是arguments對象的由來。arguments對象包含了函數(shù)運(yùn)行時的所有參數(shù),arguments[0]就是第

              一個參數(shù),arguments[1]就是第二個參數(shù),以此類推。這個對象只有在函數(shù)體內(nèi)部,才可以使用。

var f = function (one) {
    console.log(arguments[0]);
    console.log(arguments[1]);
    console.log(arguments[2]);
}

f(1, 2, 3)
// 1
// 2
// 3

              正常模式下,arguments對象可以在運(yùn)行時修改。

var f = function(a, b) {
    arguments[0] = 3;
    arguments[1] = 2;
    return a + b;
}

f(1, 1) // 5

              上面代碼中,函數(shù)f()調(diào)用時傳入的參數(shù),在函數(shù)內(nèi)部被修改成3和2。嚴(yán)格模式下,arguments對象

              與函數(shù)參數(shù)不具有聯(lián)動關(guān)系。也就是說,修改arguments對象不會影響到實(shí)際的函數(shù)參數(shù)。

var f = function(a, b) {
    'use strict'; // 開啟嚴(yán)格模式
    arguments[0] = 3;
    arguments[1] = 2;
    return a + b;
}

f(1, 1) // 2

              上面代碼中,函數(shù)體內(nèi)是嚴(yán)格模式,這時修改arguments對象,不會影響到真實(shí)參數(shù)a和b。

              通過arguments對象的length屬性,可以判斷函數(shù)調(diào)用時到底帶幾個參數(shù)。

function f() {
    return arguments.length;
}

f(1, 2, 3) // 3
f(1) // 1
f() // 0

              PS:arguments是一個對象

    Symbol 表示唯一的值

  可以用typeof來檢測一個變量的類型,語法:typeof 要檢測的值,例:typeof 'hello';  

  PS:typeof null;的結(jié)果是‘Object’;typeof沒法區(qū)分對象和數(shù)組返回的都是Object,可以用instanceof來區(qū)分

  基本數(shù)據(jù)類型:Number、String、boolean、null、undefined、Symbol

?  

7.數(shù)據(jù)類型的轉(zhuǎn)換

? ? ? ? ?強(qiáng)制類型轉(zhuǎn)換

  ? ? ?轉(zhuǎn)String:(1)調(diào)用被轉(zhuǎn)換數(shù)據(jù)類型的toString()方法,該方法不會影響到原變量,它會將轉(zhuǎn)換結(jié)果返回;

          PS:null、undefined沒有toString方法

      ? ?  (2)調(diào)用String()方法,例:String(null);? ? //"null"

?  ? ? 轉(zhuǎn)Number:(1)使用Number()函數(shù),例:Number("123");? //123

       ? ? ?(2)parseInt()函數(shù),把一個字符串轉(zhuǎn)換為一個十進(jìn)制整數(shù);parseFloat()函數(shù),把一個字符串轉(zhuǎn)換為一個十進(jìn)制小數(shù)。

  ? ? ?轉(zhuǎn)Boolean:Boolean()函數(shù),除了0、NaN、空串、null和undefined其他的都是true。

?

?

?

8.運(yùn)算符

  算數(shù)運(yùn)算符:

      加法運(yùn)算符:x + y? ? PS:對象的相加

      減法運(yùn)算符:?x - y

      乘法運(yùn)算符:?x * y

      除法運(yùn)算符:x / y

      指數(shù)運(yùn)算符:x ** y  x的y次方

      余數(shù)運(yùn)算符:x % y

      自增運(yùn)算符:++x?或者?x++

      自減運(yùn)算符:--x?或者?x--

      數(shù)值運(yùn)算符:?+x

      負(fù)數(shù)值運(yùn)算符:-x

      PS:猜猜1 + +"2" + 3=?;

        答案:6;+"2"這里+是做一元運(yùn)算符,會把其他數(shù)據(jù)類型轉(zhuǎn)換為Number,使用原理和Number()函數(shù)一樣,同理-"2" = -2

  比較運(yùn)算符:

      >?大于運(yùn)算符

      <?小于運(yùn)算符

      <=?小于或等于運(yùn)算符

      >=?大于或等于運(yùn)算符

      ==?相等運(yùn)算符    比較值,1=='1'? //true

      ===?嚴(yán)格相等運(yùn)算符? ?比較值和數(shù)據(jù)類型? ? 1==='1'? //false

      !=?不相等運(yùn)算符? ? ? ??

      !==?嚴(yán)格不相等運(yùn)算符? ?

  布爾運(yùn)算符:

      取反運(yùn)算符:!????用于將布爾值變?yōu)橄喾粗担磘rue變成false,false變成true。

      且運(yùn)算符:&&????用于多個表達(dá)式的求值,運(yùn)算規(guī)則是:如果第一個運(yùn)算子的布爾值為true,則返回第二個運(yùn)算子的值

            ? ? ?(注意是值,不是布爾值);如果第一個運(yùn)算子的布爾值為false,則直接返回第一個運(yùn)算子的值,

             ? ? 且不再對第二個運(yùn)算子求值。

             ? ? 這種跳過第二個運(yùn)算子的機(jī)制,被稱為“短路”。有些程序員喜歡用它取代if結(jié)構(gòu),比如下面是一段

             ? ??if結(jié)構(gòu)的代碼,就可以用且運(yùn)算符改寫。

             ? ??if (i) {doSomething();}  等價于  i && doSomething();

             ? ? 上面代碼的兩種寫法是等價的,但是后一種不容易看出目的,也不容易除錯,建議謹(jǐn)慎使用。

      或運(yùn)算符:||? ? 用于多個表達(dá)式的求值,運(yùn)算規(guī)則和且運(yùn)算符相反

      三元運(yùn)算符:?:? ? JS中唯一一個需要三個運(yùn)算子的運(yùn)算符。如果第一個表達(dá)式的布爾值為true,則返回第二個表達(dá)式

              ? 的值,否則返回第三個表達(dá)式的值。

?  二進(jìn)制位運(yùn)算符:

      進(jìn)制或運(yùn)算符(or):符號為|,表示若兩個二進(jìn)制位都為0,則結(jié)果為0,否則為1。

      二進(jìn)制與運(yùn)算符(and):符號為&,表示若兩個二進(jìn)制位都為1,則結(jié)果為1,否則為0。

      二進(jìn)制否運(yùn)算符(not):符號為~,表示對一個二進(jìn)制位取反。

      異或運(yùn)算符(xor):符號為^,表示若兩個二進(jìn)制位不相同,則結(jié)果為1,否則為0。

      左移運(yùn)算符(left shift):符號為<<??  

      右移運(yùn)算符(right shift):符號為>>  

      頭部補(bǔ)零的右移運(yùn)算符(zero filled right shift):符號為>>>  
      PS:位運(yùn)算符只對整數(shù)起作用,如果一個運(yùn)算子不是整數(shù),會自動轉(zhuǎn)為整數(shù)后再執(zhí)行。位運(yùn)算符只對整數(shù)起作用,

        ? 如果一個運(yùn)算子不是整數(shù),會自動轉(zhuǎn)為整數(shù)后再執(zhí)行。

          i = i | 0;

        ??上面這行代碼的意思,就是將i(不管是整數(shù)或小數(shù))轉(zhuǎn)為32位整數(shù)。

        ??利用這個特性,可以寫出一個函數(shù),將任意數(shù)值轉(zhuǎn)為32位整數(shù)。

          function toInt32(x) {return x | 0;}

  其他運(yùn)算符:

      void運(yùn)算符:

          作用是執(zhí)行一個表達(dá)式,然后不返回任何值,或者說返回undefined 例:void(0) // undefined

          主要用途是瀏覽器的書簽工具(Bookmarklet),以及在超級鏈接中插入代碼防止網(wǎng)頁跳轉(zhuǎn)。

?      逗號運(yùn)算符:可用于分隔,例:var a=1, b=2;

          也可用于對兩個表達(dá)式求值,并返回后一個表達(dá)式的值。例:var y = (1, 10);? //10

      運(yùn)算順序:優(yōu)先級;優(yōu)先級高則先計(jì)算;圓括號的優(yōu)先級很高,可以用來提高運(yùn)算的優(yōu)先級;

          js中大部分運(yùn)算符是左結(jié)合,少數(shù)是右結(jié)合(=、?:、**等)

?

本文摘自 :https://www.cnblogs.com/

開通會員,享受整站包年服務(wù)立即開通 >