很全面的JavaScript常用功能匯總集合
本文主要總結(jié)了JavaScript 常用功能總結(jié),如一些常用的額JS 對(duì)象,基本數(shù)據(jù)結(jié)構(gòu),功能函數(shù)等,還有一些常用的設(shè)計(jì)模式。
目錄:
眾所周知,JavaScript是動(dòng)態(tài)的面向?qū)ο蟮木幊陶Z(yǔ)言,能夠?qū)崿F(xiàn)以下效果:
- 豐富Web 網(wǎng)頁(yè)功能
- 豐富Web界面
- 實(shí)現(xiàn)本地或遠(yuǎn)程存儲(chǔ)。
- 實(shí)現(xiàn)分布式網(wǎng)絡(luò)應(yīng)用的前端組件,并在后臺(tái)進(jìn)行數(shù)據(jù)存儲(chǔ)管理。
- 使用JavaScript可以實(shí)現(xiàn)完整的分布式Web 應(yīng)用。
一、JavaScript 中的數(shù)據(jù)類型
JavaScript 提供三種元數(shù)據(jù)類型,string,number,和Boolean,可使用typeof(v) 測(cè)試變量V 的類型,typeof(v)==="number"
提供五種基本的引用類型:Object, Array, Function, Date 及RegExp。數(shù)組,函數(shù),日期和正則表達(dá)式是特殊類型,但是嚴(yán)格來(lái)講,日期和正則表達(dá)式是元數(shù)據(jù)類型,可封裝在其他對(duì)象中。
JS 中變量類型,數(shù)組元素類型,函數(shù)參數(shù)以及返回值的類型不需要聲明類型,類型之間的轉(zhuǎn)換是自動(dòng)執(zhí)行的。
變量值可以是:
- 1. 數(shù)值:如字符串,數(shù)字或布爾值。
- 2. 對(duì)象引用: 可引用典型對(duì)象,也可以是數(shù)據(jù),函數(shù),日期或正則表達(dá)式。
- 3. 特殊數(shù)據(jù)值,Null,是典型的用于初始化對(duì)象的默認(rèn)值。
- 4. 特殊數(shù)據(jù)undefined,常用于已被定義,但未賦值的變量。
string 是一系列的Unicode 字符串,String 如“hello world”,'A3FO'或空字符串“”,字符串連接可通過(guò)+操作符來(lái)執(zhí)行,也可以使用=號(hào)來(lái)驗(yàn)證兩個(gè)字符串是否相等;
if (firstName + lastName === "James Bond") ...
numeric 表示64位的浮點(diǎn)數(shù),在JS 中沒(méi)有明顯的區(qū)分整形和浮點(diǎn)數(shù),如果一個(gè)表達(dá)式的值不等于某個(gè)數(shù)字,那么它的值可設(shè)為NaN,表示非數(shù)字,可聯(lián)合isNaN使用。
如下表是詳細(xì)的類型測(cè)試和轉(zhuǎn)換
二、變量作用域范圍
目前,JavaScript,ES5提供兩種作用域類型:全局變量及函數(shù)作用域,沒(méi)有塊作用域。塊作用域的范圍不太明確,所以應(yīng)當(dāng)避免塊作用域的使用。如下代碼,盡管是開(kāi)發(fā)人員常用的Pattern,卻是一個(gè)陷阱。
function foo() { for (var i=0; i < 10; i++) { ... // do something with i } }
所有的變量聲明最好是在函數(shù)的開(kāi)始位置。在JS,ES6版本中支持塊作用域,采用關(guān)鍵字let 定義變量。
嚴(yán)格模式(Strict Mode)
從ES5開(kāi)始, 嚴(yán)格模式用于檢測(cè)運(yùn)行時(shí)的錯(cuò)誤,在嚴(yán)格模式下,所有的變量必須聲明,如果給未聲明的變量賦值會(huì)拋出異常。
在JavaScript 文件或<Script>元素內(nèi),通過(guò)輸入以下代碼切換到嚴(yán)格模式:
use strict;
建議采用嚴(yán)格模式,除非項(xiàng)目依賴的庫(kù)不兼容嚴(yán)格模式。
多種對(duì)象
JS中的對(duì)象概念不同于OO或UML中的對(duì)象,尤其是在JS中對(duì)象不需要實(shí)例化,也可以有自己的方法,不僅有property slots,也包含method slots。除此之外還包含key-value slots;因此他們總共有三種Slots, 而常見(jiàn)的對(duì)象只有屬性槽。
JS對(duì)象是由一系列的name-value 組成的Slot。而name 可以是屬性名稱,函數(shù)名稱,映射名稱。對(duì)象可通過(guò)一種特定的方式創(chuàng)建,使用JS 對(duì)象聲明語(yǔ)法(JSON),而不需要實(shí)例化一個(gè)類。代碼如下:
var person1 = { lastName:"Smith", firstName:"Tom"}; var o1 = Object.create( null); // an empty object with no slots
如果Slot 的name 是合法的JS 標(biāo)識(shí)符,則Slot可表示屬性,方法,或鍵值對(duì)。如果名稱含有一些特殊字符如空格,則Slot代表鍵值對(duì),是一種映射元素,如下:
Property Slot 中的name:
1. data value 屬性,在這種情況下,Value 表示變量值,或是值表達(dá)式。
2. object-valued 屬性,Value 表示對(duì)象的引用或?qū)ο蟊磉_(dá)式。
method Slot 表示的是JS 函數(shù),它的值是JS 函數(shù)定義表達(dá)式:
Object 屬性可以使用兩種方法來(lái)訪問(wèn):
1. 使用”.”(與C++ 和Java的類似):
person1.lastName = "Smith"
2. 使用map:
person1["lastName"] = "Smith"
JS 對(duì)象能夠用于各種途徑,以下是五種常見(jiàn)情況:
1. Record是Property slots集合,如:
var myRecord = {firstName:"Tom", lastName:"Smith", age:26}
2. map 如Hash map,數(shù)組,hash表;
var numeral2number = {"one":"1", "two":"2", "three":"3"}
3. Untyped 對(duì)象不需要實(shí)例化類,它可能包含property slot 和function slots:
var person1 = { lastName: "Smith", firstName: "Tom", getFullName: function () { return this.firstName +" "+ this.lastName; } }; Array List
JS array 即邏輯數(shù)據(jù)結(jié)構(gòu),通過(guò)數(shù)組下標(biāo)訪問(wèn)。如數(shù)組初始化:
var a = [1,2,3];
JS數(shù)組可動(dòng)態(tài)增長(zhǎng),因此數(shù)組索引有可能比實(shí)際元素個(gè)數(shù)多,如下:
a[4] = 7;
數(shù)組循環(huán):
for (i=0; i < a.length; i++) { ...}
數(shù)組是特殊的對(duì)象類型,因此有很多情況下,需要判斷變量是否為數(shù)組類型,使用IsArray方法:Array.isArray( a)。
添加新元素到數(shù)組:
a.push( newElement);
刪除:
a.splice( i, 1);
查找:
if (a.indexOf(v) > -1) ...
循環(huán):
var i=0; for (i=0; i < a.length; i++) { console.log( a[i]); }
如果數(shù)組較小,可使用foreach 循環(huán):
a.forEach( function (elem) { console.log( elem); })
JS 也提供克隆數(shù)組的函數(shù):
var clone = a.slice(0);
三、Maps
map 提供key 到值得映射。JS map 是一串字符集,可包含空格:
var myTranslation = { "my house": "mein Haus", "my boat": "mein Boot", "my horse": "mein Pferd" }
增加:
myTranslation["my car"] = "mein Auto";
刪除:
myTranslation["my car"] = "mein Auto";
查找:
if ("my bike" in myTranslation) ...
循環(huán):
var i=0, key="", keys=[];
keys = Object.keys( m);
for (i=0; i < keys.length; i++) {
key = keys[i];
console.log( m[key]);
}
如果map 較小可使用foreach 語(yǔ)句:
Object.keys( m).forEach( function (key) {
console.log( m[key]);
})
復(fù)制map
var clone = JSON.parse( JSON.stringify( m))
小結(jié):JavaScript 支持4種基本的數(shù)據(jù)結(jié)構(gòu)。
1:array lists:如["one","two","three"],special JS對(duì)象
2:records:特殊的JS 對(duì)象,如{firstName:"Tom", lastName:"Smith"};
3:maps: 如{"one":1, "two":2, "three":3}
4:entity 表:如下表所示,是一種特殊的map,值是有固定ID的記錄。
record,map,entity 在實(shí)際應(yīng)用中沒(méi)有明顯的區(qū)分,只是概念上的區(qū)分。對(duì)JS 引擎而言,都是對(duì)象。但是從概念上是有區(qū)分的。
四、函數(shù)
如表1 所示,函數(shù)是特殊的JS 對(duì)象,有name 屬性和length屬性表示參數(shù)的個(gè)數(shù),如下,判斷v是否指向函數(shù):
if (typeof( v) === "function") {...}
函數(shù)定義:
var myFunction = function theNameOfMyFunction () {...}
theNameOfMyFunction 是可選的,如果省略函數(shù)名稱,則稱該函數(shù)為匿名函數(shù)。通常,函數(shù)是通過(guò)變量來(lái)調(diào)用的,如上面的代碼,則表示
myFunction 會(huì)調(diào)用myFunction()函數(shù),而不是使用theNameOfMyFunction()調(diào)用。
匿名函數(shù)表達(dá)式在其他編程語(yǔ)言中稱為lambda 表達(dá)式。如下代碼是匿名函數(shù)。可以與預(yù)定義的sort函數(shù)對(duì)比:
var list = [[1,2],[1,3],[1,1],[2,1]]; list.sort( function (x,y) { return ((x[0] === y[0]) ? x[1]-y[1] : x[0]-y[0]); });
函數(shù)聲明:
function theNameOfMyFunction () {...}
與代碼
var theNameOfMyFunction = function theNameOfMyFunction () {...}
等價(jià);
聲明了函數(shù)theNameOfMyFunction ,并使用theNameOfMyFunction 變量來(lái)引用函數(shù)。
JS 提供函數(shù)內(nèi)聯(lián),closure機(jī)制允許JS 函數(shù)調(diào)用函數(shù)之外的使用變量。函數(shù)可以創(chuàng)建closure 來(lái)存儲(chǔ)當(dāng)前的環(huán)境。如下,不需要通過(guò)參數(shù)將外部變量的結(jié)果傳給內(nèi)部函數(shù),它本身就是可用的。
var sum = function (numbers) { var result = 0; numbers.forEach( function (n) { result += n; }); return result; }; console.log( sum([1,2,3,4]));
當(dāng)執(zhí)行一個(gè)方法時(shí),可以使用內(nèi)置arguments 對(duì)象訪問(wèn)函數(shù)內(nèi)的參數(shù),arguments 對(duì)象與數(shù)組使用方法類似,有長(zhǎng)度屬性,也有索引,并且可以使用For語(yǔ)句來(lái)循環(huán)迭代。但是由于它并不是Array 實(shí)例,因此JS arrary的部分方法無(wú)法應(yīng)用如foreach。
arguments 對(duì)象的元素個(gè)數(shù)與函數(shù)參數(shù)個(gè)數(shù)相同,也可以定義方法的時(shí)候不指定參數(shù)個(gè)數(shù),在調(diào)用時(shí),可為函數(shù)賦多個(gè)參數(shù),如:
var sum = function () { var result = 0, i=0; for (i=0; i < arguments.length; i++) { result = result + arguments[i]; } return result; }; console.log( sum(0,1,1,2,3,5,8)); // 20
方法是在構(gòu)造函數(shù)的原型上定義的,可以通過(guò)對(duì)象創(chuàng)建的構(gòu)造器調(diào)用,如Array.prototype.forEach;Array表示構(gòu)造器,調(diào)用類的實(shí)例作為上下文對(duì)象參考的,如下: 在foreach中numbers表示上下文對(duì)象:
var numbers = [1,2,3]; // create an instance of Array numbers.forEach( function (n) { console.log( n); });
無(wú)論原型方法是否被上下文對(duì)象調(diào)用,但是只要是參數(shù)為對(duì)象,可以使用JS函數(shù)的Call 方法來(lái)輔助調(diào)用對(duì)象。如下,我們可以使用foreach 循環(huán)方法:
var sum = function () { var result = 0; Array.prototype.forEach.call( arguments, function (n) { result = result + n; }); return result; };
Function.prototype.call方法和apply都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的 context 即上下文而存在的。
五、定義和使用類
類是面向?qū)ο笾械幕靖拍睿瑢?duì)象的實(shí)例化稱為類。JS中定義類需要滿足以下五個(gè)需求:
1.指定類的名稱,實(shí)例級(jí)別的屬性和方法,類級(jí)別的屬性和方法。
2. 是可預(yù)測(cè)的實(shí)力,能夠用于驗(yàn)證是否是某一對(duì)象的實(shí)例。
3. 實(shí)例級(jí)別的屬性用于檢測(cè)對(duì)象的直接類型。
4. 屬性繼承
5.方法繼承。
除此之外還支持對(duì)哦集成和多分類。
JS中對(duì)類沒(méi)有統(tǒng)一的定義規(guī)范,可以使用不同代碼模式來(lái)定義類,并應(yīng)用于多種不同的框架。JS中最常用的定義類的方法如下:
1. 構(gòu)造函數(shù)規(guī)范,可通過(guò)prototype chain實(shí)現(xiàn)方法繼承,并支持創(chuàng)建新的類實(shí)例。
2. factory 對(duì)象,用于預(yù)定義Object.create 方法來(lái)創(chuàng)建新實(shí)例。該方法中基于構(gòu)造函數(shù)的繼承機(jī)制可以被其他機(jī)制代替。
創(chuàng)建App都需要使用類,因此經(jīng)常需要定義類之間的關(guān)系,所以必須保證,使用相同類
六、Constructor-based classes
只有ES6引入了定義基于構(gòu)造器的類。新語(yǔ)法支持定義一些簡(jiǎn)單的類繼承,具體步驟如下:
Step 1.a 基類Person 具有兩個(gè)屬性,first Name 和Last Name,實(shí)例層的方法toString和靜態(tài)方法checkLastName;
class Person { constructor( first, last) { this.firstName = first; this.lastName = last; } toString() { return this.firstName + " " + this.lastName; } static checkLastName( ln) { if (typeof(ln)!=="string" || ln.trim()==="") { console.log("Error: " + "invalid last name!"); } } }
Step 1.b 類層次的屬性定義:
Person.instances = {};
在第二步中,會(huì)定義一個(gè)帶有其他屬性和方法的子類,也有可能重寫(xiě)父類的相關(guān)方法:
class Student extends Person { constructor( first, last, studNo) { super.constructor( first, last); this.studNo = studNo; } // method overrides superclass method toString() { return super.toString() + "(" + this.studNo +")"; } }
ES5中,可以定義繼承基于構(gòu)造器類的子類。如下:
Step1.a 首先定義構(gòu)造函數(shù),能夠隱式的定義類的屬性并賦值;
function Person( first, last) { this.firstName = first; this.lastName = last; }
注意,上述代碼中的this 指的是新生成的對(duì)象,當(dāng)構(gòu)造函數(shù)被調(diào)用時(shí),該對(duì)象就已經(jīng)生成了。
Step1.b 定義實(shí)例層的方法:
Person.prototype.toString = function () { return this.firstName + " " + this.lastName; }
Step 1.c 定義靜態(tài)方法:
Person.checkLastName = function (ln) { if (typeof(ln)!=="string" || ln.trim()==="") { console.log("Error: invalid last name!"); } }
Step 1.d 定義類層次的靜態(tài)屬性
Person.instances = {};
Step 2.a 定義子類:
1: function Student( first, last, studNo) {
2: // invoke superclass constructor
3: Person.call( this, first, last);
4: // define and assign additional properties
5: this.studNo = studNo;
6: }
通過(guò)調(diào)用超類的構(gòu)造函數(shù)Person.call( this, ...),來(lái)創(chuàng)建新對(duì)象。其中This指的是Student,Property Slots 在超類的構(gòu)造函數(shù)中已經(jīng)創(chuàng)建((firstName 和lastName) 以及其他子類相關(guān)的屬性。在這種情況下可使用Property Inheritance 機(jī)制保證所有的屬性已經(jīng)被定義且被創(chuàng)建。
Step2b,通過(guò)構(gòu)造函數(shù)的prototype 屬性安裝method inheritance 。如下,分配了一個(gè)新對(duì)象創(chuàng)建子類型構(gòu)造函數(shù)的Prototype 屬性,并做出適當(dāng)?shù)恼{(diào)整:
// Student inherits from Person Student.prototype = Object.create( Person.prototype); // adjust the subtype's constructor property Student.prototype.constructor = Student;
Step2c, 重新定義子類方法重寫(xiě)超類方法:
Student.prototype.toString = function () { return Person.prototype.toString.call( this) + "(" + this.studNo + ")"; };
基于構(gòu)造器類的實(shí)例化是通過(guò)應(yīng)用new 操作符來(lái)創(chuàng)建的,并提供合適的構(gòu)造參數(shù):
var pers1 = new Person("Tom","Smith");
方法toString 通過(guò)pers1. 來(lái)調(diào)用:
alert("The full name of the person are: " + pers1.toString());
在JS中,prototype 是具有method slots 的對(duì)象,可以通過(guò)JS方法或?qū)傩圆劾^承的。
七、基于Factory 的類
在該方法中定義了JS 對(duì)象Person,含有特殊的Create 方法來(lái)調(diào)用預(yù)定義的Object.Create方法,創(chuàng)建Person類型的對(duì)象;
var Person = { name: "Person", properties: { firstName: {range:"NonEmptyString", label:"First name", writable: true, enumerable: true}, lastName: {range:"NonEmptyString", label:"Last name", writable: true, enumerable: true} }, methods: { getFullName: function () { return this.firstName +" "+ this.lastName; } }, create: function (slots) { // create object var obj = Object.create( this.methods, this.properties); // add special property for *direct type* of object Object.defineProperty( obj, "type", {value: this, writable: false, enumerable: true}); // initialize object Object.keys( slots).forEach( function (prop) { if (prop in this.properties) obj[prop] = slots[prop]; }) return obj; } };
注意JS對(duì)象Person實(shí)際表示的是factory-based 類。factory-based類的實(shí)例化是通過(guò)調(diào)用它自己的Create方法實(shí)現(xiàn)的:
var pers1 = Person.create( {firstName:"Tom", lastName:"Smith"});
getFullName 方法是通過(guò)pers1. 調(diào)用的,如下:
alert("The full name of the person are: " + pers1.getFullName());
每個(gè)屬性的聲明都是使用Object.Create 聲明的,其中包含三個(gè)參數(shù)及值,'descriptors'writable: true and enumerable: true;如上面第五行的。
是不是一篇很贊的文章,果斷收藏吧!
相關(guān)文章
JS如何實(shí)現(xiàn)基于websocket的多端橋接平臺(tái)
我們?cè)谡{(diào)試過(guò)程使用的工具有:modheader,postman等,但這些工具都會(huì)存在的問(wèn)題:缺少客戶端里相應(yīng)的設(shè)備信息;即使將cookie信息復(fù)制出來(lái),也是存在過(guò)期的問(wèn)題;多個(gè)設(shè)備之間切換時(shí)不方便;針對(duì)這些存在的問(wèn)題,我基于websocket雙向通信的特點(diǎn),實(shí)現(xiàn)了多端橋接管理平臺(tái)2021-05-05使用cypress編寫(xiě)第一個(gè)測(cè)試用例
這篇文章主要為大家介紹了使用cypress編寫(xiě)第一個(gè)測(cè)試用例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06js監(jiān)聽(tīng)html頁(yè)面的上下滾動(dòng)事件方法
今天小編就為大家分享一篇js監(jiān)聽(tīng)html頁(yè)面的上下滾動(dòng)事件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09Webpack學(xué)習(xí)之動(dòng)態(tài)import原理及源碼分析
這篇文章主要為大家介紹了Webpack學(xué)習(xí)之動(dòng)態(tài)import原理及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)動(dòng)態(tài)生成表格
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)動(dòng)態(tài)生成表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11微信小程序項(xiàng)目實(shí)踐之驗(yàn)證碼倒計(jì)時(shí)功能
這篇文章主要介紹了微信小程序項(xiàng)目實(shí)踐之驗(yàn)證碼倒計(jì)時(shí)功能,當(dāng)用戶點(diǎn)擊發(fā)送驗(yàn)證碼按鈕,按鈕背景變色,不可點(diǎn)擊,顯示倒計(jì)時(shí)文字,需要的朋友可以參考下2018-07-07獲取JAVASCRIPT時(shí)間戳函數(shù)的5種方法
JavaScript獲得時(shí)間戳的方法有五種,后四種都是通過(guò)實(shí)例化時(shí)間對(duì)象new?Date()?來(lái)進(jìn)一步獲取當(dāng)前的時(shí)間戳,JavaScript處理時(shí)間主要使用時(shí)間對(duì)象Date,本文對(duì)js時(shí)間戳函數(shù)獲取方法給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-01-01