持續(xù)更新,主要方便于存一些筆記。
閉包
function f1() {
? var n = 999;
? function f2() {
? ? console.log(n);
? }
? return f2;
}
var result = f1();
result(); // 999
閉包就是函數(shù)f2,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。由于在 JavaScript 語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取內(nèi)部變量,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”。閉包最大的特點(diǎn),就是它可以“記住”誕生的環(huán)境,比如f2記住了它誕生的環(huán)境f1,所以從f2可以得到f1的內(nèi)部變量。在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。
(閉包的最大用處有兩個(gè),一個(gè)是可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量始終保持在內(nèi)存中)
function Person(name) {? var _age;
? function setAge(n) {
? ? _age = n;
? }
? function getAge() {
? ? return _age;
? }
? return {
? ? name: name,
? ? getAge: getAge,
? ? setAge: setAge
? };
}
var p1 = Person('張三');
p1.setAge(25);
p1.getAge() // 25
閉包的另一個(gè)用處,是封裝對(duì)象的私有屬性和私有方法。
注意,外層函數(shù)每次運(yùn)行,都會(huì)生成一個(gè)新的閉包,而這個(gè)閉包又會(huì)保留外層函數(shù)的內(nèi)部變量,所以內(nèi)存消耗很大。因此不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問題。
數(shù)據(jù)類型轉(zhuǎn)換
(自動(dòng)轉(zhuǎn)換)
'5' - '2' // 3
'5' * '2' // 10
true - 1? // 0
false - 1 // -1
'1' - 1? // 0
'5' * []? ? // 0
false / '5' // 0
'abc' - 1? // NaN
null + 1 // 1
undefined + 1 // NaN
注意:null轉(zhuǎn)為數(shù)值時(shí)為0,而undefined轉(zhuǎn)為數(shù)值時(shí)為NaN。
Js 遇到預(yù)期為數(shù)值的地方,就會(huì)將參數(shù)值自動(dòng)轉(zhuǎn)換為數(shù)值
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
Boolean函數(shù)可以將任意類型的值轉(zhuǎn)為布爾值。它的轉(zhuǎn)換規(guī)則相對(duì)簡(jiǎn)單:除了以下五個(gè)值的轉(zhuǎn)換結(jié)果為false,其他的值全部為true。undefinednull-0或+0NaN''(空字符串)
Number()函數(shù)一般轉(zhuǎn)為數(shù)值,除了混雜的,或者對(duì)象(數(shù)據(jù),除了[5]當(dāng)個(gè)數(shù)值),轉(zhuǎn)為NaN
原生錯(cuò)誤類型
var 1a;
// Uncaught SyntaxError: Invalid or unexpected token
SyntaxError對(duì)象是解析代碼時(shí)發(fā)生的語(yǔ)法錯(cuò)誤。
unknownVariable // Uncaught ReferenceError: unknownVariable is not defined
ReferenceError對(duì)象是引用一個(gè)不存在的變量時(shí)發(fā)生的錯(cuò)誤。
// ReferenceError: Invalid left-hand side in assignment
另一種觸發(fā)場(chǎng)景是,將一個(gè)值分配給無(wú)法分配的對(duì)象,比如對(duì)函數(shù)的運(yùn)行結(jié)果或者this賦值。
RangeError對(duì)象是一個(gè)值超出有效范圍時(shí)發(fā)生的錯(cuò)誤
TypeError對(duì)象是變量或參數(shù)不是預(yù)期類型時(shí)發(fā)生的錯(cuò)誤
URIError對(duì)象是 URI 相關(guān)函數(shù)的參數(shù)不正確時(shí)拋出的錯(cuò)誤
除了 JavaScript 原生提供的七種錯(cuò)誤對(duì)象,還可以定義自己的錯(cuò)誤對(duì)象。
function UserError(message) {
this.message = message || '默認(rèn)信息';
this.name = 'UserError'; }
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
上面代碼自定義一個(gè)錯(cuò)誤對(duì)象UserError,讓它繼承Error對(duì)象。然后,就可以生成這種自定義類型的錯(cuò)誤了。
new UserError('這是自定義的錯(cuò)誤!');
參考自:
JavaScript 標(biāo)準(zhǔn)參考教程(alpha) -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha)