javascript圓形變成的基本規則:javascript
基本類型包括:undefined、number、boolean、string、null;基本類型能夠經過包裝類的方式變成對象類型數據來處理;java
複雜類型:object;chrome
1.1 包裝對象:所謂「包裝對象」,就是分別與數值、字符串、布爾值相對應的Number
、String
、Boolean
三個原生對象。這三個原生對象能夠把原始類型的值變成(包裝成)對象。數組
1.2 包裝類和基本類型的對應關係:瀏覽器
基本類型 | 包裝對象 |
string | String |
number | Number |
boolean | Boolean |
var v1 = new Number(123);
var v2 = new String("abc");
var v3 = new Boolean(true);
typeof v1;//object
typeof v2;//object
typeof v3;//object
v1 === 123;//false
v2 === "abc";//false
v3 ===true;//false
1.3Number
、String
和Boolean
若是不做爲構造函數調用(即調用時不加new
),經常用於將任意類型的值轉爲數值、字符串和布爾值。
1.3.1 Boolean函數類型轉換
Boolean(undefined);//false
Boolean(null);//false
Boolean(0);//false
Boolean("");//false
Boolean(NAN);//false
Boolean(1);//true
Boolean('false');//true
Boolean([]);//true
Boolean({});//true
Booleam(function(){});//true
Boolean(/foo/);//true
NumberStringBooleannew
使用雙重的否運算符(!
)也能夠將任意值轉爲對應的布爾值。app
!!undefined //false函數
!!null //falsethis
!!0 //falsespa
!!'' //falsefirefox
!!NAN //false
!!1 //true
!!'false' //false
!![] //true
!!{} //true
!!function(){} //true
!!/foo/ //true
最後,對於一些特殊值,Boolean
對象前面加不加new
,會獲得徹底相反的結果,必須當心
1.4 javascript中的根對象是Object.prototype對象;
Object.prototype是一個空對象,咱們遇到的每個對象,都是從Object.prototype對象克隆而來的;
var obj1 = new Object();
var obj2 = {};
console.log(Object.getPrototypeOf(obj1) === Object.prototype); //true
console.log(Object.getPrototypeOf(obj2) === Object.prototype);//true
ECMAScript5提供的Object.getPrototypeOf 來查看對象的原型;
2.1 在javascript語言裏,咱們並不關心克隆的細節,由於這是引擎內部實現的。咱們所須要的只是顯示地調用var obj = new Object()或者var obj2 = {}。此時,引擎內部會從Object.prototype上克隆一個對象出來,咱們最終獲得的就是這個對象。
function Person(name){
this.name = name;
};
Person.prototype.getName = function(){
return this.name;
};
var a = new Person("seven");
console.log(a.name);//seven
console.log(a.getName);//seven
console.log(Object.getPrototypeOf(a) === Person.prototype);//true
補充解釋:Person並非類,而是構造函數,Javascript的函數既能夠做爲普通函數被調用,也能夠做爲構造器被調用。當時用new運算符來調用函數的時候,此時的函數就是一個構造器。用new運算符來建立對象的過程,實際上也只是先克隆Object.prototype對象,再進行一些其餘額外操做的過程。
2.2 _proto_屬性
2.2.1 在chrome和firefox等向外暴露了_proto_屬性的瀏覽器下,咱們能夠經過下面這段代碼來理解new 運算的過程
function Person(name){
this.name = name;
};
Person.prototype.getName = function(){
return this.name;
}
var objectFactory -= function(){
var obj = new Object(); //從Object.prototype上克隆一個空對象
var Constructor = [].shift.call(arguments); //call 的意思是把 空數組的方法放到arguments上執行,原來arguments是沒有shift() 方法,如今是把空數組 的shift()方法放到 arguments上來執行,因此argument原來的第一個元素的值(Person)。
obj._proto_ = Constructor.prototype; //obj._proto_ = Person.prototype;
var ret =Constructor.apply( obj, arguments)
// Function.apply(obj,args)方法能接收兩個參數
// obj:這個對象將代替Function類裏this對象 (這個對象繼承Function裏的屬性和方法)
// args:這個是數組,它將做爲參數傳給Function(args-->arguments)
return typeoof ret === 'object' ? ret : obj;
}
var a = objectFactory(Person, 'seven');
console.log(a.name);//seven
console.log(a.getName());//seven
console.log(Object.getPrototypeOf(a) === Perso.prototype); //true
3.1Javascript語言中的原型鏈查找機制,每個對象都會記住本身的原型
3.2 「對象的原型」,就javascript的真正實現來講,並不能說對象有原型,而只能說對象的構造器有原型,對於「對象對吧請求委託給它的原型」這句話,更好的說法是對象把請求委託給了他的構造器的原型。
3.3 Javascript給對象提供了一個名爲_proto_的隱藏屬性,摸個對象的_proto_屬性默認會指向它的構造函數的原型對象,即{Constructor}.prototype,在一些瀏覽器中,_proto_被公開出來,在chrome或者firefix上用這段代碼來驗證
var a = new Object();
console.log(a._proto_ === Object.prototype );//true
實際上,_proto_就是對象跟「對象構造器的原型」聯繫起來的紐帶。
Person原型對象也是對象,當這個對象找不到某個屬性時,會到Object原型對象中去找,這就是原型鏈
關於對象的其餘東西,請關注後續後續文章