《JavaScript高級程式設計》補充筆記1

来源:http://www.cnblogs.com/qzccl/archive/2016/04/21/5419083.html
-Advertisement-
Play Games

//<![CDATA[ //這裡放代碼 //]]> 基本類型 引用類型 動態添加屬性 不可以,不會出錯,但會出現underfined 可以 複製變數值 相互獨立 指向同一個對象,相互影響 傳遞參數(函數外部的值傳遞給函數內部) 相互獨立 指向同一個對象,相互影響,但是在函數內部重寫的值,不會影響外部 ...


  1. CData片段可以包含不需要被解析的任意格式的文本內容(在XHTML中用)

//<![CDATA[

       //這裡放代碼

//]]>

  1. 不支持瀏覽器的<script>,使用<noscript>會執行裡面的內容
  2. 支持嚴格模式的要在IE10+、Firefox 4+、Safari 5.1+、Opera 12+、Chrome
  3. 函數體內可以使用arguments來訪問參數數組,從而獲取到傳給函數的每一個參數,arguments和傳給函數的參數的記憶體空間是獨立的,只是值是同步的,但是當arguments的下標超出傳給函數的參數個數的話,就會出現underfined
  4. 函數沒有重載,只會後面一個覆蓋前一個,但是根據傳入參數的個數和類型不同,可以模仿方法的重載
  5.  

 

基本類型

引用類型

動態添加屬性

不可以,不會出錯,但會出現underfined

可以

複製變數值

相互獨立

指向同一個對象,相互影響

傳遞參數(函數外部的值傳遞給函數內部)

相互獨立

指向同一個對象,相互影響,但是在函數內部重寫的值,不會影響外部,函數已執行完就會銷毀

  1. 作用域鏈是保證執行環境有權訪問的所有變數和函數的有序訪問。比如標識符解析,在函數中,就是從內而外,逐級查找,直到找到標識符,如果最後找不到就會出錯。

執行環境的類型有全局和局部(函數),如果要加長作用域鏈的話,可以使用:

(1)       try-catch中的catch

(2)       with語句

  1. js沒有塊級作用域,所以在if或者for語句迴圈完之後,if中的變數聲明會被提價到當前的執行環境當中,for語句的i也會在迴圈結束之後依舊存在於迴圈外部的全局環境中,即最接近的環境當中
  2.   

函數聲明

函數表達式

解析器優先讀取,以便在執行任何代碼之前可以訪問

要等到執行到它所在的代碼行才會被執行

  1. 函數

                                      

arguments(對象)

保存函數參數

callee(arguments的屬性)

是一個指針,指向擁有arguments的函數

比如:arguments.callee(n-1)【在嚴格模式下會出錯】

this(對象)

函數執行的環境

caller(對象的屬性)

保存調用當前函數的函數引用

比如:arguments.callee.caller

length(屬性)

函數接受命名參數的個數

prototype(屬性)

保存實例方法

bind(方法) IE9+

創建函數的實例,this的值會被綁定給傳到bind()函數的值,比如:fn.bind(o)

非繼承來的方法,在特定的作用域中調用函數,強大之處在於擴充函數運行的作用域

apply()

傳入兩個參數,第一個是運行函數的作用域,第二個是參數數組,比如:

sum.apply(this, arguments)或者sum.apply(this,[n1,n2])

call()

傳入參數,第一個是運行函數的作用域,剩下的是每一個參數

 

     
  1. 基本包裝轉換類型

Number (n = 10)

.toFixed(2)  == 10.00

四捨五入顯示幾位小數,IE8不能四捨五入

.toExponential()  == 1.0e+1

返回指數表示法

.toPrecision(n)

返回小數或整數或指數,n幾位顯示幾位

String (a=”hello”)------------m,n正數

.charAt(1)  或者a [1]【IE8】

給定位置的字元

.charCodeAt(1)

給定位置的字元的編碼

.concat( , , ,)

拼接任意個的參數

.slice(m)/.substring(m)/.substr(m)

從m位置起的字元串

