电竞比分网-中国电竞赛事及体育赛事平台

分享

JS高級(jí)

 dna26 2012-11-16
JS高級(jí)
一、JS的數(shù)據(jù)類型
1.基本類型
JS共有5大基本類型,分別是:
 1)Undefined。他只有一個(gè)值:undefined。如果一個(gè)變量被定義但是沒(méi)有給他賦值,那么這個(gè)時(shí)候系統(tǒng)會(huì)默認(rèn)給這個(gè)變量賦值為undefined。
 2)Null。它同樣也只有一個(gè)值:null。他是一個(gè)引用類型,當(dāng)一個(gè)準(zhǔn)備保存對(duì)象的變量因?yàn)榉N種原因還沒(méi)有指向一個(gè)對(duì)象的時(shí)候,可以給這個(gè)變量賦值為null,通常也是這么做的。
 3)Number。數(shù)值類型,他是C#中的整型和浮點(diǎn)型的集合,它具體是什么類型還要看它被賦值的情況,一般來(lái)說(shuō)賦值為什么類型他就為什么類型。另外注意 var num = 1.0;這個(gè)時(shí)候num是個(gè)整型,只有小數(shù)點(diǎn)后有確切的不為0的值的時(shí)候才是浮點(diǎn)型。關(guān)于Number類型還有一些其他知識(shí)點(diǎn),如:NaN表示該值不是一個(gè)數(shù)字,isNaN()可以判斷傳入的值時(shí)候?yàn)镹umber類型;parseInt()可以將傳入的參數(shù)轉(zhuǎn)成數(shù)值類型,如果包含非數(shù)值類型字符串的話,會(huì)自動(dòng)將字符串去掉,parseInt("123blue")的返回值為123,字符串blue部分被忽略,因此parseInt()方法可以理解為嘗試把傳入的參數(shù)轉(zhuǎn)換成整型,轉(zhuǎn)換不了的話會(huì)將轉(zhuǎn)換不了的部分忽略。parseFloat()方法與parseInt()方法類似。
 4)Boolean。布爾類型,類似C#中bool類型,有true和false兩個(gè)取值,但是沒(méi)有類似C#中0對(duì)應(yīng)False,1對(duì)應(yīng)true這樣的與數(shù)字的對(duì)應(yīng)關(guān)系。
 5)String。字符串類型,保存的是0到16位的UNICODE代碼組成的字符序列。
