鬆鬆個人網絡日誌
前言:引用類型的值(對象)是引用類型的一個實例。引用類型是一種數據結構,用於將數據和功能組織在一起。有時候也被稱爲對象定義,因爲它們描述的是一類對象所具有的屬性和方法。
1.引用數據類型
Object類型
使用字面量方式像函數傳遞大量可選參數:var person = new Object();//通過object的構造函數去創建對象 var person = { //通過對象字面量表示法創建 name:"張三", "age":23, 5:true //數值屬性名5會自動轉成字符串 }; var person = {}; //與new Object();相同,但是使用字面量創建對象不會調用Object構造函數
tips:對必需的值使用命名參數,對多個可選參數使用字面量方式封裝。function displayInfo(args){ var output = ""; if(typeof args.name == "string"){ output += "Name:"+args.name; } if(typeof args.age == "number"){ output += "Age:"+args.age; } } displayInfo({ name:"張三", age: 2 }); displayInfo({ name:"李四" });
使用方括號訪問對象的屬性:var propertyName = "name"; person[propertyName]; // 可通過變量訪問屬性 person[first name]; // 可訪問帶特殊字符,或關鍵字的屬性名
Array類型
//創建數組的方法 //一 var colors = new Array(); //二 var colors1 = ["red","blue"]; //注意: colors1[3] = "green"; alert(colors1[3]); //green alert(colors1[4]); //undefined colors1.length = 2; //通過設置數組長度可以移除數組後面的項,或添加新項 colors1[colors1.length] = "black"; //在數組末尾添加項 colors1[colors1.length] = "yellow";
數組檢測: instanceof ,Array.isArray(value)
轉換方法:
數組繼承的toLocaleString(),toString()和valueOf()方法,在默認情況下都會以逗號分隔的字符串形式返回數組頂。使用join()方法可以改變不用的分隔符。var person1 = { toLocaleString : function(){ //重寫方法 return "張三"; } toString : function(){ return "李四"; } }; var person2 = { toLocaleString : function(){ return "張三2"; } toString : function(){ return "李四2"; } }; var people = [person1,person2]; alert(people); //默認調用數組元素的toString() 李四,李四2 console.log(people.toString());//調用每個元素的toString() 李四,李四2 console.log(people.toLocaleString());//張三,張三2
alert(people.join("||"));// 李四||李四2
棧方法
使數組表現得像棧一樣push():接收任意數量的參數,將它們逐個添加到數組末尾,並返回修改後的數組長度。pop():從數組末尾移除最後一項,減少數組的length值,然後返回移除的項。
隊列方法
shift():移除數組的第一項並返回該項,同時將數組長度減1。
var arr = []; var count = arr.push("zhangsan","lisi","wangwu","zhaoliu","sunqi"); console.log(count); var firstItem = arr.shift(); //移除第一項,數組長度-1,返回移除的項 console.log(firstItem); //zhangsan console.log(arr[0]); //lisi
unshift():在數組前端添加任意個項,返回新數組長度
重排序方法
reverse():反轉數組項的順序sort():默認按升序排列數組項,sort()方法會調用每個數組項的toString()轉型方法,然後比較得到的字符串,以確定如何排序。即使數組中的每一項都是數值,sort()方法比較的也是字符串。
給定比較函數:比較函數接收兩個參數,如果第一個參數應該位於第二個參數前則返回負數,相等返回0var arr = [0,1,5,10,15]; alert(arr.sort()); // 0,1,10,15,5 按字符串比較10在5之前
var arr = [0,1,5,10,15]; alert(arr.sort()); // 0,1,10,15,5 按字符串比較10在5之前 function compare(value1,value2){ if(value1<value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; } } arr.sort(compare); alert(arr); //0,1,5,10,15
操作方法
concat():數組連接,方法會先創建當前數組的一個副本,然後將接收到的參數添加到這個副本的末尾,最後返回新構建的數組。
var arr = ["red","blue","yellow"]; var arr1 = arr.concat(["green","gray"]); //拼接數組 var arr2 = arr1.concat("purple",["orange","black"]); alert(arr); // red,blue,yellow原來數組不變 alert(arr1);// red,blue,yellow,green,gray alert(arr2);// red,blue,yellow,green,gray,purple,orange,black
slice():截取子數組注意:如果slice()方法參數中是負數,就用數組長度加負數來確定位置。如果結束位置小於其實位置,返回空數組。var arr = ["red","blue","yellow","green","gray","purple","orange","black"]; var arr1 = arr.slice(1); //blue,yellow,green,gray,purple,orange,black var arr2 = arr.slice(1,5); //blue,yellow,green,gray alert(arr1); alert(arr2);
splice()方法:主要用途是向數組的中部插入項
- 刪除:指定兩個參數(要刪除的第一項的位置,要刪除的項數),splice(0,2) 刪除數組前兩項
- 插入:可以向指定位置插入任意數量的項3個參數(起始位置,要刪除的項數0,插入的項)splice(2,0,"red","green")從當前數組的位置2開始插入red,green兩項
- 替換:指定位置插入任意項,同時刪除任意項,3個參數(起始位置,刪除的項數,插入的項),插入的項數不必與刪除的項數相等。如 splice(2,1,"red","green") 刪除位置2的一項元素,在位置2添加red,green
注意:splice()方法始終返回一個數組,數組中包含從原來數組中刪除的項,如果沒刪除任何項,則返回一個空數組。
var arr = ["red","blue","yellow","green","gray","purple","orange","black"]; var removed = arr.splice(0,1); //刪除第一項 alert(removed) var removed1 = arr.splice(2,0,"hehe","haha");//位置2插入兩項 alert(removed1); var removed2 = arr.splice(2,2,"heihei","huahua"); alert(removed2); alert(arr);
位置方法
indexOf():從數組頭開始查找,沒找到返回-1lastIndexOf():從數組尾開始查找
var person = {name:"zhangsan"}; var people = [{name:"zhangsan"}]; var people1 = [person]; alert(people.indexOf(person)); // -1 查找的項必須嚴格相等 alert(people1.indexOf(person)); // 0
迭代方法
every():對數組中的每一項運行給定函數,如果該函數每一項都返回true,則返回true。
some():對數組中的每一項運行給定函數,如果該函數對任一項返回true,則返回true。
var numbers = [1,2,3,4,5,4,3,2,1]; //只要有一個是false就立刻返回false,結束迭代 var everyResult = numbers.every(function(item,index,array){ console.log(item);//迭代的項 console.log(index);//數組下標 return (item>2); }); alert(everyResult); //只要有一項返回true,就結束迭代 var someResult = numbers.some(function(item,index,array){ console.log(item); console.log(index); return (item>2); }); alert(someResult);
filter():對數組每一項給定函數,返回函數返回true的項組成的數組
var numbers = [1,2,3,4,5,4,3,2,1]; var filterResult = numbers.filter(function(item,index,array){ return item>2; }); alert(filterResult); // 3,4,5,4,3
通常用來過濾掉數組中不符合條件的項
forEach():對數組每一項給定函數,沒有返回值。與for循環迭代數組一樣
var numbers = [1,2,3,4,5,4,3,2,1]; numbers.forEach(function(item,index,array){ //操作 });
map():對數組中的每一項運行給定函數,返回每次函數調用的結果返組成的數組
var numbers = [1,2,3,4,5,4,3,2,1]; var mapResult = numbers.map(function(item,index,array){ return item*2; }); alert(mapResult); // 2,4,6,8,10,8,6,4,2
通常用來創建包含的項與另一個數組一一對應的數組
縮小方法
reduce():從數組的第一項開始,逐個遍歷到最後reduceRight():從數組最後一項開始,向前遍歷
var numbers = [1,2,3,4,5]; var sum = numbers.reduce(function(prev,cur,index,array){ return prev+cur; }); alert(sum);//15 前一個元素與當前迭代的元素相加
Date類型
Date類型使用UTC(Coordinated Universal Time,國際協調時間) 19701月1日零點開始經過的毫秒數來保存日期。
var date3 = new Date(); //獲取當前日期 var date = new Date("May 28, 2016"); var date1 = Date.now(); //獲取當前日期的毫秒數 var date2 = +new Date(); //獲取當前日期的毫秒數 alert(date); alert(date1); alert(date2-date1); alert(date3);
繼承方法重寫:
valueOf():獲取日期的毫秒數值
var date1 = new Date(2016,0,1);//0-11月,0-23小時,軍用時間 var date2 = new Date(2016,0,2); alert(date1 < date2); //true alert(date1 > date2); //false
日期格式化:
toDateString():以特定格式顯示 星期,月,日,年
toTimeString():以特定格式顯示 時,分,秒,時區
RegExp類型
Function類型
函數實際上是對象,每個函數都是Function類型的實例,而且與其它引用類型一樣具有屬性和方法。函數名實際上也是一個指向函數對象的指針,不會與函數綁定
函數的定義:
注意:使用Function構造函數去創建函數對象的時候,會導致代碼解析兩次(第一次是解析ECMAScript代碼,第二次是解析傳入構造函數中的字符串參數),從而影響性能。var sum = function(num1,num2){ return num1+num2; }; function sum(num1,num2){ return num1+num2; } var sum = new Function("num1","num2","return num1+num2"); //不推薦
由於函數名僅僅是指向函數的指針,所以一個函數可以有多個名稱。
沒有重載
var sum = function(num1,num2){ return num1+num2; }; function sum(num1,num2,num3){ return num1+num2+num3; } //相當於,在創建第二個函數的時候,實際上覆蓋了引用第一個函數的變量sum sum = function(num1,num2,num3){ return num1+num2+num3; }
函數聲明與表達式
在解析器向執行環境加載數據時,解析器會先讀取函數聲明,並使其在執行任何代碼前可用。函數表達式則要等到解析器執行到該表達式所在的代碼行時才被解釋執行。
alert(sum(10,10)); //20,不會報錯 function sum(num1,num2){ return num1+num2; } alert(sum1(12,12)); //會報錯,Uncaught TypeError: sum1 is not a function var sum1 = function(num1,num2){ return num1+num2; }
說明:第一段代碼正常執行,因爲在代碼開始執行之前,解析器就已經通過一個名爲函數聲明提升(function declaration hoisting)的過程,讀取並將函數聲明添加到執行環境中。對代碼求值時,JavaScript引擎在第一遍會聲明函數並將它們放到源代碼樹的頂部。所以,即使聲明函數的代碼在調用它的代碼的後面,JavaScript引擎也能把函數聲明提升到頂部。
第二段代碼出錯,原因在於函數位於一個初始化語句中,而不是一個函數聲明。也就是說,在執行到函數所在的語句之前,sum1並不會保存有對函數的引用。
作爲值的函數
ECMAScript中的函數名本來就是變量,所以函數也可以作爲值來使用(可以將函數當參數傳遞,也可以在函數中返回另一個函數);function callFunction(functionName,param){ return functionName(param); } function add10(num){ return num+10; } var result = callFunction(add10,10); // 20,注意傳入的是add10函數的指針,而不是add10()函數執行後的結果 function sayHello(name){ return "hello "+name; } var result1 = callFunction(sayHello,"ethan"); //hello ethan
作爲返回值的函數,例子:(獲取一個根據指定屬性名排序的函數)
function getComparisonFunction(propertyName){ return function(object1,object2){ var value1 = object1[propertyName];//使用[]可根據變量訪問屬性 var value2 = object2[propertyName]; if(value1<value2){ return -1; }else if(value1>value2){ return 1; }else{ return 0; } } } var data = [{name:"zhangsan",age:25},{name:"lisi",age:26}]; data.sort(getComparisonFunction("name"));//根據name排序,lisi,zhangsan console.log(data); data.sort(getComparisonFunction("age"));//根據age排序,zhangsan,lisi console.log(data);
函數內部屬性
函數內部有兩個特殊的對象,arguments(類數組對象)和this:arguments包含着傳入函數中的所有參數。雖然arguments對象的主要用途是保存函數參數,但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。
function factorial(num){//通過遞歸算法,定義一個階乘函數,與函數名緊耦合 if(num <=1){ return 1; }else{ return num*factorial(num-1); } } //使用callee改進 function factorial1(num){ if(num <=1){ return 1; }else{ return num*arguments.callee(num-1);//callee指向factorial1函數 } } var trueFactorial = factorial1;//讓trueFactorial指向階乘函數 var factorial1 = function(){//解除factorial1與階乘函數的關聯 return 0; }; console.log(trueFactorial(5));//120 console.log(factorial1(5));// 0
this引用的是函數據以執行的環境對象,當在全局作用域中調用函數時,this對象引用的就是window
function sayHello(){ return this.helloName; } window.helloName = "window"; sayHello();//全局,window調用,this指向window。返回"window" var o = {helloName:"ooooo"}; o.sayHello = sayHello; o.sayHello(); //通過o對象調用sayHello函數,this指向的是o,返回 "ooooo"
ECMAScript5中也規範化了另一個函數對象的屬性:caller。這個屬性中保存着調用當前函數的函數的引用(如果在全局作用域中調用,它的值爲null)
function outer(){ inner(); } function inner(){ alert(arguments.callee.caller);//arguments.callee指向inner()函數,arguments.callee.caller指向outer()函數 } outer();
length:表示函數希望接收的命名參數的個數函數屬性和方法
prototype:對於ECMAScript中的引用類型而言,prototype是保存它們所有實例方法的真正所在。toString()和valueOf()等方法都保存在prototype名下,只不過是通過各自對象的實例訪問罷了。prototype是不可枚舉的,無法使用for-in發現。
每個函數都包含兩個非繼承而來的方法:apply()和call()。用途就是在特定的作用域中調用函數,相當於設置函數體內this對象的值。
apply():接收兩個參數,一個是在其中運行函數的作用域,另一個是參數數組(可以是Array的實例,也可以是arguments對象),如:
call()方法與apply()方法的作用相同,它們的區別僅在於接收參數的方式不同。call()方法接收參數時必須逐個列出來(明確傳入的每個參數)function sum(num1,num2){ return num1+num2; } function callSum1(num1,num2){ return sum.apply(this,arguments); } function callSum2(num1,num2){ return sum.apply(this,[num1,num2]); } console.log(callSum1(10,10)); console.log(callSum2(10,20));
使用apply()與call()方法擴充函數賴以運行的作用域。注意:使用call()或apply()來擴充作用域的好處,就是對象與方法不需要有任何耦合window.color = "red"; var o = {color:"blue"}; function sayColor(){ alert(this.color); } sayColor.apply(this); // window.color red sayColor.call(window);// window.color red sayColor.apply(o); // o.color blue
bind():創建函數的實例,this指向傳給bind()函數的值。window.color = "red"; var o = {color:"blue"}; function sayColor(){ alert(this.color); } var sayColorObj = sayColor.bind(o); //sayColor() sayColorObj(); //blue 創建了sayColorObj()函數,this指向o對象
基本包裝類型
Boolean,Number,String。每當讀取一個基本類型值的時候,後臺就會創建一個對應的基本包裝類型的對象。
在上面代碼中,s1字符串可以調用方法,實際上在讀取模式中,後臺會自動完成一下處理var s1 = "some text"; var s2 = s1.substring(2); console.log(s2); // me text
(1)創建String 類型的一個實例
(2)在實例上調用指定的方法
(3)銷燬這個實例
說明:引用類型與基本包裝類型的主要區別就是對象的生存期。使用new創建的應用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,只存在於一行代碼執行的瞬間,然後就立刻銷燬。意味着我們不能在運行時爲基本類型添加屬性和方法var s1 = new String("some text"); var s2 = s1.substring(2); s1 = null;
tips:可以顯示調用Boolean,Number,String的構造函數來創建基本包裝類型的對象。不過在非必須的情況下儘量不要這麼做,因爲這樣很容易讓人分不清自己是在處理基本類型還是引用類型。對基本包裝類型的實例調用typeof會返回"object",而且所有基本包裝類型的對象都會被轉換爲true。Object構造函數也像工廠方法一樣,根據傳入值的類型,返回相應的基本包裝類型實例。var obj = new Object("some text"); alert(obj instanceof String); //true
注意:使用構造函數和同名的轉型函數是不一樣的。var value = "22"; var number = Number(value);//轉型函數 alert(typeof(number)); //"number" var obj = new Number(value); //構造函數 alert(typeof obj); // "object"
Boolean類型
常見問題:(Boolean類型容易造成誤解)
var falseObj = new Boolean(false); var result = falseObj && true; //在布爾表達式中,所有對象都會轉換成true alert(result); var falseValue = false; result1 = falseValue && true; alert(result1); // false
console.log(typeof falseObj); //object console.log(typeof falseValue); //boolean console.log(falseObj instanceof Boolean); // true console.log(falseValue instanceof Boolean); // false
最好不要用Boolean
Number類型
toString(2);轉換成指定的進制,返回字符串
toFixed(2);保留指定的小數位,返回字符串(四捨五入)
String類型
每個String的實例都有length屬性,表示字符串中字符的個數。即使字符串中包含雙字節字符,每個字符也只算一個字符var stringValue = new String("zhang san"); alert(stringValue.length);
1. 字符方法
2.字符串操作方法var stringValue = new String("zhang san"); alert(stringValue.charAt(1)); // h alert(stringValue.charCodeAt(1)); // 104 輸出h的字符編碼 alert(stringValue[1]);// 直接使用數字索引加[]來訪問字符串中的特定字符
slice(),substr(),substring()。不會修改字符串本身,而是返回一個基本類型的字符串。
3.字符串位置方法var stringValue = new String("zhang san"); stringValue.slice(3); // ng san stringValue.substring(3);// ng san stringValue.substr(3); // ng san stringValue.slice(3,7);// ng s 下標3~7的字符 stringValue.substring(3.7);// ng s stringValue.substr(3,7); // ng san 下標3開始,取7位字符
從字符串中搜索給定的子字符串,然後返回子字符串的位置(沒找到就返回-1)
var stringValue = new String("zhang san"); alert(stringValue.indexOf("a")); //從開頭向後搜索 2 alert(stringValue.lastIndexOf("a"));//從結尾向前搜索 7 alert(stringValue.indexOf("a",4));// 從第四位開始向後搜索 7 alert(stringValue.lastIndexOf("a",4))//從第四位開始向前搜索 2
通過循環查詢出所有匹配的子字符串
4.trim()方法var stringValue = "'Card Crawl' Developers Bringing 'Enyo',a Tactical Roguelike to Mobile"; var posArr = []; var pos = stringValue.indexOf("e"); while(pos > -1){ posArr.push(pos); pos = stringValue.indexOf("e",pos+1); } alert(posArr);
5.字符串大小寫轉換方法var stringValue = " zhang san "; var trimmedStr = stringValue.trim(); alert(trimmedStr); // 返回字符串的副本,原始字符串不變
6.字符串的模式匹配方法var stringValue = " zhang san "; alert(stringValue.toLocaleUpperCase()); // ZHANG SAN alert(stringValue.toLocaleLowerCase()); // zhang san alert(stringValue.toUpperCase()); // ZHANG SAN alert(stringValue.toLowerCase());// zhang san
match();只接收一個參數,正則表達式或RegExp對象。
macth()方法返回數組:第一項是與整個模式匹配的字符串,之後每一項保存着與正則表達式中的捕獲組匹配的字符串。var stringValue = "cat, bat , sat , fat"; var pattern = /.at/; var matches = stringValue.match(pattern); console.log(matches); var pos = stringValue.search(/at/); alert(pos);
search()返回字符串匹配的索引,從頭向後查找replace()方法,替換匹配的子字符串
split()方法:將字符串根據指定的分割符切分成多個子字符串,返回數組(可指定第二個參數,指定返回的數組大小)var stringValue = "cat, bat , cat , fat"; var result = stringValue.replace("at","kkk"); //替換第一個匹配的at子字符串 alert(result); // ckkk, bat , cat , fat var result1 = stringValue.replace(/at/g,"kkk"); alert(result1); // ckkk, bkkk , ckkk , fkkk
localeCompare()方法:比較兩個字符串,字符串子字母表中排在參數前,返回負數-1。相等返回0,之後返回1fromCharCode()方法:String構造函數本身還有一個靜態方法,接收一個或多個字符編碼,轉成字符串返回(與charCodeAt()相反)var stringVal = "red"; result = stringVal.localeCompare("blue"); alert(result); // 1
alert(String.fromCharCode(104,101,108,108,111)); //hello
單體內置對象
定義:由ECMAScript實現提供的,不依賴於宿主環境的對象,這些對象在ECMAScript程序執行之前就已經存在了。不必顯示地實例化內置對象,因爲它們已經實例化了。Object,Array,String,Global,Math都是內置對象
Global對象
全局對象,不屬於任何其他對象的屬性和方法,最終都是它的屬性和方法,所有在全局作用域中定義的屬性和函數,都是Global對象的屬性。如:isNaN(),isFinite(),parseInt(),parseFloat(),都是Global對象的方法。1.URI 編碼方法encodeURI():對整個URI(如:http://www.hehe.com/illegal value.htm),不會對冒號,正斜槓,問號和井號編碼encodeURIComponent():對URI中某一段(如:illegal value.htm) 進行編碼,對所有非標準字符進行編碼
有效的URI中不能包含某些特殊字符,通過上面的方法,可以對URI進行編碼,用UTF-8編碼替換無效的字符。
一般常用的是encodeRUIComponent()方法,只需要對傳給後臺的參數進行編碼即可。var uri = "http://www.hehe.com/illegal value.htm#start"; alert(encodeURI(uri)); //將 空格 變成了 %20 decodeURI() var encodeUri = encodeURIComponent(uri); //對所有特殊字符都做了轉換 var decodeUri = decodeURIComponent(encodeUri); //解碼 alert(decodeUri);
2.eval()方法
當調用eval()方法時,解析器會將參數當作ECMAScript語句來解析,然後將執行結果插入到原位置。通過eval()執行的代碼作用域就是當前執行的環境。因此被執行的代碼具有與當前執行環境相同的作用域鏈。如:eval("alert('hi')");//等價與 alert("hi");
var msg = "hehe"; eval("alert(msg)"); //hehe eval(eval("function sayHi(){alert('hi');}"));//定義一個函數 sayHi();//可以調用
3.Global對象的屬性
undefined,NaN,Infinity,Object,Array,Function,Boolean,String等等
4.window對象
說明:ECMAScript雖然沒有指出如何直接訪問Global對象,但Web瀏覽器都是將這個全局對象作爲window對象的一部分加以實現的。因此,在全局作用域中聲明的所有變量和函數,就都成爲了window對象的屬性。
var color = "red"; function sayColor(){ alert(window.color); }; window.sayColor(); //red
另一種獲取global對象的方法:
var global = function(){ return this; }();
上面創建了一個立即調用的函數表達式,返回this。在沒有給函數明確指定this值的情況下(無論是通過將函數添加爲對象的方法,還是通過調用call(),apply()),this值等於Global對象。
Math對象
max()和min()方法:var max = Math.max(2,43,23,76,23); //接收任意多個數值參數 var min = Math.min(2,43,23,76,23); alert(max); // 76 alert(min); // 2 var valArr = [2,43,23,76,23]; var maxRes = Math.max.apply(Math,valArr); //使用math方法找到數組中的最大值 alert(maxRes);
舍入方法:將小數值舍入爲整數值
Math.ceil():向上舍入
Math.floor():向下舍入
Math.round():四捨五入
console.log(Math.ceil(25.9)); //26 console.log(Math.ceil(25.5)); //26 console.log(Math.ceil(25.1)); //26 console.log(Math.floor(25.9)); //25 console.log(Math.floor(25.5)); //25 console.log(Math.floor(25.1)); //25 console.log(Math.round(25.9)); //26 console.log(Math.round(25.5)); //26 console.log(Math.round(25.1)); //25
random()方法:返回介於0和1之間的一個隨機數,不包括0和1
var num = Math.floor(Math.random()*可能的數值總數+第一個可能的值); var num = Math.floor(Math.random()*10+1); //1~10的隨機數 var num = Math.floor(Math.random()*9+2);//2~10的隨機數
小結:function selectForm(lowerValue,upperValue){ var choices = upperValue - lowerValue +1; return Math.floor(Math.random()*choices+lowerValue); } var arr = ["red","green","blue","yellow","black","purple","brown"]; console.log(arr[selectForm(0,arr.length-1)]);
- 引用類型與傳統面向對象程序設計中的類相似,但實現不同
- Object是一個基礎類型,其他所有類型都從Object繼承了基本的屬性和方法
- Array類型是一組值的有序列表,同時還提供了操作和轉換這些值的功能
- 每個包裝類型都映射到同名的基本類型;
- 在讀取模式下訪問基本類型值時,會創建對應的基本包裝類型的一個對象,方便數據的操作
- 操作基本類型值的語句一旦執行完畢,創建的包裝對象就會銷燬
函數實際上是Function類型的實例,因此函數也是對象;函數也擁有方法,來增強其行爲
在所有代碼執行之前,作用域中就已經存在兩個內置對象:Global和Math。在大多數ECMAScript的實現中都不能直接訪問Global對象;不過,web瀏覽器實現了承擔該角色的window對象。全局變量和函數都是Global對象的屬性。
鬆鬆個人網絡日誌