JS高級程序設(shè)計3學(xué)習(xí)筆記(一)

? ? 有人說過,很多彎路到最后都成了直路,所有的坑到最后也都成了坦途;所謂的直路和坦途并不是擺在眼前的,都是不斷的的繞彎過程中掰正捋直的,都是摔得鼻青臉腫之后填平的。從離開學(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.其他方法:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內(nèi)容