2.復(fù)雜類型
 1)Object類型。是JS的頂級(jí)“父類”(因?yàn)镴S中沒(méi)有類的概念,說(shuō)他是父類只是為了理解上的方便),是一組數(shù)據(jù)和方法(功能)的集合,但它不具備傳統(tǒng)面向?qū)ο笳Z(yǔ)言所支持的類和接口。Object類型本質(zhì)是一個(gè)無(wú)序的鍵值對(duì)列表,類似于集合,json格式。它包含7個(gè)方法,分別是:
  constructor() 構(gòu)造函數(shù)?
  hasOwnProperty(propertyName) 檢查屬性是否在當(dāng)前對(duì)象中
  isPrototypeOf(object) 檢查對(duì)象是不是該對(duì)象原型
  propertyIsEnumerable(propertyName) 檢查屬性是否能用for-in來(lái)循環(huán)
  toString()
  valueOf()
 創(chuàng)建Object可以有多種方式:
  通過(guò)new 關(guān)鍵字:var s = new Object(); s.name="james"; s.age=27;
  通過(guò)JS的簡(jiǎn)單定義方式:var s = {}; s.name="james"; s.age=27;
  對(duì)象字面量表示法:var s = {"name":"james","age":"27"};PS:json格式數(shù)據(jù)的key可以不用雙引號(hào)括起來(lái),value如果不是字符串的話也可以不用雙引號(hào)括起來(lái),但是推薦key和value都要用雙引號(hào)括起來(lái),以避免不必要的麻煩。
 訪問(wèn)Object對(duì)象的屬性的方法:
  s.name 直接點(diǎn)出來(lái)。
  s["name"];使用方括號(hào)(類似于索引器)的優(yōu)點(diǎn)是可以通過(guò)變量來(lái)動(dòng)態(tài)訪問(wèn)屬性:var proName="name"; alert(s[proName]);
 2)Array類型。是數(shù)據(jù)的有序列表
 與其他數(shù)組的不同:
  數(shù)組元素可以是任何類型,同一個(gè)數(shù)組的元素類型也可以不一樣,相當(dāng)于C#中的List<object>
  長(zhǎng)度可以任意改變
  數(shù)組的length屬性可讀寫(可以利用這一點(diǎn)刪除數(shù)組元素)
 數(shù)組的棧方法 后進(jìn)先出
  push() 往里加
  pop() 從棧頭往外拿,拿出來(lái)以后數(shù)組中的元素?cái)?shù)量就會(huì)發(fā)生變化
 數(shù)組的隊(duì)列方法 先進(jìn)先出  
  shift() 從隊(duì)列尾部往外拿
  unshift() 從隊(duì)列尾部往里加
 排序
  sort() 排正序,將數(shù)組中的數(shù)據(jù)按照一定的順序排列,參數(shù)可以傳遞一個(gè)匿名方法(類似于接口)
  reverse() 翻轉(zhuǎn)排列
 連接數(shù)組
  concat() 示例:var colors=["a","b"];var newcolor=colors.concat("yellow",["c","d"]);結(jié)果colors有了5個(gè)元素。concate方法中若傳入數(shù)組,會(huì)把該數(shù)組拆分,將其中元素加入目標(biāo)數(shù)組中。若傳入json格式數(shù)據(jù),一個(gè)json數(shù)據(jù)就看成一個(gè)元素加入數(shù)組。
 3)Function類型。函數(shù)是對(duì)象,函數(shù)名是指針
 聲明方式(3種):
  function sum(x,y){return x+y;}
  var sum=function(x,y){return x+y;}//函數(shù)表達(dá)式
  var sum=new Function("x","y","return x+y;");//對(duì)象創(chuàng)建,不推薦(解析兩次)
 Function類型沒(méi)有重載。Function類型本質(zhì)上就是一個(gè)數(shù)據(jù)類型,和其他類型一樣,多次賦值的時(shí)候,后一次賦值會(huì)覆蓋(替代)前一次賦值。多個(gè)同名函數(shù)其實(shí)就是對(duì)同一個(gè)函數(shù)對(duì)象賦值,后一個(gè)賦值會(huì)覆蓋前面的賦值,所以執(zhí)行的都是最后一次的函數(shù)定義。
 講Function的屬性之前需要先了解JS代碼的執(zhí)行環(huán)境和作用域以及其他一些知識(shí)點(diǎn):
  a)執(zhí)行環(huán)境:就是當(dāng)前函數(shù)(方法)所處在的父環(huán)境。比如在window下執(zhí)行的函數(shù)他的執(zhí)行環(huán)境就是window。真正的全局執(zhí)行環(huán)境是Global,只不過(guò)大多數(shù)瀏覽器不公開(kāi)代碼訪問(wèn),只是通過(guò)window來(lái)間接訪問(wèn)。
  b)if等語(yǔ)句沒(méi)有用塊狀作用域,JS的作用域與C#的不同,if,for等用大括號(hào)括起來(lái)的代碼并不能形成一個(gè)塊狀作用域。
  c)用var聲明變量時(shí),會(huì)他把添加到最近的可用環(huán)境,若不用var則把他添加的父環(huán)境中,這就理解了不用var定義的一個(gè)變量是全局變量的原因。
  d)聲明語(yǔ)句會(huì)首先執(zhí)行,不管你把它放到哪里。雖然JS代碼是從上到下順序執(zhí)行的,但是遇到聲明的語(yǔ)句,編譯器就會(huì)先執(zhí)行聲明語(yǔ)句,以保證其他語(yǔ)句執(zhí)行的過(guò)程中不會(huì)因?yàn)橛龅經(jīng)]有聲明的變量而報(bào)錯(cuò)。
  e)垃圾回收。將一個(gè)保存對(duì)象的變量設(shè)置為null,相當(dāng)于切斷了變量(棧)和引用值(堆)之間的關(guān)系,垃圾回收站就會(huì)自動(dòng)回收
 Function的內(nèi)部屬性:
  arguments
   他是一個(gè)數(shù)組,保存?zhèn)魅氲膮?shù)。
   callee是一個(gè)指針,保存擁有這個(gè)arguments對(duì)象的函數(shù)對(duì)象,也就是這個(gè)函數(shù)的堆地址,當(dāng)函數(shù)需要調(diào)用自己的時(shí)候,可以使用callee,不用出現(xiàn)自己的函數(shù)名,從而降低耦合度。
  this
   指向當(dāng)前函數(shù)所在的執(zhí)行環(huán)境,也就是函數(shù)在執(zhí)行時(shí)所處的作用域
 函數(shù)對(duì)象的屬性和方法
  length 
   函數(shù)定義的命名參數(shù)的個(gè)數(shù)
   函數(shù)名.length
  prototype(原型)
   保存它們所有實(shí)例方法的真實(shí)所在
  apply([要改變的作用域])
   改變?cè)摵瘮?shù)對(duì)象的作用域 也就是改變this的值
   示例代碼
    function sum(x, y) {
    alert(this);
    return x + y;
    }
     //window.sum(1,2);
     function callS() {
     callS.callSum1(1, 2);
    }
    callS.callSum1 = function (x, y) {
     alert(this);
     var s = sum.apply(this, arguments);
     //sum(1, 2);
     return s;
    }
    callS();
  call()方法與apply()方法類似
  以上兩個(gè)方法不是繼承而來(lái)的,可以擴(kuò)充函數(shù)賴以存在的作用域,這樣做最大的好處是對(duì)象和方法不需要有任何耦合關(guān)系。兩者傳入的第一個(gè)參數(shù)都是要改變成的作用域,第二個(gè)參數(shù)apply傳入的是一個(gè)參數(shù)數(shù)組,call傳入的是每一個(gè)命名參數(shù)。