.slice(m,n)/ . substring (m,n)

從m位置起到n-1的字元串

. substr (m,n)

從m位置起,數n個字元的字元串

.slice(-m)

從(-m+字元串長度)開始數起

.substring(-m)

所有負數都會被轉化成0,從0位置開始

.substr(-m)

從(負的第一個參數+字元串長度)開始數起。

負的第二個參數會被轉換成0

.slice(m,-n)

從m位置起到(-n+字元串長度-1)的字元串

. substring (m,-n)

從m位置起到0的字元串

. substr (m,-n)

從m位置起,數0個字元的字元串==””

.indexOf(“h”)

從頭開始查找,第一次出現的字元位置,可以指定開始查找的位置.indexOf(“h”,5)

.lastIndexOf(“h”)

從後開始查找,第一次出現的字元位置,可以指定開始查找的位置. lastIndexOf (“h”,5)

.trim()

刪除首碼和尾碼的所有空格

.mach(re)

匹配,返回的是數組

.search(re)

匹配,查找返回的第一個位置

.replace(“”/re,””)

替換

.split(“,”/”,”,2/re)

分隔字元串,存放在數組中,第二個參數是數組大小

.localCompare(“”)

比較字元串,大於1,小於-1,等於0

$$

$

$&

匹配整個模式的字元串,與RfgExp.lastMatch一樣

$’

匹配子字元串之前的字元串,與RfgExp.leftContext一樣

