javascript中的原生函式
- 通過建構函式(如 new String(“abc”))建立出來的是封裝了基本型別值(如 “abc”)的封裝物件。
var a = new String('abc'); typeof a; // 'object' a instanceof String; // true Object.prototype.toString.call(a); // [object String]
- 所有
typeof
返回值為’object’的物件(如陣列)都包含一個內部屬性 Class這個屬性無法直接訪問,一般通過 Object.prototype.toString(..) 來檢視
而且多數情況下, 物件內部的[[class]]
屬性和建立該物件的內建原生建構函式相對應, 但並非總是如此
// 對應的情況 Object.prototype.toString.call([1, 2, 3]); // '[object Array]' Object.prototype.toString.call(/regex-literal/i); // '[object RegExp]' // 例外情況, undefined和null的原生建構函式並不存在 Object.prototype.toString.call(undefined); // '[object Undefined]' Object.prototype.toString.call(null); // '[object Null]' // 對其他基本型別的值的情況, 則會返回其包裝物件 Object.prototype.toString.call('abc'); // '[object String]' Object.prototype.toString.call(42); // '[object Number]' Object.prototype.toString.call(true); // '[object Boolean]'
封裝物件包裝
- 應該儘量使用基本型別
- 可以使用Object函式來自行封裝基本型別值
var a = 'abc';
var b = Object(a);
b instanceof String; // true
拆封
1. 使用valueOf()函式得到拆封物件中的基本值
var a = new String('abc');
a.valueOf(); // 'abc'
2. 在需要得到封裝物件的基本型別值的地方會發生隱式拆封
var a = new String('abc');
var b = a + '';
typeof a; //'object';
typeof b; // 'string'
原生函式作為建構函式
-
Array()
- 建構函式 Array(..) 不要求必須帶 new 關鍵字。不帶時,它會被自動補上。因此 Array(1,2,3) 和 new Array(1,2,3) 的效果是一樣的。
- 只有一個引數時,會將該引數作為建立陣列的預設長度,這樣建立出來的會是一個空陣列(真的是空的,就類似於delete之後的值),只不過其length屬性被設定為了特定的值,
var a = new Array(3); var b = [undefined, undefined, undefined]; var c = []; c.length = 3; a; // [empty × 3] b; // [undefined, undefined, undefined] c; // [empty × 3]
- 從 ES5 規範開始就允許在列表(陣列值、屬性列表等)末尾多加一個逗號(在實際處理中會被忽略不計)。所以如果你在程式碼或者除錯控制檯中輸入 [ , , , ],實際得到的是 [ , , ](包含三個空單元的陣列)
var ad = [, , , ,]; ad.length; // 4, 不是5
- 通過如下方式建立undefined單元的陣列
Array.apply(null, {length: 3}); // [undefined, undefined, undefined], 可以理解為apply內部有一個for迴圈, 從0開始迴圈到length,以從中取值, 假設apply內部的陣列是arr, 那麼就是從中取arr[0], arr[1], arr[2], 都是undefined
-
Object(), Function(), RegExp()
- 儘量不要使用這3個函式作為建構函式
- 使用物件常量語法建立物件可以更加方便的新增屬性
- Funtion(),當需要動態定義函式引數和函式體時使用Function()作為建構函式
- 正則儘量也使用常量語法, 因為js引擎會在程式碼執行前對其進行預編譯和快取, 但RegExp()在需要動態構建正規表示式時也是很有用的,eg:
var name = 'Kyle'; var namePattern = new RegExp('\\b(?:)' + name + ') + \\b', 'ig'); var matches = someText.match(namePattern);
- 儘量不要使用這3個函式作為建構函式
- Date()和Error()
- Date()
- 建立日期物件必須使用
new Date()
,Date()
可以帶引數,用來指定日期和時間,不帶引數使用獲取的是當前的日期和時間 - Date()主要用來獲取當前的Unix時間戳,(從1970年1月1日,以秒為單位),該值可以通過日期物件中的
getTime()
來獲得 - 從ES5開始,可以使用靜態函式
Date.now()
獲取這個值
- 建立日期物件必須使用
- Error()
- 與前面的Array()類似,可以不帶
new
關鍵字 - 建立錯誤物件主要是為了獲取當前執行棧的上下文
- 除了Error()之外,還有一些針對特定錯誤型別的原生建構函式,如
EvalError()
,RangeError()
,ReferenceError()
,SyntaxError()
,TypeError()
,URIError()
等,這些建構函式很少直接使用, 只是在程式發生異常時自動呼叫
- 與前面的Array()類似,可以不帶
- Date()
-
Symbol()
符號是具有唯一性的特殊值(並非絕對),用它來命名物件屬性不容易導致重名
var mysym = Symbol('my own symbol'); mysys; // Symbol(my own symbol) mysys.toString(); // "Symbol(my own symbol)" typeof mysys; // 'symbol'
雖然符號實際上並非私有屬性(通過 Object.getOwnPropertySymbols(..) 便可以公開獲得物件中的所有符號),但它卻主要用於私有或特殊屬性。很多開發人員喜歡用它來替代有下劃線(_)字首的屬性,而下劃線字首通常用於命名私有或特殊屬性
原生原型
建構函式的原型包含它們各自型別所特有的行為特徵,但是有些原型比較特殊:
Function的原型是一個函式,正規表示式的原型是一個空正規表示式, 陣列的原型是一個陣列
typeof Function.prototype; // 'function'
typeof RegExp.prototype; // '"/(?:)/"——空正規表示式'
"abc".match( RegExp.prototype ); // [""]
Array.isArray(Array.prototype); // true
相關文章
- javascript中的函式JavaScript函式
- JavaScript學習筆記 - 原生函式JavaScript筆記函式
- 學習並運用JavaScript的原生函式JavaScript函式
- javascript中的trim函式JavaScript函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- Chrome DevTools:在 Profile 效能分析中顯示原生 javascript 函式ChromedevJavaScript函式
- JavaScript中的函式繼承JavaScript函式繼承
- javascript函式中with的介紹JavaScript函式
- TypeScript 中函式的理解?與 JavaScript 函式的區別?TypeScript函式JavaScript
- (譯) JavaScript中的組合函式JavaScript函式
- javascript中generator函式的介紹JavaScript函式
- 對JavaScript中函式物件的理解JavaScript函式物件
- 理解 JavaScript 中的高階函式JavaScript函式
- 深入理解 JavaScript 中的函式JavaScript函式
- JavaScript中的立即執行函式JavaScript函式
- 理解JavaScript中函式方法JavaScript函式
- 使用Chrome開發者工具研究JavaScript裡函式的原生實現ChromeJavaScript函式
- javascript原生封裝一個淡入淡出效果的函式JavaScript封裝函式
- 原生javascript實現的節點複製cloneNode()函式用法JavaScript函式
- JavaScript 中函式節流和函式去抖的講解JavaScript函式
- [譯] JavaScript中的函式柯里化JavaScript函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- 深入認識javascript中的eval函式JavaScript函式
- jQuery函式的等價原生函式程式碼示例jQuery函式
- 學習筆記:javascript中的Generator函式筆記JavaScript函式
- 【JavaScript】徹底明白this在函式中的指向JavaScript函式
- Javascript ES6中的箭頭函式JavaScript函式
- 理解javascript中的回撥函式(callback)【轉】JavaScript函式
- java如何實現javascript中的eval函式JavaScript函式
- JavaScript中函式防抖、節流JavaScript函式
- javascript中的this使用場景以及箭頭函式中的thisJavaScript函式
- javascript 函式中的 this 的四種繫結形式JavaScript函式
- JavaScript裡的函式JavaScript函式
- javaScript函式JavaScript函式
- JavaScript中的函式過載(Function overloading)JavaScript函式Function
- 關於javascript中變數及函式的提升JavaScript變數函式
- jQuery遍歷函式,javascript中的each遍歷jQuery函式JavaScript
- 【譯】JavaScript中純函式是什麼JavaScript函式