? ? 有人說過,很多彎路到最后都成了直路,所有的坑到最后也都成了坦途;所謂的直路和坦途并不是擺在眼前的,都是不斷的的繞彎過程中掰正捋直的,都是摔得鼻青臉腫之后填平的。從離開學(xué)校到北京工作也算有一年的時間了,只感覺這一年過的不算充實,也不算空虛,有所進步,但幅度不大,繞了些彎也踩了些坑,但還需繼續(xù)前行才能看清自己的路。
? ? 在確確實實工作過一年之后,才認清了自己的不足,才發(fā)現(xiàn)前端這份工作也并沒有開始時想的那么簡單,也隱約知道了自己下一步該怎么去走才能不掉隊,所以才有了這篇筆記。就像人們常說的“任何事都沒有捷徑可走”,所以覺得要想繼續(xù)踏踏實實在前端這條路上奮力向前,就必須要不斷充實自己,查缺補漏。
? ? 寫了這么多其實是想說經(jīng)過年后這段時間的面試,發(fā)現(xiàn)了好多問題,最主要的還是覺得自己基礎(chǔ)知識掌握的不夠扎實,有的時候只是著重于實現(xiàn),確實也忽視了原理性的東西,正好也趁此機會,翻看一下去年買了但沒看的js高程這本書,鞏固一下基礎(chǔ),也去掌握一些“為什么”,不僅局限于“怎么做”。
? ? 這系列的筆記本著自己的初衷是每看完五章做一篇這樣的總結(jié)筆記,不言而喻這篇便是前五章內(nèi)容的一個總結(jié),畢竟自己道行尚淺,沒能力去做什么總結(jié)和知識梳理,只是對看過的知識點的一個去繁化簡,可以讓自己以后在忘卻前邊知識點的時候翻看一下,可以有一個快速整理回憶的作用,也希望不幸看到這篇筆記且覺得這是篇什么鬼東西的能給指點一二,若實在看不下去的,那就趕快點擊右上角x關(guān)掉,以免影響接下來的心情,假若不小心幫助了其它比我還菜的人,那你也不用道謝,因為我的名字叫“雷鋒”,我做好事不留名,只記筆記。
扯了這么多回到正題,往下便是對前五章知識點的一個簡要歸納陳列:
第1章 JavaScript簡介
? ? 主要講述了JavaScript的起源:因何而生,如何發(fā)展,現(xiàn)狀如何。涉及的概念:JavaScript與ECMAScript的關(guān)系,DOM(文檔對象模型),BOM(瀏覽器對象模型)以及ECMA(歐洲計算機制造協(xié)會)和W3C(萬維網(wǎng))的一些相關(guān)標準。
1.1 JavaScript簡史
? ? 1995年由布蘭登.艾奇進行開發(fā)(LiveScript),同時支持瀏覽器和服務(wù)器使用,搭載在Netscape Navigator2瀏覽器上;1996年,Netscape借著1.0版本的成功之勢,隨即在其Netscape Navigator3中發(fā)布了1.1版本,同年微軟也進入Web瀏覽器市場,在IE3中加入了名為JScript的JavaScript實現(xiàn);1997年,ECMA為避免兩大廠商所實現(xiàn)的不同版本JavaScript所暴露出的問題,將JavaScript 1.1作為藍本制定了這門語言的實現(xiàn)標準,也就是ECMA-262(ECMAScript)標準,98年ISO/IEC也采用了這一標準。
1.2 JavaScript實現(xiàn)
? ? 一個完整的ECMAScript通常包括三個部分:ECMAScript(核心),DOM(文檔對象模型),BOM(瀏覽器對象模型)。
1.2.1 ECMAscript
? ? ? 第一版與javascript1.1本質(zhì)上相同,刪除了針對瀏覽器的部分并進行了小的改動;第二版是對第一版的處理和加工為用作ISO標準;第三版(ES3)才是對標準的真正修改,涉及字符串處理、錯誤定義和數(shù)值輸出,新增了對正則表達式、新控制語句、try-catch異常處理的支持,真正意義上成為了一門編程語言;第四版對標準進行了全面的修改,但因為變動太大 并沒有被采用,而是采用了改動較小的一 版,也就是現(xiàn)在的ECMAscript5;就在2006年第六版ES6也正式頒布 ;ES7正在修改制定中。
ECMAscript兼容:要想成為ECMAscript的實現(xiàn)“必須支持ECMA描述的所有的“類型 值 對象 屬性 函數(shù)以及程序語法和語義”;支持Unicode字符標準”。
還可以進行下列擴展:添加標準沒有描述的“更多類型 值 對象 屬性 函數(shù)”;支持標準沒有定義的程序和正則表達式語法
瀏覽器對ECMAscript標準的支持:javascript1.1版本是標準的藍本 所以navigator3對標準支持比較好 但是navigator4搭載的1.2版本在標準還沒出來之前便已發(fā)布但是與標準有所不同所以兼容性有問題 ?4.06版本搭載 1.3版本實現(xiàn)了對標準的兼容,微軟的IE4搭載Jscript模仿javascript開發(fā)的但是有很大差別所 以對標準支持也不好;08年五大瀏覽器都做到了對ECMAscript-262的兼容 ? IE8開始兼容ES5 ?IE9完全兼容ES5 ? ? firefox4也做到了兼容
1.2.2 文檔對象模型(DOM)
? ? 是針對XML經(jīng)過擴展用于HTML的應(yīng)用程序編程接口(API),DOM把整個頁面映射為一個多層節(jié)點結(jié)構(gòu) HTML或XML的頁面的每個組成部份都是不同的類型節(jié)點,包含著不同類型的數(shù)據(jù)開發(fā)人員因此獲得控制頁面內(nèi)容和結(jié)構(gòu)的主動權(quán),通過提供的API 可以任意刪除、添加、替換、修改節(jié)點。
標準化原因:隨著發(fā)展微軟和網(wǎng)景公司兩家各持己見 造成了瀏覽器互不兼容的局面 為了控制這樣的局面負責(zé)制定web通信標準的w3c開始著手規(guī)劃DOM標準
DOM標準:1998年DOM1級稱為w3c推薦標準,主要有兩個模塊組裝成:DOM核心 和 DOM HTML,DOM核心規(guī)定的是如何映射基于XML的文檔結(jié)構(gòu),以便簡化對文檔中任意部分訪問和操作DOM HTML在DOM核心基礎(chǔ)上加以擴展 增加了針對HTML的對象和方法;DOM2級在原先基礎(chǔ)上增加了鼠標和用戶界面事件、范圍、遍歷 、通過對象接口 增加了對css的支持;DOM3級則進一步擴展了DOM
其他DOM標準:svg(可伸縮矢量圖)、MathML(數(shù)學(xué)標記語言)、SMIL(同步媒體集成語言)
瀏覽器對DOM的支持:微軟IE5支持DOM1級 ,但是IE67都不支持DOM,在隨后的IE8中修復(fù)了這一問題;Netspace6中才支持DOM(mozilla 0.6.0)firefox3完全支持DOM1級幾乎完全支持DOM2級
1.2.3 瀏覽器對象模(BOM)
沒有相關(guān)標準每個瀏覽器都有自己的實現(xiàn)標準,隨著HTML5發(fā)展正在制定這方面的標準
本質(zhì)上講 BOM只處理瀏覽器窗口和框架 但人們習(xí)慣上把針對瀏覽器的javascript擴展算作BOM的一部分:
1.彈出新瀏覽器窗口的功能
2.移動 縮放 關(guān)閉瀏覽器的功能
3.提供瀏覽器詳細信息的navigator對象
4.提供瀏覽器所加載頁面詳細信息的location對象
5.提供用戶瀏覽器分辨率詳細信息的screen對象
6.對cookies的支持
7.像XMLHttpRequest 和 IE的ActiveXObject這樣的自定義對象
1.3 JavaScript版本(只有firefox還遵循最初的版本編號)
第2章 在HTML中使用JavaScript
? ? 主要介紹了如何在HTML中使用JavaScript創(chuàng)建動態(tài)網(wǎng)頁。涉及內(nèi)容:在HTML中嵌入JavaScript的方式,JavaScript的內(nèi)容類型及其與<script>的關(guān)系。
分兩種:嵌入腳本和外部腳本(可維護性好 可緩存 適應(yīng)未來)
2.1 <script>標簽元素
html4.01定義了六個屬性:
? ? src:包含要執(zhí)行的外部文件,如果設(shè)置了該屬性,便不會讀取器包含的代碼
? ? async: 立即下載腳本,不影響其他資源加載
? ? charset: 表示通過src設(shè)置的代碼字符集,瀏覽器會忽略它 很少使用
? ? defer: 腳本可以延遲到文檔解析完顯示之后再執(zhí)行
? ? language:已廢棄
? ? type:text/javascript
標簽的位置:一般是放在head標簽中 旨在把所有外部文件放在一起集中加載 但是意味著要加載完所有文件 才開始解析頁面 會影響頁面加載速度 所以盡量將script放在body標簽中 頁面內(nèi)容后邊
延遲腳本:defer表示在頁面加載解析完成后再執(zhí)行腳本 頁面一加載遍加載 但是延遲執(zhí)行 有先后順序 根據(jù)屬性出現(xiàn)先后執(zhí)行
異步腳本:async告訴瀏覽器立即下載 但不影響頁面構(gòu)造 但是執(zhí)行沒有先后順序 不確定那個先執(zhí)行
在XHTML中的用法:有些符號不能用 比如>或者<號不能被解析需要用相應(yīng)的HTML實體(<)來代替或者另外一種解決方案是:來包裹需要執(zhí)行的代碼
文檔模式:標準模式 ? ?準標準模式 ? ?混雜模式
<noscript>元素:在不支持javascript或者說禁用javascript的瀏覽器中顯示提示
第3章 基本概念
? ? 討論了JavaScript語言的基本概念,包括語法和流控制語句。介紹了與其它語言語法的相同與不同之處以及與內(nèi)置操作符有關(guān)的類型轉(zhuǎn)換問題。
3.1 語法:大量借鑒C及其他類C(java和perl)語言
3.1.1 區(qū)分大小寫 :javascript一切(變量 函數(shù)名 操作符)區(qū)分大小寫
3.1.2 標識符: 變量、函數(shù)、屬性的名字或者函數(shù)的參數(shù)(第一個字符必須是字母 下劃線 或者一個??符號;其他字符可以是字母 下劃線 數(shù)字或美元符號;標識符中的字母也可以是ASCII或者Unicode 但是不推薦使用)
推薦寫法:駝峰命名法,不能把關(guān)鍵字、保留詞 true、false、null 用作標識符
3.1.3 注釋: // ? ?單行注釋 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* 多行注釋 */
3.1.4 嚴格模式:ES5中引入了嚴格模式 為javascript定義了一種不同的解析和執(zhí)行模式,對ES3中不確定的行為將得到處理 ,不安全的行為拋出錯誤 在頂部書寫’use strict’可開啟嚴格模式 ,也可以指定函數(shù)在嚴格模式下執(zhí)行,在函數(shù)題頂部添加’use strict’(支持嚴格模式的的瀏覽器IE10、Firefox 4+、Safari 5.1+、Opera 12+、Chrome)
3.1.5 語句:ES中語句以分號結(jié)尾,沒有分號,解析器會自動判斷結(jié)尾,但是推薦使用分號有利于后期對代碼壓縮
3.2 關(guān)鍵字、保留字:es中描述了一組具有特殊意義的關(guān)鍵字 ,還描述了另外一組還沒定義的但將來可能會被用作關(guān)鍵字的保留字
3.3 變量:ECMAscript中的變量是松散類型的 也就是說變量只是內(nèi)存中保存值的占位符而已通過var來聲明變量 ?,若沒有聲明直接復(fù)制,則會創(chuàng)建一個全局變量(可一次定義或初始化多個變量,用“ ,”來分隔)
3.4 數(shù)據(jù)類型:Number、String、Boolean、undefined、null(基本類型)和引用類型
3.4.1 typeof操作符:判斷給定變量屬于那種數(shù)據(jù)類型,該操作符無法判斷對象具體屬于什么引用類型,可使用instanceof來判斷
? ? undefined? ? ? 這個變量值未被定義
? ? string ? ? ? ? ? ? ? 字符類型
? ? number ? ? ? ? ? ?數(shù)字類型
? ? boolean ? ? ? ? ? ?布爾類型
? ? object ? ? ? ? ? ? ? 對象或者null
? ? function ? ? ? ? ? ?函數(shù)
3.4.2 undefined類型:值被聲明但沒賦值,這個變量的值就是undefined
3.4.3 null 類型:空的對象指針 ,實際上undefined值派生自null ,所以在普通比較時undefined == null返回true,但是兩者是不同的,null代表需要保存對象的變量還沒有保存對象,而undefined卻沒有必要顯示的設(shè)置,全等操作時返回false
3.4.4 boolean類型:布爾類型? 只有true和false兩個值 ,雖只有兩個值,但是所有類型的值都有與其等價的值,所有類型的值都可以調(diào)用Boolean()轉(zhuǎn)型函數(shù),轉(zhuǎn)換成對應(yīng)布爾值:只有數(shù)字0、NaN、空字符串、null、undefined轉(zhuǎn)換成false
3.4.5 number類型:用IEEE754來表示整數(shù)和浮點數(shù) ,ES中定義了不同的數(shù)值字面量格式正常使用的十進制、以0開頭的八進制、以0x開頭的十六進制表示,javascript中可以保存+0和-0但其實是相等的
<1> 浮點類型:ES會不失時機地將浮點型轉(zhuǎn)換成整數(shù)(若小數(shù)點后沒有跟任何數(shù)值)在進行算數(shù)計算的時候,會丟失精度(舍入誤差)
<2> 數(shù)值范圍:ES中能保存的最大()最小值(5e- 324)保存在Number.MAX_VALUE和 ? Number.MIN_VALUE中;如果某次計算返回(+/-)Infinity(正負無窮大)則不能進行下一次計算 ,可以通過isFinite()函數(shù)判斷一個值是不是無窮大,可以通過Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY獲取其值
<3> NaN:不是數(shù)值,可以通過isNaN()函數(shù)來判斷一個值是否不是數(shù)值 ,NaN不等于不小于不大于任何值
<4>數(shù)值轉(zhuǎn)換:Number()、parseInt()、parseFloat()
Number()轉(zhuǎn)型函數(shù),默認調(diào)用該函數(shù)
1.boolean值 true轉(zhuǎn)換為1,false轉(zhuǎn)換為0
2.null轉(zhuǎn)換為0,undefined轉(zhuǎn)換為NaN
3.字符串遵循以下規(guī)則:
空字符串轉(zhuǎn)換為0
純數(shù)字字符串轉(zhuǎn)換為對應(yīng)數(shù)字,忽略前置0
有效的浮點字符串,轉(zhuǎn)換為對應(yīng)浮點值或略前置0
包含有效十六進制字符 ,轉(zhuǎn)換為相等的十進制數(shù)值 ,除此之外轉(zhuǎn)換為NaN
4.對象:調(diào)用valueOf()方法 按上述規(guī)則轉(zhuǎn)換 ,若轉(zhuǎn)換為NaN ,則調(diào)用toString()方法按上述規(guī)則轉(zhuǎn)換
parseInt():可以識別各種整數(shù)格式 ,可以是別第一個值為數(shù)字的字符串,可接受兩個個參數(shù) 第一個為要轉(zhuǎn)換的值、第二個為進制格式
parseFloat():也可以識別第一個字符為數(shù)值的字符串,直到無效的小數(shù)點為止
3.4.6 String類型:由16位Unicode字符組成的字符序列,字符串一旦創(chuàng)建便不可改變,若想改變,是先銷毀原先保存的值重新賦值
轉(zhuǎn)型:toString()方法 ?數(shù)值、布爾、字符串、對象都有該方法,數(shù)值調(diào)用該方法可接受一個參數(shù)(進制),可返回輸入進制格式的字符串,null和undefined沒有該方法,默認轉(zhuǎn)型方法String()
3.4.7 Object類型:ES中對象其實是一組數(shù)據(jù)和功能的集合, 是其他實例的基礎(chǔ),它具有的屬性和方法更具體的實例中都繼承了
創(chuàng)建方式(兩種):var o = new Object();(new操作符) ? var o = {};(對象字面量)
Object的每個實例都具有以下屬性:
Constructor :保存著創(chuàng)建該對象的函數(shù),對于上邊實例的構(gòu)造函數(shù)是Object
hasOwnProperty(propertyName):用于檢測給定的屬性是否屬于當(dāng)前實例對象(不是實例原型中),屬性必須以字符串形式傳入
isPropertyOf(Object):檢測傳入的對象是否是另一個對象的原型
propertyIsEnumberable(propertyName):檢測傳入的屬性是否能夠用for-in枚舉 ,需要以字符串形式傳入
toLocaleString():返回對象字符串表示
toString():返回對象字符串表示
valueOf():返回對象數(shù)值、字符串或布爾表示
3.5 操作符:一組用于操作數(shù)據(jù)值的操作符
3.5.1 一元操作符:遞增和遞減(前置和后置)、一元加和減
前置(++n/--n):n值加一,返回值n+1/n-1; ?后置(n++/n--):n值加一,返回n
一元加(+): 數(shù)值無變化,非數(shù)值相當(dāng)于調(diào)用Number()轉(zhuǎn)型函數(shù)
一元減(-): 數(shù)值變?yōu)樨摂?shù),非數(shù)值相當(dāng)于調(diào)用Number()轉(zhuǎn)型函數(shù)
3.5.2 位操作符
? ? 用于最基本層次上,按內(nèi)存中表示數(shù)值的位來操作數(shù)值。先將64位數(shù)值轉(zhuǎn)換為32位執(zhí)行操作再轉(zhuǎn)成64位。對于有符號整數(shù)32位中前31位表示整數(shù)最后一位表示符號,0代表正數(shù),1代表負數(shù)。負數(shù)同樣以二進制存儲,使用的是二進制補碼,求二進制補碼(取反加1)。
1.按位非(~):執(zhí)行按位非返回數(shù)值的反碼。
2.按位與(&):將兩個數(shù)值按位對齊比較(兩值都為1得1,否則得0)。
3.按位或(|):將兩個數(shù)值按位對齊比較(兩值都為0得0,否則得1)。
4.按位異或(^):將兩個數(shù)值按位對齊比較(相同得0,不同得1)。
5.左移和右移(<<、>>):左移增大(num*2(n)),右移減小(num/2(n))
5.無符號右移(>>>):正數(shù)與右移無區(qū)別,負數(shù)無符號右移用0來填充空位不是用符號位的值填充。
3.5.3 布爾操作符
布爾操作符共有三個:邏輯非(!):先將操作數(shù)轉(zhuǎn)換為布爾型再取反,邏輯與(&&):短路操作、如果第一個操作數(shù)能決定結(jié)果就不會再對第二個操作數(shù)求值,邏輯或(||):和邏輯與思路相同。
3.5.4 乘性操作符
1.乘法(*):操作結(jié)果超出范圍Infinity或者-Infinity;一個操作數(shù)是NaN,返回NaN;Infinity與0相乘返回NaN;與非0輸相乘返回Infinity或-Infinity;若操作數(shù)不是數(shù)值調(diào)用Number()轉(zhuǎn)換后操作。
2.除法(/):如果0/0返回NaN;如果非零有限數(shù)被零除返回Infinity;Infinity被Infinity除返回NaN;Infinity被任何非零數(shù)除返回Infinity。
3.取模(%):被除數(shù)無窮大除數(shù)有限大的值,返回NaN;被除數(shù)有限大除數(shù)0,返回NaN;Infinity除Infinity返回NaN。
3.5.5 加性操作符
1.加法(+):如果Infinity加-Infinity,返回NaN;如果兩個操作數(shù)都是字符串,則將其拼接;如果一個是字符串一個是非字符串,先轉(zhuǎn)換成字符串然后拼接。
2.減法(-):如果Infinity減Infinity,返回NaN;如果-Infinity減-Infinity,返回NaN。
3.5.6 關(guān)系操作符
關(guān)系操作符:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、相等(==)、不等(!=)、全等(===)、
不全等(!==)
比較時的轉(zhuǎn)換規(guī)則:
*兩個操作數(shù)都是數(shù)值,執(zhí)行數(shù)值比較。
*兩個數(shù)值都是字符串,比較兩個字符串相應(yīng)的字符編碼值。
*如果一個操作數(shù)是數(shù)值,將另一個轉(zhuǎn)換為數(shù)值比較。
*如果一個操作數(shù)是對象,調(diào)用valueOf()方法,用得到的結(jié)果按照前邊規(guī)則比較,沒有valueOf()方法,則調(diào)用toString()方法。
*如果一個數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值比較。
相等和不相等是先轉(zhuǎn)換再比較,全等和不全等不轉(zhuǎn)換直接比較(值和類型都相等則為全等)。null和undefined相等但是不全等。
3.5.8 條件操作符(三目)
var max = (num1 > num2)?num1 : num2;可代替簡單的if(){}else{}
3.5.9 賦值操作符
加等(+=)、減等(-=)、乘等(*=)、除等(/=)、模等(%=)、左移/賦值(<<=)、有符號右移/賦值(>>=)、無符號右移/賦值(>>>=)
3.5.10 逗號操作符:一條語句中執(zhí)行多個操作
3.6 語句
ECMAscript規(guī)定了一組語句(流控制語句),語句定義了ECMAscript中主要的語法,通常使用一或多個關(guān)鍵詞來完成給定的任務(wù)。
3.6.1 if語句
if(codition){ ? ? ? ?//自動調(diào)用Boolean()函數(shù)轉(zhuǎn)換為布爾值
? ? alert(1);
}else{
alert(2)
}
3.6.2 do-while語句
do{
? ? alert(1); ? ? ? ? ? ? ? ? ??//代碼至少執(zhí)行一次
}while(codition);
3.6.3 while語句
while(codition){ ? ? ? ? //滿足條件執(zhí)行
? ? alert(1)
}
3.6.4 for語句
for(var i = 0; i < arr.length; i++){ ? //遍歷數(shù)組
? ? alert(arr[i]);
}
3.6.5 for-in語句
for-in語句是精準的迭代語句,可以用來枚舉對象的屬性。
for(var proName in window){
? ? alert(proName);
}
3.6.6 lable語句
使用lable語句可以在代碼中添加標簽,將來用于被break或是continue引用,一般要和for等循環(huán)語句配合使用。
例: ? ? start:for(var i = 0;i < 5; i++){
? ? ? ? ? ? ? ? alert(i)
? ? ? ? ? ? }
3.6.7 break和continue語句
break和continue用于循環(huán)中精確控制代碼的執(zhí)行。break會強制退出循環(huán)執(zhí)行循環(huán)后邊的語句,continue會立即退出本次循環(huán),執(zhí)行下一次循環(huán)。
break和continue可以lable語句聯(lián)合使用,從而返回代碼中特定的位置。多出現(xiàn)在循環(huán)嵌套中。
var num = 0;
start:
for(var i = 0; i < 10; i++){
? ? for(var j = 0; j < 10; j++){
? ? ? ? if(i == 5 && j == 5){
? ? ? ? ? ? break start;
? ? ? ? }
? ? ? ? num++;
? ? }
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//num = 55;
3.6.8 with語句
with語句將代碼作用域設(shè)置到一個特定的對象中。
格式: with(experssion)statement;
例:var qs ?= location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
with(location){ ? ? ? ? ? ? ? ? ? ? ?//簡化多次編寫同一個對象
? ? var qs = search.substring(1);
? ? var hostName = hostname;
? ? var url = href;
}
嚴格模式下不允許使用with語句,會導(dǎo)致性能下降,增加調(diào)試難度,不建議使用
3.6.9 switch語句
與if語句類似,流控制語句。
格式:switch(expression){
case value:
statement;
break; ? ? ? ? ? ? ? ?//執(zhí)行完break跳出,若省略break;順序往下執(zhí)行下一個case的代碼塊
case value:
statement;
break;
default:
statement;
}
3.7 函數(shù)
對任何語言來說函數(shù)都是核心的概念。封裝一項專門任務(wù)的步驟清單的代碼段。
function funcName(arg0,arg1){
statement;
return ;
}
3.7.1 理解參數(shù)
ECMAscript中函數(shù)參數(shù)與其他語言中函數(shù)參數(shù)有所不同,ECMAscript不介意傳進幾個參數(shù)和什么類型。參數(shù)內(nèi)部是用一個數(shù)組來表示,在函數(shù)體內(nèi)通過arguments對象來訪問參數(shù)數(shù)組。
arguments對象與數(shù)組類似但不是Array實例,具有l(wèi)ength屬性,可以通過方括號語法訪問每個元素。函數(shù)參數(shù)傳遞的都是值不是引用。
3.7.2 沒有重載
ECMAscript沒有函數(shù)重載的概念,兩個同名函數(shù)只會保留最后聲明的。可以通過函數(shù)內(nèi)條件控制來實現(xiàn)。
第4章 變量、作用域和內(nèi)存問題
? ? 探討了JavaScript如何處理松散類型的變量,原始值與引用值之間的差別,與變量執(zhí)行環(huán)境相關(guān)的內(nèi)容以及垃圾(內(nèi)存清理)回收機制。
? ? JavaScript變量與其他語言的變量有和大區(qū)別,變量松散類型的本質(zhì),決定了它是在特定時間保存特定值的一個名字而已,變量的值和類型可以在生命周期中改變。
4.1基本類型和引用類型的值
ECMAscript變量包含兩種不同數(shù)據(jù)類型的值,基本類型和引用類型。基本類型就是簡單的數(shù)據(jù)段,五種基本類型,引用類型就是多個值構(gòu)成的對象。JavaScript中不允許直接訪問內(nèi)存中的位置,也不能直接操作對象的內(nèi)存空間。實際上操作對象是操作的對象的引用
4.1.1 動態(tài)的屬性
定義基本類型和引用類型類似,創(chuàng)建一個變量為其賦值。但當(dāng)值保存到變量中后,不同類型的值操作大不相同,引用類型可以定義屬性和方法,而基本類型不可以。
4.1.2 復(fù)制變量值
基本類型:
引用類型:
4.1.3 傳遞參數(shù)
ECMAscript中函數(shù)的參數(shù)是按值傳遞的。
function setName(obj){
? ? obj.name = "tom";
? ? obj = new Object();
? ? obj.name = "jhon";
};
var pers = {name : "name"};
setName(pres);
console.log(pers.name); ? ? ? ? ? ? ?//tom ?如果不是按值傳遞,那么pers.name應(yīng)該是jhon
4.1.4 檢測類型
檢測數(shù)據(jù)是不是基本類型 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? typeof
引用類型判斷具體是什么類型的對象 ? ? ? ? ? ? ? ? ? ? ? ? ? instanceof
4.2 執(zhí)行環(huán)境及作用域
執(zhí)行環(huán)境:定義了變量和函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定他們各自的行為。每個執(zhí)行環(huán)境對應(yīng)有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在變量對象中。
全局執(zhí)行環(huán)境是最外層的執(zhí)行環(huán)境,宿主環(huán)境不同,表示執(zhí)行環(huán)境的對象也不同,瀏覽器中全局環(huán)境被認為是window對象,所有全局變量和函數(shù)都是作為window對象那個的屬性和方法創(chuàng)建的。某個執(zhí)行環(huán)境中所有代碼執(zhí)行完畢后,環(huán)境銷毀,其變量和函數(shù)也隨之銷毀,全局環(huán)境則在瀏覽器關(guān)閉后銷毀。
每個函數(shù)都有自己的執(zhí)行環(huán)境,執(zhí)行流進入一個函數(shù),函數(shù)環(huán)境被推入環(huán)境棧中,執(zhí)行完后彈出棧。
代碼在環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。用途:保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)有序訪問。作用域鏈前端,是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對象。若環(huán)境是函數(shù),其活動對象作為變量對象。 活動對象最開始只包含arguments一個變量。作用域中另一個變量對象來自(外部)環(huán)境,下一個變量對象來自包含環(huán)境,這樣一直延續(xù)到全局。
4.2.1 延長作用域鏈
延長作用域鏈的兩種方式:
try-catch語句的catch塊
with語句
4.2.2 沒有塊級作用域
JavaScript沒有塊級作用域。
1.聲明變量:在全局聲明的變量任何地方都可用,局部環(huán)境中定義的變量只能在局部環(huán)境中訪問,未聲明直接賦值會創(chuàng)建一個全局變量。
2.查詢標識符:在某個環(huán)境中讀取或?qū)懭胍媚硞€標識符時,會從作用域鏈前端開始查找,向上逐級查詢,如果找到變量就緒,未找到會拋出錯誤。
4.3 垃圾收集
JavaScript具有自動垃圾收集機制,執(zhí)行環(huán)境會負責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。
4.3.1 標記清除
JavaScript中最常用的垃圾收集方式就是標記清除,當(dāng)變量進入環(huán)境就標記為進入環(huán)境,離開環(huán)境再標記為離開環(huán)境,最后垃圾收集器會把不再被環(huán)境中變量引用的變量的標記清除。
4.3.2 引用計數(shù)
不太常見的一種回收機制是引用計數(shù),跟蹤每個值被引用的次數(shù)。當(dāng)聲明一個變量并將引用類型的值賦給該變量時,引用次數(shù)為1,同一個值又賦給另一個變量時,引用次數(shù)加1,若包含該值的變量又引用了其他值時,引用次數(shù)減1,當(dāng)引用次數(shù)為0時回收,問題:循環(huán)引用無法回收。
4.3.3 性能問題
垃圾收集器是周期性運行的
4.3.4 管理內(nèi)存
不再使用的對象盡量用null來清空引用,以便回收內(nèi)存
第5章 引用類型
詳盡的介紹了JavaScript中所有的引用類型及相應(yīng)方法,以及從瀏覽器角度給了介紹。
引用類型的值(對象)是引用類型的一個實例。引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起,通常被稱作類(不恰當(dāng)),JavaScript沒有類和接口這種結(jié)構(gòu)。
5.1 Object類型
大多數(shù)引用類型都是Object類型的實例。兩種創(chuàng)建方式:new操作符后跟Object構(gòu)造函數(shù),另一種是字面量方式(字面量方式實際上不會調(diào)用Object構(gòu)造函數(shù))。Object也是ECMAscript中使用最多的一個類型。
5.2 Array類型
Array類型(數(shù)據(jù)的有序列表)是除Object類型最常出現(xiàn)的類型,與其他語言有所不同,每一項可放任何類型的值,數(shù)組大小是可以動態(tài)調(diào)整的。
兩種創(chuàng)建方法:用new操作符 var arr = new Array(); ? 字面量:var arr = [1,2,3]; ? ? length屬性代表數(shù)組長度。
5.2.1 檢測數(shù)組
1. instanceof ? ?但是如果不是唯一的全局執(zhí)行環(huán)境,存在兩個以上不同版本的Array構(gòu)造函數(shù),如果從一個框架向另一個傳遞數(shù)組,傳入的數(shù)組與第二個框架中原生數(shù)組分別具有各自不同的構(gòu)造函數(shù)。
2. Array.isArray(value) 確定某個值到底是不是數(shù)組,不管它在哪個全局環(huán)境中創(chuàng)建的。
5.2.2 轉(zhuǎn)換方法
所有對象都有valueOf()、toString()和toLocaleString()方法。調(diào)用數(shù)組的toString()方法返回有數(shù)組中每個值字符串形式拼接而成的以逗號分隔的字符串;調(diào)用valueOf()方法返回還是數(shù)組。
join()方法接受一個參數(shù),返回包含所有數(shù)組項的字符串,分隔符是接受的參數(shù)。
5.2.3 棧方法(修改原數(shù)組)
ECMAscript提供了一種讓數(shù)組類似于其它數(shù)據(jù)結(jié)構(gòu)的方法。棧是一種LIFO(后進先出)的數(shù)據(jù)結(jié)構(gòu)。push()和pop()方法可以實現(xiàn)類似棧的行為。
push()方法接受任意數(shù)量的參數(shù),把它們逐個添加到末尾。
pop()方法從數(shù)組末尾移除最后一項,減少數(shù)組length值,返回移除項。
5.2.4 隊列方法(修改原數(shù)組)
隊列數(shù)據(jù)結(jié)構(gòu)的訪問方式是FIFO(先進先出),結(jié)合shitf()和push()方法可模擬隊列結(jié)構(gòu)。同時還有一個unshift()方法是從數(shù)組開始添加任意項,可與pop()方法結(jié)合使用從反方向模擬隊列。
5.2.5 重排序方法(修改原數(shù)組)
重排序方法:reverse()和sort()方法
reverse()方法反轉(zhuǎn)數(shù)組順序,sort()方法是按照Unicode方式排序,可接受一個函數(shù)參數(shù),進行自定義排序。
5.2.6 操作方法
操作方法:
concat():拼接數(shù)組,參數(shù)可接受任意值或者數(shù)組。 ? ? ? ? ? ? ? ? ?//未修改原數(shù)組,返回新數(shù)組
slice():截取數(shù)組,接受兩個參數(shù),起始和結(jié)束位置下標。如果只傳一個參數(shù)則截取到結(jié)束為止,可傳負數(shù)。 //同上
splice(): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //修改原數(shù)組
刪除:接受兩個參數(shù),要刪除的第一項的位置,刪除的項數(shù)
插入:只指定三個參數(shù),起始位置,0(要刪除的項數(shù)),要插入的項(任意項)
替換:只指定三個參數(shù),起始位置,2(要替換的項數(shù)),替換的項(任意項)
5.2.7 位置方法
ECMAscript5添加了兩個位置方法:indexOf()從前往后查找,找到返回位置索引;從后往前查找lastIndexOf(),找到返回位置索引;查找不到返回-1,這兩個方法(全等查找)都接受兩個參數(shù):要查找的項和查找起始位置索引。
5.2.8 迭代方法
ECMAscript5位數(shù)組定義了五個迭代的方法。每個方法都接受兩個參數(shù):要在每一項上運行的函數(shù)和(可選的)運行該函數(shù)的作用域?qū)ο?----影響this值。傳入這些方法中的函數(shù)接受三個參數(shù):數(shù)組項的值,該項在數(shù)組中位置,數(shù)組對象本身。
*every():對數(shù)組中每一項運行給定函數(shù),若該函數(shù)對每一項都返回true,則返回true
*filter():對數(shù)組中每一項運行給定函數(shù),返回該函數(shù)返回true的項的數(shù)組
*forEach():對數(shù)組中每一項運行給定函數(shù),沒有返回值
*map():對數(shù)組中每一項運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組
*some():對數(shù)組中每一項運行給定函數(shù),該函數(shù)對任一項返回true則返回true
5.2.9 歸并方法
ECMAscript5中兩個縮小數(shù)組方法:reduce()從前往后;reduceRight()從后往前,都會迭代數(shù)組所有項,構(gòu)建一個返回值。
這兩方法接受兩個參數(shù):一個是在每一項上調(diào)用的函數(shù)和(可選)作為縮小基礎(chǔ)的初始值。函數(shù)可接受四個值:前一個值、當(dāng)前值、項的索引、數(shù)組對象。
例:var arr = [1,2,3,4];
var sum = arr.reduce(function(prev,cur,index,array){ ? ? ?//10
? ? return prev + cur;
});
5.3 Date類型
ECMAscript中Date類型是在Java中java.util.Date基礎(chǔ)上構(gòu)建的。使用UTC類型(1970年1月1日零時經(jīng)過的毫秒數(shù))
操作方法:
Date.parse():接收一個表示日期的字符串參數(shù)(月/日/年 ? ? ?英文月名 日,年 ? ? ? 英文星期幾 月 日 年 時:分:秒 時區(qū) ? ? ? ? ? ?YYYY-MM-DDTHH:mm:ss:sssZ)。例:var time = new Date(Date.parse("May 25,2004"));
Date.UTC():返回表示日期的毫秒數(shù),var time = new Date(Date.UTC(2000, 4, 5, 17, 55, 55));
5.3.1 繼承的方法
與其他引用類型一樣Date類型重寫了toString()、toLocaleString()和valueOf()方法。toLocaleString()方法會按照與瀏覽器設(shè)置的地區(qū)相適應(yīng)的格式返回日期和時間;toString()方法返回帶有時區(qū)信息的日期和時間。不同瀏覽器有差異。valueOf()方法返回日期的毫秒數(shù)。
5.3.2 日期格式化方法
日期格式化方法:
toDateString():以特定于實現(xiàn)的格式顯示星期幾、月、日和年
toTimeString():顯示時、分、秒和時區(qū)
toLocaleDateString():以特定于地區(qū)的格式顯示星期幾、月、日和年
toLocaleTimeString():以特定于實現(xiàn)的格式顯示時、分、秒
toUTCString():以特定于實現(xiàn)的格式顯示完整UTC日期(toGMTString()類似,保證向后兼容)
5.3.3 日期時間組件方法
? ? ?獲取方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置方法
getTime()返回毫秒數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?setTime(毫秒)以毫秒數(shù)設(shè)置日期
getFullYear()取得四位數(shù)年份 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setFullYear()設(shè)置日期年份
getMonth()返回日期中月份 從0開始算起 ? ? ? ? ? ? ? ? ? ? ? ? setMonth()設(shè)置日期月份
getDate()返回日期月份中天數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setDate()設(shè)置日期月份中天數(shù)
getDay()返回日期中星期幾 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?setDay()設(shè)置日期中星期幾
getHours()返回小時,從0開始算起 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?setHours設(shè)置小時
getMinutes()返回分鐘數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setMinutes()設(shè)置分鐘數(shù)
getSeconds()返回秒 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setSeconds()設(shè)置秒
getMiliseconds()返回毫秒數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? setMiliseconds()設(shè)置毫秒
5.4 RegExp類型(暫時沒看)
ECMAscript通過RegExp類型支持正則表達式。var reg = /pattren/flags;
pattren:正則表達式 ? g:全局匹配模式 ? i:不區(qū)分大小寫 ? ?m:多行模式
5.5 Function類型
每個函數(shù)都是Function類型的實例,與其它引用類型一樣有屬性和方法,由于函數(shù)是對象,函數(shù)名實際上是指向函數(shù)對象的一個指針。不推薦用new操作符來定義函數(shù),因為會解析兩次影響性能。(第一次常規(guī)解析,第二次解析傳入構(gòu)造函數(shù)的字符串)
5.5.1 沒有重載
將函數(shù)名想象成指針就很好理解。
5.5.2 函數(shù)聲明與函數(shù)表達式
解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時,對函數(shù)聲明和函數(shù)表達式并非一視同仁,而是先讀取函數(shù)聲明(聲明提前),待解析器執(zhí)行到它所在代碼行時才解析表達式。
5.5.3 作為值的函數(shù)
ECMAscript中函數(shù)本身就是變量,所以函數(shù)可以作為值來說使用。既可以向參數(shù)那樣傳遞又可以作為另一個函數(shù)的結(jié)果返回。
5.5.4 函數(shù)內(nèi)部屬性
函數(shù)內(nèi)部有兩個特殊的對象:arguments和this。arguments類數(shù)組對象保存著傳入函數(shù)的所有參數(shù),雖然主要用途是保存函數(shù)參數(shù),但它還有一個屬性callee,該屬性是一個指針 ,指向擁有這個arguments對象的函數(shù)。
例:經(jīng)典階乘函數(shù)
function factorial(num){
? ? if(num <= 1){
? ? ? ? return 1;
? ? }else{
? ? ? ? return num * factorial(num - 1);
? ? }
}
定義階乘一般用到遞歸算法,如上所示。在函數(shù)有名字且名字不變的情況下,上邊這樣寫沒問題,但問題是這個函數(shù)的執(zhí)行與函數(shù)名緊緊耦合在一起。
function factorial(num){
? ? if(num <= 1){
? ? ? ? return 1;
? ? }else{
? ? ? ? return num * arguments.callee(num - 1);
? ? }
}
如上這樣寫,沒有再引用函數(shù)名,無論引用函數(shù)時使用什么名字,都能正常完成遞歸調(diào)用。
函數(shù)內(nèi)部另一個特殊對象就是this,this引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對象(若當(dāng)在網(wǎng)頁全局作用域中調(diào)用函數(shù),this對象引用的就是window)。
ECMAscript5也規(guī)范了另一個函數(shù)對象的屬性:caller,保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用。若果是在全局作用域中調(diào)用,則是null。
function outer(){
? ? inter();
}
function inter(){
? ? alert(inter.caller) ? ? ? ? ? //顯示outer函數(shù)源代碼
}
重寫之后:
function outer(){
? ? inter();
}
function inter(){
? ? alert(interarguments.callee.caller) ? ? ? ? ? //實現(xiàn)了更松散的耦合
}
5.5.5 函數(shù)屬性和方法
ECMAscript中函數(shù)是對象,每個函數(shù)都包含兩個屬性:length和prototype。length表示函數(shù)希望接受命名參數(shù)個數(shù);對于引用類型來說,prototype是保存著它們所有實例方法的真正所在。比如說toString()和valueOf()方法就是保存在prototype中,只不過是通過各自的實例對象訪問罷了。prototype屬性不可枚舉,所以使用for-in無法發(fā)現(xiàn)。
每個函數(shù)包含兩個非繼承來的方法:apply()和call()。用途都是在特定的作用域中調(diào)用函數(shù),實際上相當(dāng)于設(shè)置函數(shù)體內(nèi)this對象的值。
apply():接受兩個參數(shù),一個是在其中運行函數(shù)的作用域,另一個是參數(shù)數(shù)組(可以是Array實例也可以是arguments對象)。
例:function sum(num1,num2){
? ? return num1 + num2;
}
function callSum1(num1,num2){
? ? return sun.apply(this,arguments); ?//傳入arguments對象
}
function callSum1(num1,num2){
? ? return sun.apply(this,[num1, num2]); ?//傳入數(shù)組
}
callSum1(10,10); ? ? //20callSum2(10,10); ? ? //20
call():和apply用法相同只是接受參數(shù)方式不同,參數(shù)this一樣,其余參數(shù)都是一個個直接傳遞給函數(shù)。call(this,num1,num2)
用途:可以擴充函數(shù)賴以運行的作用域 ? ? ? 好處:對象與方法不需要有任何的耦合關(guān)系
window.color = "red";
var o = {color: "blue"};
function sayColor(){
? ? alert(this.color);
};
sayColor.apply(this); ? ? ? ? ? ? //red
sayColor.apply(window); ? ?//red
sayColor.apply(o); ? ? ? ? ? ? ? //blue
ECMAscript5中還定義了一個方法:bind(),該方法會創(chuàng)建一個函數(shù)的實例,其this值會被綁定到傳給bind()函數(shù)的值。
window.color = "red";
var o = {color: "blue"};
function sayColor(){
? ? alert(this.color);
};
var newFun = sayColor.bind(o);
newFun(); ? ? ? ? ? ? ? ?//blue
5.6 基本包裝類型
為了便于操作基本類型的值,ECMAscript還提供了三個特殊的引用類型:Boolean、Number和String,與其它引用類型相似,但又具有各自基本類型的特殊行為。每當(dāng)讀取一個基本類型時,后臺會創(chuàng)建一個對應(yīng)的包裝類型對象,方便我們調(diào)用一些方法處理數(shù)據(jù)。
引用類型與基本包裝類型主要區(qū)別是對象的生存期,new操作符創(chuàng)建的引用類型實例,在執(zhí)行流離開當(dāng)前作用域之前一直保存在內(nèi)存中,自動創(chuàng)建的包裝類型,只存在一行代碼執(zhí)行的瞬間。
5.6.1 Boolean類型
var falseObj = new Boolean(false);
var result = falseObj && true;
alert(result); ? ? ? ?//true ? 布爾表達式中所有對象都轉(zhuǎn)為true ? ? ? ?typeof falseObj ? ? 返回 ? object
5.6.2 Number類型
與Boolean類型一樣,也重寫了valueOf()、toString()和toLacaleString()方法。
將數(shù)值轉(zhuǎn)換為字符串方法:n.toFixed(2)返回保留小數(shù)點后兩位的字符串
格式化數(shù)值方法:n.toExponential(1)返回指數(shù)表示法(e表示法)
數(shù)值最合適的格式:n.toPrecision(2)返回合適格式的表示法
5.6.3 String類型
String類型是字符串的對象包裝類型。String類型實例都有一個length屬性。
String類型操作方法:
1.字符方法:str.charAt(i) ?返回指定位置字符 ? ? ?str.charCodeAt(i) ?返回指定位置字符Unicode碼
2.字符串操作方法:
concat():拼接字符串,返回拼接后的字符串
創(chuàng)建新字符串方法:
slice():返回被操作字符串的子字符串,含頭不含尾
substr():返回被操作字符串的子字符串,第一個參數(shù)起始位置,第二個是返回個數(shù)
substring():返回被操作字符串的子字符串,含頭不含尾
3.字符串位置方法:
indexOf()和lastIndexOf():接受兩個參數(shù),要搜索的字符串,開始位置;返回與之匹配的字符串位置,無匹配返回-1
4.trim()方法:
創(chuàng)建一個字符串副本,刪除前置和后綴空格
5.字符串大小寫轉(zhuǎn)換方法:
toLowerCase():轉(zhuǎn)小寫
toUpperCase():轉(zhuǎn)大寫
6.字符串模式匹配方法:
match():與調(diào)用RegExp的exec()方法本質(zhì)相同,接受一個參數(shù),要不是正則表達式,要不是RegExp對象
var text = "bat cat kat gat";
var pattern = /.at/;
var mat = text.match(pattern);
console.log(mat);
//["bat", index: 0, input: "bat cat kat gat"]
search():唯一參數(shù)與match()一樣,返回字符串中第一個匹配項的索引,未找到返回-1
replace():接受兩個參數(shù),第一個可以是正則表達式或者字符串,第二個可以是字符串或者函數(shù)
split():基于指定分隔符將字符串分隔成多個子字符串,放到一個數(shù)組中,可接受第二個參數(shù),指定數(shù)組大小
7.localeCompare()方法:
比較兩個字符串,如果字符串在字母表應(yīng)該排在字符串參數(shù)之前,返回一個負數(shù);如果等于字符串參數(shù)返回0;如果排在字符串 ? ?? 參數(shù)之后,返回一個正數(shù)
8.fromCharCode()方法:
接受一個或多個字符編碼,轉(zhuǎn)換成字符串,與charCodeAt()方法執(zhí)行相反的操作。
9.HTML方法:建議不要使用
5.7 單體內(nèi)置對象
內(nèi)置對象:不依賴宿主環(huán)境,在ECMAscript程序執(zhí)行之前即已經(jīng)存在,共有11個內(nèi)置對象,其中包含兩個單體內(nèi)置對象:Global和Math。
5.7.1 global對象
不屬于任何其他對象的屬性和方法,最終都是它的屬性和方法。所有在全局作用域中定義的變量和方法都屬于global對象。
1.URI編碼方法
encodeURI()和encodeURIComponent()方法對URI編碼,以便發(fā)送給瀏覽器。encodeURI()不會對本身屬于URI的特殊字符編碼;而encodeURIComponent()則會對它發(fā)現(xiàn)的所有非標準字符進行編碼。
decodeURI()和decodeURIComponent()對應(yīng)的解碼方法。
2.eval()方法
eval()方法想一個完整的ECMAscript解析器,將傳入的代碼解析,把結(jié)果插入到原位置。
3.global對象的屬性
4.window對象
ECMAscript沒指出如何直接訪問global對象,但web瀏覽器將這個全局對象作為window對象的一部分加以實現(xiàn)。
取得global對象的方法:
var global = function(){
? ? return this;
}
5.7.2 Math對象
1.Math對象屬性:
2.min()和max()方法:
確定一組數(shù)值中的最大值或最小值。
Math.max.apply(Math,arr)可以獲得一個數(shù)組中的最大值。
3.舍入方法:
Math.ceil():向上舍入
Math.floor():向下舍入
Math.round():標準四舍五入
4.Math.random()方法:
返回0至1之間的隨機數(shù),不包含0和1。
Math.floor(Math.random()*可能的數(shù)值+第一個可能的值):
Math.floor(Math.random()*10+1)返回1倒10之間隨機數(shù),第一個可能值1
5.其他方法: