JS學習4(引用類型)

引用類型是一種數(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 "&lt;";             
            case ">":                 
                return "&gt;";             
            case "&":                 
                return "&amp;";             
            case "\"":                 
                return "&quot;";         
        }                  
    }); 
}  
alert(htmlEscape("<p class=\"greeting\">Hello world!</p>"));  
//&lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt; 

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); 

還有一些方法就不提了正弦什么的霞溪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市中捆,隨后出現(xiàn)的幾起案子鸯匹,更是在濱河造成了極大的恐慌,老刑警劉巖轨香,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽你,死亡現(xiàn)場離奇詭異,居然都是意外死亡臂容,警方通過查閱死者的電腦和手機科雳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脓杉,“玉大人糟秘,你說我怎么就攤上這事∏蛏ⅲ” “怎么了尿赚?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蕉堰。 經(jīng)常有香客問我凌净,道長,這世上最難降的妖魔是什么屋讶? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任冰寻,我火速辦了婚禮,結(jié)果婚禮上皿渗,老公的妹妹穿的比我還像新娘斩芭。我一直安慰自己,他們只是感情好乐疆,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布划乖。 她就那樣靜靜地躺著,像睡著了一般挤土。 火紅的嫁衣襯著肌膚如雪琴庵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音细卧,去河邊找鬼尉桩。 笑死,一個胖子當著我的面吹牛贪庙,可吹牛的內(nèi)容都是我干的蜘犁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼止邮,長吁一口氣:“原來是場噩夢啊……” “哼这橙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起导披,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤屈扎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撩匕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹰晨,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年止毕,在試婚紗的時候發(fā)現(xiàn)自己被綠了模蜡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡扁凛,死狀恐怖忍疾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谨朝,我是刑警寧澤卤妒,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站字币,受9級特大地震影響则披,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洗出,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一士复、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧共苛,春花似錦判没、人聲如沸蜓萄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫉沽。三九已至辟犀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绸硕,已是汗流浹背堂竟。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工魂毁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人出嘹。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓席楚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親税稼。 傳聞我的和親對象是個殘疾皇子烦秩,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,219評論 0 4
  • 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的 JavaScript 類型 使用基本類型和基本包裝類型 引用類型的...
    悶油瓶小張閱讀 677評論 0 0
  • 先生中午喝點小酒,下午睡醒郎仆,親自下廚做雞蛋西紅柿面只祠,孩子們歡呼雀躍,因為最喜歡吃爸爸做的飯扰肌。 兩個雞蛋抛寝,打開攪拌,...
    健的XUYU閱讀 325評論 0 1
  • 這周訓練營里的作業(yè)是讀《牧羊少年奇幻之旅》,我以前讀過夷狰,依稀記得是是一個少年尋找寶藏的故事岭皂,感覺寫...
    愛叨叨的白娘子閱讀 651評論 0 7