免费 无码进口视频|欧美一级成人观看|亚洲欧美黄色的网站|高清无码日韩偷拍|亚太三区无码免费|在找免费看A片色片一区|激情小说亚洲精品|91人妻少妇一级性av|久久国产综合精品日韓|一级美女操逼大片

學(xué)習(xí)方法

javascript知識點

時間:2022-10-05 18:24:02 學(xué)習(xí)方法 我要投稿
  • 相關(guān)推薦

javascript知識點

  學(xué)習(xí)javascript要掌握哪些知識點?下面是小編整理的一些javascript知識點,希望對你有幫助。

javascript知識點

 

  ECMAScirpt中的變量,函數(shù)名,操作符都區(qū)分大小寫。

  標(biāo)識符

  標(biāo)識符指的可能是:

  變量名

  函數(shù)名

  屬性名

  函數(shù)的參數(shù)

  標(biāo)識符的名稱:

  第一個字符只能是字母,下劃線_,或者美元符號$;

  其他的可以是字母,數(shù)字,下劃線_,或者美元符號$。

  按照慣例,標(biāo)識符名稱應(yīng)使用駝峰法,即首字母小寫,剩下的每個單詞首字母大寫。

  不能把關(guān)鍵字、保留字、TRUE、FALSE、NULL作為標(biāo)識符名稱。

  注釋:

  //單行注釋

  /*

  多行注釋

  多行注釋

  */

  嚴(yán)格模式:

  ES5引入了嚴(yán)格模式,嚴(yán)格模式下,某些舊版本(ES3)的一些不確定行為將得到處理,而對某些不安全的操作也會拋出錯誤。支持嚴(yán)格模式的瀏覽器:IE10+ Firefox 4+ Safari 5.1+ Opera 12+ Chrome

  //在整個腳本中引入嚴(yán)格模式,則在script標(biāo)簽頂部或者*.js文件頂部添加如下代碼即可。

  "use strict";

  //在指定函數(shù)中引入嚴(yán)格模式:

  function f1(){

  "use strict";

  //TODO...

  };

  TODO : 引入了嚴(yán)格模式與沒引入嚴(yán)格模式的js文件如何解決沖突以及共存?

  語句:

  ES中的語句以一個分號結(jié)尾,省略分號雖然有效但不推薦。

  var sum = 1 + 2;

  關(guān)鍵字與保留字:

  // 關(guān)鍵字

  break case catch continue debugger default delete do instanceof else new finally return for switch function this if throw in try typeof var void while with

  // ES3定義的保留字

  abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile

  //ES5中非嚴(yán)格模式下的保留字縮減為這些:

  class enum extends super const export import

  //ES5中嚴(yán)格模式下的相對非嚴(yán)格模式增加的保留字,其中l(wèi)et與yield是新增的。

  implements interface let package private protected public static yield

  //實際開發(fā)中,建議將ES3定義的保留字外加新增的let與yield作為參考。

  需要注意的是,ES5的嚴(yán)格模式下, eval 與 arguments 也不能作為標(biāo)識符與屬性名,否則會拋出錯誤。

  變量:

  ES中的變量是松散類型的,即變量可以保存任何類型的數(shù)據(jù)。

  定義變量使用 var 操作符,后跟變量名(即一個標(biāo)識符),

  使用 var 操作符定義的變量會成為該作用域下的局部變量,該變量在函數(shù)退出之后就會被銷毀:

  var a; //定義一個名為a的變量,值是undefined

  var b = null; //定義一個名為b的變量,值為null(空)

  var c = 'percy'; //定義一個名為c的變量,值為字符串“percy”

  function f1(){

  var name = 'jon'; //函數(shù)f1()下的局部變量

  alert(name);

  }

  f1(); //jon

  alert(name); //外部不能直接訪問函數(shù)的內(nèi)部變量

  //使用一條語句定義多個變量,用逗號分隔即可。

  var name='jon', age=25, isMarried=false;

  數(shù)據(jù)類型:

  ES中有

  5種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型): Undefined 、 Null 、 Boolean 、 Number 、 String

  1種復(fù)雜數(shù)據(jù)類型: Object

  檢測給定變量的數(shù)據(jù)類型 —— typeof 操作符

  返回值:

  undefined ——給定的值未定義;

  boolean ——給定的值是布爾值;

  string ——給定的值是字符串;

  number ——給定的值是數(shù)值;

  object ——給定的值是對象或者 null ;

  function ——給定的是函數(shù);

  function f2(){

  console.log('Hi!');

  }

  var name = 'jon';

  var age = 25;

  alert(typeof f2); //function

  alert(typeof name); //string

  alert(typeof age); //number

  ES數(shù)據(jù)類型之 Undefined 類型

  只有一個值: undefined

  var name;

  /*var name = undefined;*/ //無需把變量顯式設(shè)置undefined值

  alert(name == undefined); //true

  變量的值為undefined與未聲明的變量并不一樣,但使用 typeof 操作符均會返回undefined,但輸出值時未聲明的變量會產(chǎn)生錯誤:

  var job; //該變量已聲明但未賦值,默認(rèn)值為undefined

  // var name2; 該變量并未聲明

  alert(typeof job); //測試變量類型,輸出undefined

  alert(typeof name2); //測試變量類型,即使變量未聲明也會輸出undefined

  //輸出值時

  alert(job); //undefined

  alert(name2); //產(chǎn)生錯誤:Uncaught ReferenceError: name2 is not defined

  ES數(shù)據(jù)類型之 Null 類型

  只有一個值: null ;

  undefined 值派生自 null 值,所以用 == 測試兩者時會返回 true ;

  null 值表示一個空對象指針,所以使用 typeof 操作符時會返回 object ;

  如果創(chuàng)建的變量將來用于保存對象,那么初始聲明該變量時應(yīng)把值設(shè)置為 null ;

  var name = null;

  alert(typeof name); //object

  ES數(shù)據(jù)類型之 Boolean 類型

  有兩個值: true 、 false ;

  //注意Boolean類型字面值是區(qū)分大小寫的,True、False以及其他大小寫混合的形式均不屬于Boolean類型值;

  var isBoy = true;

  var isGirl = false;

  使用 Boolean() 函數(shù)把其他值轉(zhuǎn)為Boolean值

  var name = 'jon';

  var nameBool = Boolean(name); //true

  轉(zhuǎn)換規(guī)則如下表:

  數(shù)據(jù)類型 轉(zhuǎn)為true的值 轉(zhuǎn)為false的值

  Boolean true false

  String 任何非空字符串 “”(空字符串)

  Number 任何非零數(shù)值(包括無窮大) 0,NaN

  Object 任何對象 null

  Undefined 不適用 undefined

  轉(zhuǎn)換規(guī)則對于流程控制語句自動執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換非常重要:

  var name = 'jon';

  if(name){ //name轉(zhuǎn)換為true,執(zhí)行下面的語句

  alert('name is defined!');

  }

  ES數(shù)據(jù)類型之 Number 類型

  TODO

  ES數(shù)據(jù)類型之 String 類型

  TODO

  ES數(shù)據(jù)類型之 Object 類型

  TODO

  變量, 作用域, 垃圾收集(內(nèi)存問題)

  基本類型和引用類型

  ES中的變量包含 基本類型值 和 引用類型值

  基本類型值 指的是簡單的數(shù)據(jù)段

  引用類型值 值那些可能有多個值構(gòu)成的對象

  五種基本數(shù)據(jù)類型( Undefined, Null, Boolean, Number, String )的值即 基本類型值 是按 值 訪問的, 因此操作的是保存在變量中實際的值

  引用類型值 是保存在內(nèi)存中的對象,ES不允許直接訪問內(nèi)存中的位置, 即不能直接操作對象的內(nèi)存空間. 在操作對象時, 實際上是在操作對象的引用而不是實際的對象.

  當(dāng)復(fù)制保存在對象中的某個變量時, 操作的是 對象的引用 . 但在為對象添加屬性時, 操作的是 實際的對象 .

  動態(tài)的屬性

  定義基本類型的值和引用類型的值方式是基本一樣的, 就是 創(chuàng)建一個變量, 然后為該變量賦值 .

  創(chuàng)建變量以后,基本類型的值和引用類型的值執(zhí)行的操作有很大不同.

  //引用類型可以為其添加或刪除屬性和方法

  var p = new Object();

  p.name = "Jon";

  console.log(p.name); //Jon

  delete p.name;

  console.log(p.name); //undefined

  //基本類型不能添加屬性, 因為即使添加了也不能訪問

  var n = "Jon"; //一個string字符串類型

  n.age = 25;

  console.log(n.age); //undefined

  復(fù)制變量值

  復(fù)制基本類型值的變量值與復(fù)制引用類型值的變量值也存在不同.

  復(fù)制 基本類型值 時, 是直接創(chuàng)建新值, 占據(jù)不同的內(nèi)存(棧)空間, 復(fù)制之后兩個變量可以參與任何操作而不互相影響

  var n1 = 5;

  var n2 = n1; //復(fù)制n1

  復(fù)制 引用類型值 時, 同樣也會把儲存在變量對象中的值復(fù)制一份到新變量分配的空間中, 但這個新變量的值其實是一個指針, 指向儲存在堆中的一個對象. 所以兩者引用的是同一個對象. 所以, 改變其中一個變量, 另一個變量也會受到影響.

  var o1 = new Object();

  var o2 = o1;

  o1.name = 'Jon';

  console.log(o2.name); //o1和o2指向的是堆內(nèi)存中的同一個對象, 所以同樣會輸出Jon

  參數(shù)傳遞

  ES中所有函數(shù)的參數(shù)都是按 值 傳遞的,不存在 引用 傳遞的參數(shù)

  函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù), 就等于把值從一個變量復(fù)制到另一個變量一樣.

  基本類型值 的傳遞就像基本類型變量的復(fù)制一樣, 向參數(shù)傳遞 基本類型值 的時候, 被傳遞的值會被復(fù)制給一個局部變量(即命名參數(shù), 用ES的概念來說, 就是arguments中的一個元素)

  引用類型值 的傳遞就像引用類型變量的復(fù)制一樣, 向參數(shù)傳遞 引用類型值 的時候, 會 把這個值在內(nèi)存中的地址復(fù)制給一個變量 , 因此這個局部變量的變化會反映在函數(shù)的外部

  function addTen(n){ //參數(shù)(這里是n)其實是函數(shù)的局部變量

  n += 10;

  return n;

  }

  var c = 20;

  var r = addTen(c); //調(diào)用時,c作為一個局部變量傳遞給n,函數(shù)體內(nèi)又會自増10然后返回

  console.log(c); //外部的c變量不會被影響,還是20

  console.log(r); //30

  function setName(obj){

  obj.name = "Jon";

  }

  var p = new Object(); //創(chuàng)建了一個對象并保存在變量p中

  setName(p); //隨即被傳遞到setName()中,p復(fù)制給了obj

  console.log(p.name); //所以obj的屬性name也能被p訪問到,所以這里輸出Jon

  //證明對象是按值傳遞的例子

  function setName(obj){

  obj.name = 'Jon';

  obj = new Object(); //為obj重新定義了一個對象

  obj.name = 'Percy'; //然后為obj定義了另一個name屬性

  }//如果p是引用傳遞的話, 那么p就會自動被修改為指向其name屬性值為Percy的對象,但下面的例子輸出的仍然是Jon. 說明即使函數(shù)內(nèi)部修改了參數(shù)的值, 但原始的引用仍然保持不變.

  var p = new Object();

  setName(p);

  console.log(p.name); //Jon

  可以吧ES函數(shù)的參數(shù)想象成局部變量.

  檢測類型

  typeof — 檢測變量是哪種 基本數(shù)據(jù)類型 . string , number , boolean , undefined , object (如果變量的值是一個對象或null, 則返回object)

  console.log(typeof "Jon"); //string

  console.log(typeof true); //boolean

  console.log(typeof 1); //number

  var a;

  console.log(typeof a); //undefined

  console.log(typeof null); //object

  var o = new Object();

  console.log(typeof o); //object

  instanceof — 檢測 引用數(shù)據(jù)類型 值時, 檢測其引用數(shù)據(jù)類型值是什么類型的對象

  result = variable instanceof constructor

  如果變量是給定引用類型的實例, 那么instanceof操作符就會返回true

  console.log(person instanceof Object); //變量person是Object嗎?

  console.log(colors instanceof Array); //變量colors是Array嗎?

  console.log(pattern instanceof RegExp); //變量pattern是RegExp嗎?

  所有引用類型的值都是Object的實例, 所以檢測一個引用類型的值和Object構(gòu)造函數(shù)時會始終返回true

  使用instanceof操作符檢測基本類型的值會始終返回false, 因為基本類型不是對象

  執(zhí)行環(huán)境, 作用域

  執(zhí)行環(huán)境定義了變量或函數(shù)是否有權(quán)訪問的其他數(shù)據(jù).

  全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境(Web瀏覽器中指的是window對象),因此所以 全局變量 和 函數(shù) 都是作為window對象的屬性和方法創(chuàng)建的.

  每個函數(shù)都有自己的執(zhí)行環(huán)境, 當(dāng)執(zhí)行流進(jìn)入一個函數(shù)時, 函數(shù)的環(huán)境就會被推入一個環(huán)境棧中, 函數(shù)執(zhí)行之后, 棧將其環(huán)境彈出, 把控制權(quán)返回給之前的執(zhí)行環(huán)境.

  代碼在一個環(huán)境中執(zhí)行時, 會創(chuàng)建變量對象的一個 作用域鏈 , 它保證了對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問.

  全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象

  var color = "blue";

  function changeColor(){

  if(color === "blue"){

  color = "red";

  }else{

  color = "blue";

  }

  }

  changeColor();

  console.log("Now color is : " + color);

  //Now color is : red

  //函數(shù)changeColor()的作用域鏈包含兩個對象,它自己的變量對象和全局環(huán)境的變量對象.

  //內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境, 但外部環(huán)境相反不能訪問內(nèi)部環(huán)境的任何變量和函數(shù)

  var color = "blue";

  function changeColor(){

  var anotherColor = "red";

  function swapColors(){

  var tempColor = anotherColor;

  anotherColor = color;

  color = tempColor;

  //這里可以訪問color, anotherColor, tempColor

  }

  swapColors();

  //這里只可以訪問color, anotherColor

  }

  changeColor();

  ////這里只可以訪問color

  alert("Color is now " + color);

  沒有塊級作用域

  if(true){

  var color = "blue";

  }

  console.log(color); //ES中, 在外部依然能訪問塊級作用域內(nèi)的變量和函數(shù)

  for (var i=0; i < 10; i++){

  doSomething(i);

  }

  alert(i); //可以訪問塊級作用域內(nèi)的變量,輸出10

  //ES中查詢標(biāo)識符會從正在執(zhí)行的局部環(huán)境查找, 如果當(dāng)前局部環(huán)境查找不到, 就會沿著作用域鏈一級一級向上查找. 如果在全局環(huán)境都找不到需要查找的標(biāo)識符, 說明該變量未聲明

  var color = "blue";

  function getColor(){

  return color;

  }

  console.log(getColor()); //這里會先搜索getColor()內(nèi)部有沒有color變量, 如果沒有就向上一級查找, 直到查找到位置, 這里在上一級已經(jīng)找到, 所以會輸出blue

  var color = "blue";

  function getColor(){

  var color = "red";

  return color;

  }

  console.log(getColor()); //red , 同級找到就不會再向上查找

  垃圾收集

  標(biāo)記清除

  ES中, 當(dāng)變量進(jìn)入環(huán)境(例如, 在函數(shù)中聲明一個變量時), 就把這個變量標(biāo)記為"進(jìn)入環(huán)境", 這種進(jìn)入環(huán)境的變量從邏輯上講不能釋放其內(nèi)存, 因為有可能用到它們. 而當(dāng)變量離開環(huán)境時, 就將其標(biāo)記為"離開環(huán)境".

  過程 :

  垃圾收集器運行的時候會給儲存在內(nèi)存中的所有變量都加上標(biāo)記(可以使用任意可使用的標(biāo)記方式)

  接著會去掉環(huán)境中的變量, 以及被環(huán)境中的變量引用的變量的標(biāo)記(個人理解就是當(dāng)前執(zhí)行環(huán)境的變量以及被環(huán)境中變量引用的變量 的標(biāo)記)

  在此之后再被加上標(biāo)記的變量, 就是被視為準(zhǔn)備刪除的變量(因為它們之前用的時候已經(jīng)被標(biāo)記一次了, 再次(第二次)標(biāo)記說明已經(jīng)使用完畢), 環(huán)境中的變量已經(jīng)無法訪問這些變量了

  垃圾收集器完成內(nèi)存清除工作, 銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間

  引用計數(shù)

  引用計數(shù)的含義是跟蹤記錄每個值被引用的次數(shù)

  聲明了一個變量并將一個 引用類型值 賦值給該變量時, 則這個值的引用次數(shù)就是1

  該 引用類型值 又賦值給另一個變量, 則引用次數(shù)加1

  相反, 如果包含對這個值的引用的變量(如 a 變量)又取得了另一個引用類型值, 則前一個引用類型值的引用次數(shù)減1

  當(dāng)這個 引用類型值 的引用次數(shù)變成0時, 則說明沒辦法再訪問這個值了, 因而可以將其回收, 釋放內(nèi)存空間

  該垃圾收集機(jī)制早期的循環(huán)引用問題

  function problem(){

  var oA = new Object();

  var oB = new Object();

  //oA與oB通過各自的屬性互相引用, 在標(biāo)記清除的回收機(jī)制中, 它們的引用次數(shù)永遠(yuǎn)不可能是0, 并且如果這個函數(shù)重復(fù)多次調(diào)用, 會導(dǎo)致大量內(nèi)存得不到回收

  //所以這種方式已經(jīng)被摒棄, 而采用標(biāo)記清除來實現(xiàn)其垃圾回收

  oA.someOtherObject = oB;

  oB.anotherObject = oA;

  }

  IE中的BOM與DOM使用引用計數(shù)來作為垃圾收集機(jī)制的問題

  var element = document.getElementById("some_element");

  var myObject = new Object();

  //DOM元素(element)與一個原生JS對象(myObject)之間創(chuàng)建了循環(huán)引用

  myObject.element = element; //myObject的element屬性指向element對象

  element.someObject = myObject; //變量element也有一個屬性名叫someObject回指myObject

  //基于上述問題, 即使將力爭中的DOM從頁面中移除, 它也永遠(yuǎn)不會被回收

  //解決方案是在他們不使用時手動斷開原生JS對象與DOM元素之間的鏈接

  //把變量設(shè)置為null意味著斷開變量與它之前引用的值之間的鏈接, 當(dāng)下一次的垃圾回收執(zhí)行時, 就會刪除這些值并回收他它們占用的內(nèi)存

  myObject.element = null;

  element.someObject = null;

  //IE9以上已經(jīng)把DOM和BOM轉(zhuǎn)換成了真正的JavaScript對象, 所以避免了上述問題

  性能問題及內(nèi)存管理

  性能問題

  早期的瀏覽器按內(nèi)存分配量運行的, 達(dá)到一個臨界值就會觸發(fā)垃圾回收機(jī)制, 這個問題在于, 如果一個腳本中包含大量的變量, 那么會在其生命周期也保持有那么多變量, 導(dǎo)致長時間處于垃圾回收機(jī)制的臨界值, 從而使垃圾回收機(jī)制頻繁運行, 造成嚴(yán)重的性能問題.

  新版本的瀏覽器已經(jīng)將其垃圾回收機(jī)制的工作方式改變, 會動態(tài)的調(diào)整觸發(fā)的臨界值.

  內(nèi)存管理

  優(yōu)化內(nèi)存占用的方式, 就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù). 一旦數(shù)據(jù)不再有用, 就通過將其值設(shè)置為null來釋放引用 — 即 解除引用

  function createPerson(){

  var localPerson = new Object();

  localPerson.name = name;

  return localPerson;

  }

  var globalPerson = createPerson("Jon");

  //手動解除globalPerson的引用

  globalPerson = null;

【javascript知識點】相關(guān)文章:

物理知識點11-15

關(guān)于長城的知識點10-11

物理知識點總結(jié)11-18

英語知識點總結(jié)12-02

高考概率知識點05-30

師說知識點歸納總結(jié)10-26

物理浮力知識點總結(jié)03-30

高中關(guān)于復(fù)數(shù)的知識點11-16

學(xué)習(xí)如何記住知識點10-11

采薇知識點總結(jié)08-16