$`

匹配子字元串之前的字元串,與RfgExp.rightContext一樣

$n

捕獲第n(0~9)個組的字元串,比如

text($1)

$nn

捕獲第n(00~99)個組的字元串

  1. 單體內置對象

encodeURI

編碼,不包含:/?#

encodeURIComponent

編碼,包含特殊字元

decodeURI

 

decodeURIComponent

 

eval()

只接受一個參數,可以創建任何變數和函數,在嚴格模式下會出錯

  1.  

Array

toString()

數組返回字元串,項之間用,隔開,基本類型

valueOf()

返回的還是數組,引用類型

join(“|”)

給數組改變分隔符或其他

push()

向末尾插入項

pop()

取得最後一項,並移除

unshift()

向數組開頭插入項

shift()

取得第一項,並移除

concat()

創建新的數組,裡面的參數是新加入的項

.slice()

使用與String相同

.splice()

1/刪除:指定兩個參數,第一個是刪除的位置,第二個是刪除的個數

2/插入:指定3個參數,第一個是插入的位置,第二個是0,之後的是插入的項,可多個用,隔開

3/提換:指定3個參數,第一個是插入的位置,第二個是1,之後的是插入的項,可多個用,隔開

.indexOf()

從頭開始查找,IE9+

.lastIndexOf()

從後開始查找,IE9+

reverse()

反轉數組

迭代方法

every()

全true則true

some()

有true則true

filter()

返回true的組成數組

map()

每個項通過函數調用後的結果返回數組

forEach()

沒有返回值

歸併方法

reduce()

從頭遍歷到末尾,構建一個最終返回值

reduceRight()

從末尾遍歷到頭,構建一個最終返回值

排序函數

sort()

排序,從小到大, s.sort(compare)

升序

降序

function compare(value1, value2) {
if (value1 < value2) {
   return 1;
} else if (value1 > value2) {
   return -1;
} else {
   return 0;
}

}

使用:s.sort(compare)

function compare(value1, value2) {
if (value1 < value2) {
    return -1;
} else if (value1 > value2) {
    return 1;
} else {
    return 0;
}

}

使用:s.sort(compare)

  1. IE9+

(1)       修改屬性類型:

Object.defineProperty(對象,“對象的屬性”,{設置修改的屬性})

(2)       定義屬性:

Object.defineProperty(對象,{對象的屬性。。。})

(3)       讀取屬性的特性:  x.value=取出值

var x = Object.getOwnPropertyDescriptor(對象, "對象的屬性");

  1.  

工廠模式

用函數來封裝以特定介面創建對象

沒有對象識別

構造函數模式

 

直接將方法和屬性賦值給this

沒有return

沒有顯示創建對象

原型模式

prototype

1、  Fn.prototype.constructor 指向構造函數

2、  確定對象之間是否存在關係

Fn.prototype.isPrototypeOf(fn1)

3、  找到對象的原型  IE9+

Object.getPrototypeOf(fn1)

4、  屬性是存在於原型中還是實例中

fn1.hasOwnPrototype(“屬性”)【來自實例返回true、來自原型返回false】

5、  對象能夠訪問屬性 in

(“屬性”  in  fn1);【實例和原型都返回true】

6、  for in 查看原型中和實例中的屬性

7、  Object.keys()接受一個對象作為參數,返回一個可枚舉屬性的字元串數組。

8、  不管可不可以枚舉,都列出來的話:

Object.getOwnPropertyNames(Fn.prototype);

1、屬性和方法都是實例共用的

2、如果在外面重新給對象賦值,會直接阻止訪問原型中的那個屬性,但是如果在外部將這個屬性設為null,也不會查找原型中的屬性,只有通過delete來刪除,可以重新訪問原型中的屬性

3、如果將原型改寫為對象字面量的形式,constructor指向的是Object構造函數,如果constructor很重要,那就在對象字面量中將

constructor:函數名

(1)       確定該屬性到底是存在於對象中,在原型中返回true,在實例中返回false

function hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);

}

 

(2)       查看原型中和實例中的屬性  for in

[1]       查看原型中的屬性

var per = new Person();

                   for (var prop1 in per) {

                   console.info(prop1)

  }

 

 

[2]       查看實例中的屬性

var o = {

         name: "Nicholas",

         age: 29,

         job: "Software Engineer"

};

for (var prop in o) {

         console.info(prop)

}

 

  1. 遞歸的時候arguments.callee在嚴格模式下會出錯,因此可以使用命名函數來完成:
var factorial = (function f(num){
if (num <= 1){
  return 1;
} else {
  return num * f(num-1);
}

});

 

  1. 閉包:是指有權訪問另一個函數作用域中變數的函數,一般是一個函數內部創建另一個函數
  2. 創建私有領域可以減少閉包占用的記憶體問題,而且每個開發人員可以使用自己的變數,又不用擔心搞亂全局作用域。

(function(){

//塊級作用域

})();

  1. 靜態私有變數

 

 

     CData片段可以包含不需要被解析的任意格式的文本內容(在XHTML中用)

//<![CDATA[

       //這裡放代碼

//]]>

     不支持瀏覽器的<script>,使用<noscript>會執行裡面的內容

     支持嚴格模式的要在IE10+Firefox 4+Safari 5.1+Opera 12+Chrome

     函數體內可以使用arguments來訪問參數數組,從而獲取到傳給函數的每一個參數,arguments和傳給函數的參數的記憶體空間是獨立的,只是值是同步的,但是當arguments的下標超出傳給函數的參數個數的話,就會出現underfined

     函數沒有重載,只會後面一個覆蓋前一個,但是根據傳入參數的個數和類型不同,可以模仿方法的重載

      

 

基本類型

引用類型

動態添加屬性

不可以,不會出錯,但會出現underfined

可以

複製變數值

相互獨立

指向同一個對象,相互影響

傳遞參數(函數外部的值傳遞給函數內部)

相互獨立

指向同一個對象,相互影響,但是在函數內部重寫的值,不會影響外部,函數已執行完就會銷毀

     作用域鏈是保證執行環境有權訪問的所有變數和函數的有序訪問。比如標識符解析,在函數中,就是從內而外,逐級查找,直到找到標識符,如果最後找不到就會出錯。

執行環境的類型有全局和局部(函數),如果要加長作用域鏈的話,可以使用:

(1)       try-catch中的catch

(2)       with語句

     js沒有塊級作用域,所以在if或者for語句迴圈完之後,if中的變數聲明會被提價到當前的執行環境當中,for語句的i也會在迴圈結束之後依舊存在於迴圈外部的全局環境中,即最接近的環境當中

       

函數聲明

函數表達式

解析器優先讀取,以便在執行任何代碼之前可以訪問

要等到執行到它所在的代碼行才會被執行

     函數

                                      

arguments(對象)

保存函數參數

callee(arguments的屬性)

是一個指針,指向擁有arguments的函數

比如:arguments.callee(n-1)【在嚴格模式下會出錯】

this(對象)

函數執行的環境

caller(對象的屬性)

保存調用當前函數的函數引用

比如:arguments.callee.caller

length(屬性)

函數接受命名參數的個數

prototype(屬性)

保存實例方法

bind(方法) IE9+

創建函數的實例,this的值會被綁定給傳到bind()函數的值,比如:fn.bind(o)

非繼承來的方法,在特定的作用域中調用函數,強大之處在於擴充函數運行的作用域

apply()

傳入兩個參數,第一個是運行函數的作用域,第二個是參數數組,比如:

sum.apply(this, arguments)或者sum.apply(this,[n1,n2])

call()

傳入參數,第一個是運行函數的作用域,剩下的是每一個參數

 

     

     基本包裝轉換類型

Number n = 10

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第五章和第六章間隔時間有點長,對不起大家了。下麵繼續。 本節教程將要教會大家如何載入本地通訊錄。 導入項目 導入通訊錄 自定義js模塊 發送和訂閱page消息 將要學習的demo效果圖如下所示 1. 導入完整項目 本節示例demo請參考下載地址,可以導入到設計器中學習。 這節教程中將要用到的組件有d ...
  • 今天要介紹的是走馬燈效果的製作,效果圖如下,頁面中‘Recent Posts’就是走馬燈部分。 現在我們介紹如何製作走馬燈,首先定義html頁面結構。 <div id="outer"> <header> ... </header> <article> ... </article> <aside> . ...
  • 在React中,一切都是看做組件。 而組件的嵌套也是十分常見的。 所以有的組件就作為容器組件 容器組件 React元素可以包含子元素 如 1 //JSX 2 <ezpanel title="title"> 3 <p>this is demo content</p> 4 </ezpanel> 在Rea ...
  • 儘管 JavaScript 歷史上使用冗長而令人生厭的代碼塊來標的特定瀏覽器的時期已經結束了,但是偶爾使用一些簡單的代碼塊和對象檢測來確保一些代碼在用戶機器上正常工作依然是必要的。 這篇文章中,我會略述一下 Internet Explorer 和 Firefox 在 JavaScript 語法上不同 ...
  • 知道這20個正則表達式,能讓你少寫1,000行代碼 正則表達式,一個十分古老而又強大的文本處理工具,僅僅用一段非常簡短的表達式語句,便能夠快速實現一個非常複雜的業務邏輯。熟練地掌握正則表達式的話,能夠使你的開發效率得到極大的提升。 正則表達式經常被用於欄位或任意字元串的校驗,如下麵這段校驗基本日期格 ...
  • line-height這個樣式相信大家一定不會陌生,我們經常用它來讓文本上下居中,這樣做一般不出出現什麼問題,但是如果對這個屬性不是很熟悉的話,可能會踩到一些坑,今天親自去試驗了一下,並總結了一下line-height的幾個特性。 首先line-height有以下幾種標準的寫法: 寫法1、line- ...
  • 1. 定義:Promise是抽象非同步處理對象以及對其進行各種操作的組件,它把非同步處理對象和非同步處理規則採用統一的介面進行規範化。 2. ES6 Promises 標準中定義的API: a) Constructor:採用new來實例化, var promise = new Promise(functi... ...
  • 只舉例火狐和谷歌.如果是火狐,一般是用firebug,首先確保開啟腳本調試: 然後刷新一下要調試的頁面,點擊firebug中的行內,選擇當前頁面: js文件一般直接顯示的是js文件的名字,而頁面一般是攔截的請求路徑,如上圖所示請求路徑為/login,顯示的是login. 選中頁面後就可以看到頁面的代 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...