JavaScript學習筆記01

sstd521發表於2016-09-29

原生函式

原生函式可以當做建構函式來使用,通過建構函式(如 new String("abc"))建立出來的是封裝了基本型別值(如 "abc")的封裝物件。

var  string = new String("abc");
console.log(string);  // [String: 'abc']
console.log(string instanceof String);  // true
console.log(typeof string);  // object
console.log(Object.prototype.toString.call(string));  // [object String]

內部屬性

所有typeof返回值為"object"的物件都包含了一個內部屬性,可以通過Object.prototype.toString(..)檢視。

console.log(Object.prototype.toString.call([1,2,3]))  // [object Array]
console.log(Object.prototype.toString.call(true))  // [object Boolean]
console.log(Object.prototype.toString.call(42))  // [object Number]

封裝物件包裝

基本型別沒有 .length.toString()等這樣的屬性和方法,需要封裝物件才可使用,此時JavaScript會為基本型別值自動包裝成一個封裝物件,瀏覽器對此也進行了優化,因此應優先考慮用基本型別值,而不是new String("abc")新物件。

var  a = "abc";
console.log(a.length); // 3
console.log(a.toUpperCase()); //ABC

一般不推薦直接使用封裝物件,如果想要自行封裝基本型別值,可以使用Object(..)函式(不帶new關鍵字)。

var a = "abc";
var b = new String(a);
var c = Object(a);
console.log(typeof a);  // string
console.log(typeof b);  // object
console.log(typeof c);  // object
console.log(b instanceof String);  // true
console.log(c instanceof String);  // true
console.log(Object.prototype.toString.call(b));  // [object String]
console.log(Object.prototype.toString.call(c)); // [object String]

拆封

如果想要得到封裝物件的基本型別值,可以使用valueof()函式:

var a = new String("abc");
var b = new Boolean(true);
a.valueof();  // "abc"
b.valueof();  // true

原生函式作為建構函式

建構函式Array(..)不要求必須帶new關鍵字,不帶時,系統會自動補上。Array建構函式只帶一個數字引數的時候,該引數會被當做陣列的預設長度,而非一個元素。

var a = Array(3);
console.log(a.length);  // 3

建立包含undefined的陣列:apply(..)是一個工具,適用於所有物件,它會以一種特殊的方式來呼叫傳遞給它的函式。第一個引數是this物件,第二個必須是一個陣列(或類陣列物件,array-like object),陣列中的值被用作函式的引數。

var a = Array.apply(null,{ length:3});
console.log(a);  // [ undefined, undefined, undefined ]

Object(..)、Function(..)、RegExp(..)

儘量不要使用Object(..)、Function(..)、Regexp(..),在實際情況中沒有必要使用new Object()來建立物件,因為這樣無法像常量形式那樣一次設定多個屬性,而必須逐一設定。強烈建議使用常量形式定義正規表示式,語法簡單、效率高。

Data(..)、Error(..)

建立日起物件必須使用new Date()Date(..)可以帶引數,用來指定日期時間,若不帶引數則使用當前的如期和時間。

console.log((new Date()).getDate());  // 28

建構函式Error(..),帶不帶new關鍵字都可以。

function foo(x) {
  if (!x)
  throw  Error("x not found");
}

Symbol(..)

基本資料型別,符號(Symbol)是具有唯一性的特殊值,用它來命名物件屬性不容易導致重名,符號還可以自行定義,以靜態屬性形式出現,如Symbol.create等、不能用new關鍵字建立。

var mysym  = Symbol("abcd");
console.log(mysym);  // Symbol(abcd)
var a = {};
a[mysym] = "apple";
console.log(a[mysym]);  // apple

原生原型

原生建構函式都有自己的.prototype物件,如Array.prototype等,這些物件包含其對應子型別所有的行為特徵。比如將字串封裝成字串物件,就可以訪問String.prototype中定義的方法。

根據文件約定,可將.prototype.替換為#,如String.prototype.trim()簡寫為String#trim()來去掉字串的前後空格,Array#concat(..)合併陣列,Number#tofixed(..)將數字轉換為指定長度的整數字符串,其他物件同樣如此。

Function.prototype是一個空函式,Array.prototype是一個空陣列,RegExp.prototype是一個空正規表示式,對未賦值的變數來說,它們是很好的預設值,在ES6中可通過函式宣告的內建語法來設定(取而代之)。

相關文章