引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起泡态。對象是某個特定引用類型的實例胜宇。新對象使用new操作符后面跟一個構(gòu)造函數(shù)來創(chuàng)建,構(gòu)造函數(shù)本身就是一個函數(shù)作瞄,只不過這個函數(shù)是出于創(chuàng)建新對象而定義的茶宵。
var person = new Object();
這里調(diào)用的構(gòu)造函數(shù)是Object(),只為新對象定義了默認的屬性和方法宗挥。
Object類型
這是ECMAScript中使用的最多的類型乌庶,大多數(shù)引用類型的實例都是Object類型的實例。
初始化
創(chuàng)建它有兩種辦法:
//方法1
var person = new Object();
person.name = "Nicholas";
person.age = 29;
//方法2
var person = {
name : "Nicholas",
age : 29
};
//這樣也可以~
var person = {}; // new Object()
person.name = "Nicholas";
person.age = 29;
在方法2中注意契耿,屬性值是字符串瞒大,如果你輸入的不是字符串,那也會被轉(zhuǎn)化成字符串搪桂。
要注意的是使用字面量來定義對象的時候?qū)嶋H上不會調(diào)用Object()構(gòu)造函數(shù)哦
在需要像函數(shù)傳遞大量可選參數(shù)的情況下透敌,使用對象字面量來傳遞是個很好的選擇。
訪問
有兩種方法來訪問:
alert(person["name"]); //"Nicholas"
alert(person.name); //"Nicholas"
一般推薦第二種踢械,但是第一種有特殊的用法:
var propertyName = "name"; //需要通過變量來訪問屬性
alert(person[propertyName]); //"Nicholas"
//屬性名里包含非字母非數(shù)字等用在.方法里會出錯的字符
person["first name"] = "Nicholas";
Array類型
ECMAScript中的數(shù)組也與其它語言的數(shù)組有很大區(qū)別酗电,數(shù)組中的每一項都可以保存任何類型的數(shù)據(jù),大小也是動態(tài)調(diào)整的裸燎。
初始化
同樣的顾瞻,使用數(shù)組字面量初始化數(shù)組時不會調(diào)用Array的構(gòu)造函數(shù)。
var colors = new Array();
var colors = new Array(20);
var colors = new Array("red", "blue", "green");
var names = new Array("Greg");
var colors = ["red", "blue", "green"];
var names = [];
訪問
使用方括號下標的方式來訪問德绿。
在別的語言中會有數(shù)組越界荷荤,在JS里,越界訪問返回undefined移稳,越界賦值則會幫你創(chuàng)建這個元素蕴纳,如果數(shù)組原來只有3個元素,你直接設(shè)置第100個个粱,數(shù)組長度也會變?yōu)?00古毛,前面那些沒賦值的都會變成undefined,雖然這樣不報錯都许,但還是不推薦稻薇。
length屬性始終會返回0或更大的值,而且有趣的是胶征,這個屬性并不是只讀的塞椎,還可以設(shè)置長度,通過設(shè)置長度就可以移除不要的或添加新項睛低。
這樣的特性造成了在最后添加元素很方便:
colors[colors.length] = "black";
檢測數(shù)組
ECMAScript3中使用value instanceof Array來判斷一個對象是不是數(shù)組案狠。但是當一個網(wǎng)頁中包含多個框架時服傍,就有可能包含多個全局執(zhí)行環(huán)境,包含多個Array的構(gòu)造函數(shù)骂铁,在框架之間傳遞數(shù)組時這樣判斷就會出問題吹零。ECMAScript5為了解決這個問題創(chuàng)建了isArray()方法。
轉(zhuǎn)換方法
alert(colors.toString()); //對數(shù)組調(diào)用toString時會對數(shù)組中的每一個元素調(diào)用toString拉庵,然后加上逗號拼成一個字符串
alert(colors.toLocaleString());//對數(shù)組調(diào)用這個方法和調(diào)用toString()方法類似灿椅,會先調(diào)用每一項的toLocaleString()方法
alert(colors.valueOf());//valueOf方法則還是返回數(shù)組
alert(colors);//直接將數(shù)組傳到alert里其實是默認調(diào)用了toString再顯示出來
alert(colors.join("||")); //這個可以自定義字符串的分隔符,默認使用逗號钞支。red||green||blue
棧方法
使數(shù)組模仿棧操作阱扬,有push()和pop()方法。push接受任意數(shù)量的參數(shù)將它們逐個添加到數(shù)組的末尾伸辟,并返回新的數(shù)組長度。pop移除最后一個元素并返回該元素馍刮。
隊列方法
模仿隊列操作信夫,使用push(),shift()方法模仿卡啰。shift()方法移除第一項并返回這個元素静稻。
還可以使用pop()和unshift()方法來模擬,unshift是在數(shù)組的最前端加上任意個項并返回新的數(shù)組長度匈辱。
這兩種方法模擬隊列的方向不一樣振湾,我更喜歡第一組。
重排序方法
reverse()方法會直接反轉(zhuǎn)數(shù)組亡脸。
sort()方法會調(diào)用數(shù)組中每一項的toString方法押搪,然后根據(jù)轉(zhuǎn)換得來的字符串按照升序排列數(shù)組。也就是說[0,1,2,10]會被排成[0,1,10,2]浅碾。這顯然不是我們想要的
sort可以接受一個參數(shù)大州,這個參數(shù)是一個比較函數(shù),這個比較函數(shù)接受兩個參數(shù)垂谢,如果第一個應(yīng)該在第二個前面厦画,則返回一個負數(shù),相等返回0滥朱,否則返回正數(shù)根暑。
function compare(value1, value2) {
if (value1 < value2) {
return -1;
}
else if (value1 > value2) {
return 1;
}
else {
return 0;
}
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //0,1,5,10,15
對于數(shù)值類型或者valueOf()方法會返回數(shù)值的直接用減法代替咯:
function compare(value1, value2){
return value2 - value1;
}
一些方法
concat()
var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors); //red,green,blue
alert(colors2); //red,green,blue,yellow,black,brown
slice()
var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow
splice()
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1); // 刪除第一項
alert(colors); // green,blue
alert(removed); // red 被刪除的項
removed = colors.splice(1, 0, "yellow", "orange"); // 在1的位置插入2項
alert(colors); // green,yellow,orange,blue
alert(removed); // 空的,因為沒刪除什么
removed = colors.splice(1, 1, "red", "purple"); // 刪除1項徙邻,插入兩項
alert(colors); // green,red,purple,orange,blue
alert(removed); // yellow 被刪除的項
位置方法
indexOf和lastIndexOf方法用來查找元素在數(shù)組中的位置排嫌。接收兩個參數(shù),起始索引和要查找的元素鹃栽,這兩個的區(qū)別就是一個從前開始找一個從后開始找躏率。他們只會返回他們找到的第一個元素的索引躯畴。在查找時使用===全等符號來比較。如果找不到則返回-1薇芝。
var person = { name: "Nicholas" }; var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1 這里兩個對象不是一個蓬抄,并不全等alert(morePeople.indexOf(person)); //0
迭代方法
在ES5中為數(shù)組定義了5個迭代方法,這些方法都接收兩個參數(shù):要在數(shù)組每一項上運行的函數(shù)和運行該函數(shù)的作用域?qū)ο螅ㄟ@個對象會影響函數(shù)內(nèi)this的值)夯到。
對于作為參數(shù)被傳進去的函數(shù)嚷缭,它會接收到3個參數(shù):數(shù)組項的值,數(shù)組項的索引耍贾,和數(shù)組本身阅爽。返回值每個函數(shù)不一樣。
every()
如果函數(shù)對每一項都返回true荐开,則every返回true付翁。這個一般用來檢測數(shù)組的每一項是否滿足某個要求。
some()
如果函數(shù)對某一項返回true晃听,這個函數(shù)就返回true
filter()
它返回函數(shù)返回true的項組成的數(shù)組
map()
返回在數(shù)組原始項上運行傳入函數(shù)的結(jié)果返回的數(shù)組
foreach()
木有返回值
歸并方法
這也是ES5里的方法:reduce()和reduceRight()百侧。這兩個方法一個從前一個從后,迭代數(shù)組的所有項能扒,最終返回一個值佣渴。他們都接受兩個參數(shù):在每一項上調(diào)用的函數(shù)和初始值(可選)。函數(shù)接收4個參數(shù):前一個值初斑,當前項辛润,項的索引和數(shù)組對象。且這個函數(shù)返回的任何值都會自動的作為下一項的第一個參數(shù)见秤。
var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){ return prev + cur;
});
alert(sum); //15
Date類型
var now = new Date(); //當前時間
var someDate = new Date(Date.parse("May 25, 2004")); //這個字符串格式?jīng)]有標準砂竖,有可能有的瀏覽器不支持呢
var someDate = new Date("May 25, 2004"); //這個其實會自動調(diào)用parse
var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); //這個比較保險
var start = Date.now(); //獲取當前毫秒數(shù),用來分析代碼很有用
Date類型重寫了toString(),toLocaleString(),valueOf()方法鹃答。前兩個每個瀏覽器實現(xiàn)都不太一樣晦溪,所以在真正用的時候也不太可能用這些方法將值呈現(xiàn)給用戶。valueOf方法則是將時間轉(zhuǎn)換為毫秒值挣跋,這個就比較有用了三圆,這就意味著可以直接使用><來判斷時間的先后。
var date1 = new Date(2007, 0, 1); //"January 1, 2007"
var date2 = new Date(2007, 1, 1); //"February 1, 2007"
alert(date1 < date2); //true
alert(date1 > date2); //false
那么如果想獲得準確的時間信息并顯示給用戶我們應(yīng)該怎么辦呢
getFullYear()
getMonth()
getDate()
等等避咆。舟肉。。
也有設(shè)置的方法
setFullYear()
setMonth()
等等
RegExp類型
正則表達式
var expression = / pattern / flags ;
其中pattern可以是任何簡單或復雜的正則表達式查库,flags是標志路媚,標志可以帶多個。標志有3個:g表示全局模式樊销,即模式會被應(yīng)用到所有字符串整慎,不會在找到第一個后就停止脏款;i表示區(qū)分大小寫;m表示多行裤园,在到達一行文本末尾時會查找下一行撤师。
var pattern1 = /at/g; //匹配字符串中所有at的實例
var pattern2 = /[bc]at/i; //匹配第一個bat或cat,不區(qū)分大小寫
var pattern2 = new RegExp("[bc]at", "i"); //這樣也是可以的
var pattern3 = /.at/gi; //匹配所有以at結(jié)尾的3個字符的組合拧揽,不區(qū)分大小寫
在ES3中剃盾,使用字面量創(chuàng)建正則表達式與使用new創(chuàng)建正則表達式不一樣。使用字面量創(chuàng)建的正則表達式始終共享一個RegExp類型實例淤袜。這就有問題了:
var re = null;
var i;
for (i=0; i < 10; i++){
re = /cat/g;
re.test("catastrophe");
}
在上面這段代碼中每次循環(huán)都使用的是同一個RegExp實例痒谴,在第一次查找的過程中,查到了索引為3的地方铡羡。在循環(huán)到第二次的時候积蔚,因為是同一個實例,實例屬性不會被重置烦周,于是第二次循環(huán)就從第4個字符開始查找了库倘,這樣當然就找不到了。
在ES5中论矾,修復了這個不合理的地方。字面量也是直接調(diào)用構(gòu)造函數(shù)那樣新建一個實例杆勇。
實例屬性
global:是否設(shè)置了g
ignoreCase:是否設(shè)置了i
lastIndex:開始搜索下一個匹配項的字符位置
multiline:是否設(shè)置m
source:正則表達式的字符串表示
實例方法
exec()專為捕獲組設(shè)計:
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index);//0
alert(matches.input);// "mom and dad and baby"
alert(matches[0]);// "mom and dad and baby"
alert(matches[1]);// " and dad and baby"
alert(matches[2]);// " and baby"
test()它接受一個字符串贪壳,在模式與該參數(shù)匹配的情況下返回true:
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){
alert("The pattern was matched.");
}
RegExp構(gòu)造函數(shù)屬性
這些屬性基于所執(zhí)行的最近的一次正則表達式操作而變化
var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)){
alert(RegExp.input); // this has been a short summer
alert(RegExp.leftContext); // this has been a
alert(RegExp.rightContext); // summer
alert(RegExp.lastMatch); // short
alert(RegExp.lastParen); // s
alert(RegExp.multiline); // false
}
還有9個用于儲存捕獲組的構(gòu)造函數(shù)屬性:RegExp.$1、...RegExp.$2
var text = "this has been a short summer";
var pattern = /(..)or(.)/g;
if (pattern.test(text)){
alert(RegExp.$1); //sh
alert(RegExp.$2); //t
}
Function類型
在ES里Function實際上是對象蚜退!所以每個函數(shù)都是Function類型的實例闰靴,與其他引用類型一樣具有屬性和方法,至于函數(shù)名钻注,就是一個指向函數(shù)對象的指針蚂且。所以以下3種方法聲明函數(shù)都是等價的:
//1
function sum (num1, num2) {
return num1 + num2;
}
//2
var sum = function(num1, num2){
return num1 + num2;
};
//3
var sum = new Function("num1", "num2", "return num1 + num2");
第三種方法可以很明顯的看出函數(shù)是對象的跡象,但是平時使用的時候并不推薦使用第三種辦法幅恋,會導致性能問題杏死,因為要解析字符串里的表達式。
對于函數(shù)的名字捆交,僅僅是指向函數(shù)的指針:
//首先定義了一個名為sum的函數(shù)
function sum(num1, num2){
return num1 + num2;
}
alert(sum(10,10)); //20
//這里不使用帶圓括號的函數(shù)名淑翼,意思就是訪問函數(shù)的指針而不是調(diào)用函數(shù)
//這里將sum的值賦給了anotherSum
var anotherSum = sum;
//于是anotherSum也指向了sum函數(shù)
alert(anotherSum(10,10)); //20
//將sum指向別處
sum = function (num1, num2){
return num1 - num2;
};
//anotherSum還指向原來的sum函數(shù)
alert(anotherSum(10,10)); //20
//sum指向新函數(shù)
alert(sum(10,10));//0
函數(shù)聲明和函數(shù)表達式
函數(shù)聲明會被解析器率先獲取并放到其所在執(zhí)行環(huán)境的頂部,代碼開始執(zhí)行后隨時可用品追。而函數(shù)表達式得在代碼執(zhí)行到其所在的代碼行時才被解釋玄括。
就這點區(qū)別。
這個可以正確執(zhí)行:
alert(sum(10,10));
function sum(num1, num2){
return num1 + num2;
}
這個則會報錯:
alert(sum(10,10));
var sum = function(num1, num2){
return num1 + num2;
};
作為值的函數(shù)
函數(shù)可以作為參數(shù)傳給另一個函數(shù)肉瓦,也可以作為返回值遭京。
//將一個函數(shù)作為參數(shù)胃惜,并將這個函數(shù)的返回值作為返回值
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
function add10(num){
return num + 10;
}
//調(diào)用時將函數(shù)的指針傳入
var result1 = callSomeFunction(add10, 10);
alert(result1); //20
直接返回一個函數(shù):
function createComparisonFunction(m) {
return function(o1, o2){
return m+o1+o2;
};
}
var func = createComparisonFunction(1)
alert(func(2,3));
alert(createComparisonFunction(1)(11,0));
函數(shù)內(nèi)部屬性
在函數(shù)內(nèi)部有兩個特殊對象arguments和this。arguments的主要用途是保存參數(shù)哪雕,不過他還有一個callee的屬性船殉,它是一個指針,指向擁有這個arguments對象的函數(shù)热监。于是就可以這樣用:
//遞歸階乘捺弦,使用callee自己調(diào)用自己就不受函數(shù)名的限制了
function factorial(num){
if (num <=1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}
在ES5中還有caller屬性,返回指向調(diào)用這個函數(shù)的函數(shù)的指針孝扛。在全局作用域中調(diào)用的函數(shù)這個屬性是null
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
outer();
函數(shù)的屬性和方法
每個函數(shù)都有2個屬性:length和prototype列吼。length表示希望接受到的命名參數(shù)的個數(shù)。prototype以后再細說苦始。
每個函數(shù)都包含兩個方法:apply()和call()寞钥。這兩個方法在特定的作用域中調(diào)用函數(shù),實際上就是手工設(shè)置函數(shù)體內(nèi)this的值陌选。
apply接受兩個參數(shù)理郑,第一個就是你要設(shè)置的作用域,第二個是函數(shù)本身要接受的參數(shù)咨油,這個參數(shù)可以以數(shù)組的形式給出您炉,也可以以arguments對象形式。call則是將參數(shù)直接列在上面:
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
function callSum1(num1, num2){
return sum.apply(this, arguments);
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]);
}
alert(callSum(10,10)); //20
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
ES5新定義了一個方法bind()役电,這個方法創(chuàng)建一個函數(shù)的實例赚爵,這個函數(shù)的this值會被綁定到bind的參數(shù)上。
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
基本包裝類型
三個基本類型有自己的包裝類法瑟,Boolean冀膝、Number、String霎挟。
var s1 = "some text";
var s2 = s1.substring(2);
是不是覺得很奇怪~s1明明是一個String類型的基本類型~怎么會有自己的方法~
在你從內(nèi)存中讀取這個字符串的時候其實發(fā)生了一些事情:
- 在你開始讀取這個值的時候窝剖,ES為你創(chuàng)建了String類型的一個實例。
- 在實例上調(diào)用了你想調(diào)用的方法
- 銷毀這個實例
相當于執(zhí)行了下面的代碼:
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
自動創(chuàng)建的包裝類只存在那一瞬間酥夭,所以為他添加屬性和方法不太可能赐纱。
像上面那樣顯示的聲明也是可以的,但是并不推薦也沒有必要熬北。對包裝類實例調(diào)用typeOf會返回object千所,值轉(zhuǎn)換時永遠為true。這點一定要注意蒜埋。
Object構(gòu)造函數(shù)會自動識別并創(chuàng)建響應(yīng)的包裝類實例:
var obj = new Object("some text");
alert(obj instanceof String); //true
還有一點要注意淫痰,包裝類的構(gòu)造函數(shù)和名字一樣的轉(zhuǎn)型函數(shù)要區(qū)分:
var value = "25";
var number = Number(value);
alert(typeof number); //"number"
var obj = new Number(value);
alert(typeof obj); //"object"
Boolean類型
重寫了valueOf(),返回基本類型的true和false整份。重寫了toString()待错,返回"true","false"兜材。但是這個類型強烈不推薦使用求豫,因為在轉(zhuǎn)換時永遠會被轉(zhuǎn)換為true:
var falseObject = new Boolean(false);
var result = falseObject && true;
alert(result); //true
Number類型
var num = 10; alert(num.toString()); //"10" alert(num.toString(2)); //"1010" alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10" alert(num.toString(16)); //"a"
alert(num.toFixed(2)); //"10.00"
alert(num.toExponential(1)); //"1.0e+1"
var num = 99;
//這個方法會自動幫你選擇合適的表示法
alert(num.toPrecision(1)); //"1e+2" alert(num.toPrecision(2)); //"99" alert(num.toPrecision(3)); //"99.0"
String類型
一些基本方法
var stringValue = "hello world"; alert(stringValue.length); //"11"
alert(stringValue.toUpperCase()); //"HELLO WORLD"
alert(stringValue.toLowerCase()); //"hello world"
alert(stringValue.charAt(1)); //"e"
alert(stringValue.charCodeAt(1)); //"101"
alert(stringValue[1]); //"e"
concat()用來拼接字符串,不過實際中使用+更加普遍:
var stringValue = "hello ";
var result = stringValue.concat("world", "!");
alert(result); //"hello world!"
alert(stringValue); //"hello"
還有三個返回子字符串的方法:slice()、substr()姻锁、substring()
查找子字符串的方法:indexOf()顿肺、lastIndexOf()君纫。和數(shù)組那個差不多奸鬓,可以指定查找的子字符串和起始位置。只會返回查找到的第一個位置谱仪。
trim()刪除頭尾的空格:
var stringValue = " hello world ";
var trimmedStringValue = stringValue.trim(); alert(trimmedStringValue); //"hello world"
匹配模式的方法:
match():與exec()相同玻熙,接收一個正則表達式或一個RegExp對象。返回數(shù)組疯攒。
search():與match參數(shù)相同嗦随。返回第一個匹配項的索引。
replace():第一個參數(shù)可以是一個字符串或一個正則表達式敬尺,第二個參數(shù)可以是一個字符串或一個函數(shù)枚尼。如果第一個參數(shù)是字符串,則只能替換搜索到的第一個字砂吞。
var text = "cat, bat, sat, fat";
var result = text.replace("at", "ond");
alert(result); //"cond, bat, sat, fat"
result = text.replace(/at/g, "ond");
alert(result); //"cond, bond, sond, fond"
replace()有一些進階用法:
var text = "cat, bat, sat, fat";
//這里第二個參數(shù)是字符串的時候署恍,有一些特殊的字符序列使你可以使用最近一次匹配結(jié)果中的內(nèi)容$$ $& $' $` $n $nn
result = text.replace(/(.at)/g, "word ($1)");
alert(result); //word (cat), word (bat), word (sat), word (fat)
function htmlEscape(text){
return text.replace(/[<>"&]/g, function(match, pos, originalText){
switch(match){
case "<":
return "<";
case ">":
return ">";
case "&":
return "&";
case "\"":
return """;
}
});
}
alert(htmlEscape("<p class=\"greeting\">Hello world!</p>"));
//<p class="greeting">Hello world!</p>
split()方法
var colorText = "red,blue,green,yellow";
var colors1 = colorText.split(","); //["red", "blue", "green", "yellow"]
var colors2 = colorText.split(",", 2); //["red", "blue"]
var colors3 = colorText.split(/[^\,]+/); //["", ",", ",", ",", ""]
localeCompare():按字母表順序比較字符串
var stringValue = "yellow"; alert(stringValue.localeCompare("brick")); //1 alert(stringValue.localeCompare("yellow")); //0 alert(stringValue.localeCompare("zoo")); //-1
fromCharCode():
接收字符編碼初始化字符串
單體內(nèi)置對象
不依賴宿主環(huán)境的對象,比如Object蜻直,Array盯质。還有兩個Global和Math。
Global
終極兜底兒對象袭蝗,不屬于任何其他對象的屬性和方法都是它的。實際上沒有全局變量和全局函數(shù)般婆,都是它的是它的到腥。比如isNaN()等。
encodeURI()蔚袍、encodeURIComponent():
這兩個是用來對URI進行編碼的:
var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start" alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start" alert(encodeURIComponent(uri));
可見encodeURIComponent()只能用來對部分的URI(比如參數(shù)部分)來編碼乡范。
與之對應(yīng)的是encodeURI()、encodeURIComponent()啤咽。encodeURI()就不會解碼%23晋辆,只會解碼空格這樣的。所以用的時候要注意對應(yīng)宇整。
eval()方法:
執(zhí)行字符串里的代碼
eval("function sayHi() { alert('hi'); }");
sayHi();
像undefined Date NaN RegExp Infinity Error Object EvalError Array RangeError Function ReferenceError Boolean SyntaxError String TypeError Number URIError 都是Global的屬性哦瓶佳。
在瀏覽器中,Global是作為window對象的一部分來實現(xiàn)的鳞青。
Math對象
屬性們:Math.E霸饲、Math.LN10为朋、Math.LN2、Math.LOG2E厚脉、Math.LOG10E习寸、Math.PI、Math.SQRT1_2傻工、Math.SQRT2
var max = Math.max(3, 54, 32, 16);
alert(max); //54
var min = Math.min(3, 54, 32, 16);
alert(min); //3
//配合apply()的使用技巧
var values = [1, 2, 3, 4, 5, 6, 7, 8];
var max = Math.max.apply(Math, values);
alert(Math.ceil(25.9)); //26 向上取整
alert(Math.round(25.9)); //26 四舍五入
alert(Math.floor(25.9)); //25 向下取整
Math.random()方法返回一個0-1的隨機數(shù)
//1-10的隨機整數(shù)
var num = Math.floor(Math.random() * 10 + 1);
還有一些方法就不提了正弦什么的霞溪。