二、值類型和引用類型
 講了這么多基本類型(除null以外都是值類型)和復(fù)雜類型(基本上都是引用類型),我們需要了解語(yǔ)言設(shè)計(jì)者為什么要設(shè)計(jì)值類型和引用類型。兩者的區(qū)別是什么?
  1.值類型內(nèi)容長(zhǎng)度固定,保存值的存在范圍引用類型內(nèi)容長(zhǎng)度不固定,可以存儲(chǔ)不定長(zhǎng)度的數(shù)據(jù);
  2.值類型只能單純的儲(chǔ)存值,如整型,字符串等。而引用類型可以儲(chǔ)存對(duì)象的堆地址,可以使多個(gè)變量指向同一個(gè)對(duì)象;
  3.也是最主要的一點(diǎn),引用類型可以緩解棧的存儲(chǔ)壓力(值類型儲(chǔ)存在棧中)。
  4.在JS語(yǔ)法中基本數(shù)據(jù)類型不能動(dòng)態(tài)添加屬性而引用數(shù)據(jù)類型可以動(dòng)態(tài)添加屬性。
三、檢測(cè)類型的關(guān)鍵字
 1.typeof 
  判斷基本類型的類型 返回true or false
 2.instanceof 
  判斷復(fù)雜(引用)類型的類型 返回true or false
  如果用它判斷基本類型 則永遠(yuǎn)返回false
四、eval()方法
 eval()方法相當(dāng)強(qiáng)大,他就相當(dāng)于一個(gè)解析器。它只接受一個(gè)參數(shù),就是要執(zhí)行的JS代碼字符串。當(dāng)解析器發(fā)現(xiàn)eval()時(shí),他會(huì)把eval()中的參數(shù)解析出來(lái),插入到eval執(zhí)行的位置,效果相當(dāng)于在相應(yīng)的位置直接寫入JS代碼。
五、創(chuàng)建對(duì)象
 1)簡(jiǎn)單工廠模式
 2)構(gòu)造函數(shù)模式。每一個(gè)實(shí)例都包括所有的方法,這樣會(huì)浪費(fèi)內(nèi)存。
 3)原型模式。把方法保存在原型中,這樣所有實(shí)例可以調(diào)用這個(gè)方法,而不用每個(gè)實(shí)例都要保存這個(gè)方法

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多