3. 標準庫
3.1 Object對象
3.1.1 概述
js提供一個Object對象驹碍,所有其他對象都繼承自它唤冈。
Object本身也是一個構(gòu)造函數(shù)伦糯,可以用來生成新對象够庙。它可以接受一個參數(shù)。如果該參數(shù)是一個對象蓝纲,則直接返回這個對象阴孟;如果是一個原始類型的值,則返回該值對應的包裝對象税迷。
var o = new Object(); //與 var o = {} 等價
var o1 = {a:1};
var o2 = new Object(o1);
o1 === o2 // true
new Object(123) instanceof Number // true
在Object對象上面部署方法:
1永丝、部署在Object對象本身
Object.print = function(o){ console.log(o) };
var o = new Object();
Object.print(o); // Object
2、部署在Object.prototype對象
定義在Object.prototype對象上面的屬性和方法箭养,將被所有實例對象共享慕嚷。
Object.prototype.print = function(){ console.log(this)};
var o = new Object();
o.print(); // Object
3.1.2 Object對象的方法
3.1.2.1 Object()
Object()可以將任意值轉(zhuǎn)為對象。
其中毕泌,原始類型的值轉(zhuǎn)為對應的包裝對象喝检。
對象,則返回原對象懈词。
Object() // 還有Object(undefined)、Object(null) 返回一個空對象
Object(1) // 等同于 new Number(1)
Object('foo') // 等同于 new String('foo')
Object(true) // 等同于 new Boolean(true)
Object([]) // 返回原數(shù)組
Object({}) // 返回原對象
Object(function(){}) // 返回原函數(shù)
3.1.2.2 Object.keys()辩诞,Object.getOwnPropertyNames()
Object.keys方法返回對象可枚舉的屬性名坎弯。
Object.getOwnPropertyNames方法返回對象所有的屬性名。
var a = ["Hello", "World"];
Object.keys(a); // ["0", "1"]
Object.getOwnPropertyNames(a); // ["0", "1", "length"]
可以用Object.keys(o).length
得到對象的屬性總數(shù)译暂。
3.1.2.3 Object.observe() //chrome支持
Object.observe方法用于觀察對象屬性的變化抠忘。
var o = {};
Object.observe(o, function(changes) {
changes.forEach(function(change) {
console.log(change.type, change.name, change.oldValue);
});
});
o.foo = 1; // add, 'foo', undefined
o.foo = 2; // update, 'foo', 1
delete o.foo; // delete, 'foo', 2
3.1.2.4 其他方法
略
3.1.3 Object實例對象的方法
除了Object對象本身的方法,還有不少方法是部署在Object.prototype對象上的外永,所有Object的實例對象都繼承了這些方法崎脉。
3.1.3.1 Object.prototype.valueOf()
valueOf方法的作用是返回一個對象的值,默認情況下返回對象本身伯顶。
它的主要用途是囚灼,自動類型轉(zhuǎn)換時會默認調(diào)用這個方法。
var o = new Object();
1 + o // "1[object Object]"
可以用自定義方法覆蓋它祭衩。
o.valueOf = function (){return 2;};
1 + o // 3
3.1.3.2 Object.prototype.toString()
toString方法的作用是返回一個對象的字符串形式灶体。
數(shù)組、字符串和函數(shù)都部署了自己的toString方法掐暮。
[1,2,3].toString() // "1,2,3"
3.1.3.3 toString()的應用:判斷數(shù)據(jù)類型
{}.toString() // "[object Object]"
上面代碼返回一個字符串“object Object”蝎抽,其中第2個字符串表示該值的準確類型。
實例對象的toString方法路克,實際上是調(diào)用Object.prototype.toString方法樟结。使用call方法养交,可以在任意值上調(diào)用Object.prototype.toString方法,從而幫助我們判斷這個值的類型瓢宦。
var type = function (o){
var s = Object.prototype.toString.call(o);//為什么不直接使用o.toString(),因為數(shù)組碎连、字符串和函數(shù)都部署了自己的toString方法。null調(diào)用toString會報錯刁笙。
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
3.1.4 對象的屬性模型
3.1.4.1 屬性的attributes對象破花,Object.getOwnPropertyDescriptor()
每個屬性都有一個attributes對象,保存該屬性的一些元信息疲吸。
var o = { p: 'a' };
Object.getOwnPropertyDescriptor(o, 'p')
// Object { value: "a",
// writable: true,
// enumerable: true,
// configurable: true
// }
enumerable: 表示該屬性是否可枚舉座每,默認為true,也就是該屬性會出現(xiàn)在for...in和Object.keys()等操作中摘悴。
configurable:表示“可配置性”峭梳,默認為true。如果設為false蹂喻,表示無法刪除該屬性葱椭,也不得改變attributes對象(value屬性除外)
3.1.4.2 Object.defineProperty(),Object.defineProperties()
可以通過這兩個方法定義或修改一個屬性口四,然后返回修改后的對象孵运。
var o = Object.defineProperties({}, {
p1: { value: 123, enumerable: true },
p2: { value: "abc", enumerable: true },
p3: { get: function() { return this.p1+this.p2 },
enumerable:true,
configurable:true
}
});
3.1.4.3 Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法返回直接定義在某個對象上面的全部屬性的名稱,而不管該屬性是否可枚舉蔓彩。
var o = Object.defineProperties({}, {
p1: { value: 1, enumerable: true },
p2: { value: 2, enumerable: false }
});
Object.getOwnPropertyNames(o)
// ["p1", "p2"]
一般來說治笨,系統(tǒng)原生的屬性(即非用戶自定義的屬性)都是不可枚舉的。
// 比如赤嚼,數(shù)組實例自帶length屬性是不可枚舉的
Object.keys([]) // []
Object.getOwnPropertyNames([]) // [ 'length' ]
3.1.4.4 Object.prototype.propertyIsEnumerable()
判斷一個屬性是否可枚舉旷赖。
o.propertyIsEnumerable("toString") // false
3.1.4.5 可寫性(writable)
決定屬性的值是否可變。
如果為false更卒,那么修改屬性值的時候不會有效果(也不報錯)等孵。
var o = Object.defineProperty({}, "a", { value : 37, writable : false });
o.a=88;
console.log(o.a);
3.1.5 控制對象狀態(tài)
3.1.5.1 Object.preventExtensions方法
使一個對象無法再添加新的屬性,但可以delete現(xiàn)有屬性蹂空。俯萌。
var o = {id:1};
Object.preventExtensions(o);
o.name="dgl";
console.log(o.name); // undefined
delete o.id;
3.1.5.2 Object.seal方法
使一個對象既無法添加新屬性,也無法刪除現(xiàn)有屬性上枕。
3.1.5.3 Object.freeze方法
使一個對象無法添加新屬性绳瘟、無法刪除現(xiàn)有屬性、也無法改變屬性的值姿骏,使這個對象實際上變成了常量糖声。
3.1.5.3 局限性
上面這些方法鎖定對象的可寫性,但是依然可以通過改變該對象的原型對象,來為它增加屬性蘸泻。
解決方案是琉苇,把原型也凍結(jié)住。
3.2 Array 對象
3.2.1 概述
Array的構(gòu)造函數(shù)行為很不一致悦施,因此不建議使用Array創(chuàng)建新數(shù)組并扇。
3.2.2 Array對象的靜態(tài)方法
3.2.2.1 isArray方法
Array.isArray方法用來判斷一個值是否為數(shù)組。它可以彌補typeof運算符的不足抡诞。
var a = [1,2,3];
typeof a // "object"
Array.isArray(a) // true
3.2.3 Array對象實例的方法
以下這些Array對象實例的方法穷蛹,都是數(shù)組實例才能使用。如果不想創(chuàng)建實例昼汗,只是想單純調(diào)用這些方法肴熏,可以寫成 [].method.call(調(diào)用對象,參數(shù)) 的形式顷窒,或者 Array.prototype.method.call(調(diào)用對象蛙吏,參數(shù))的形式禀崖。
3.2.3.1 ivalueOf方法捉偏,toString方法
valueOf方法返回數(shù)組本身。
-
toString 方法返回數(shù)組的字符串形式贝或。
var a = [1,2,3];
a.valueOf()// [1,2,3]
a.toString()// "1,2,3"
3.2.3.2 push方法谓着,pop方法
- push方法 在數(shù)組的末端添加一個或多個元素泼诱,并返回添加后的數(shù)組的長度。
- push方法還可以用于向?qū)ο筇砑釉厣廾录尤朐氐逆I對應數(shù)組的索引治筒,并且對象有一個length屬性。
- pop方法 刪除數(shù)組的最后一個元素改抡,并返回該元素矢炼。
對空數(shù)組使用pop方法系瓢,不會報錯阿纤,而是返回undefined。 - 合并兩個數(shù)組 Array.prototype.push.apply
示例:
var a = new Array();
var b = {id:123};
a.push(1) // 1
a.push("a",true) // 3
console.log(a); // [1,"a",true]
[].push.call(b, 'yy');
console.log(b); // {0: "yy", id: 123, length: 1}
a.pop() // true
console.log(a);// [1,"a"]
[].pop() // undefined
Array.prototype.push.apply(a, b);
console.log(a); // [1, "a", "yy"]
3.2.3.3 join方法夷陋,concat方法
- join方法 將所有數(shù)組成員組成一個字符串返回欠拾。如果不提供參數(shù),默認用逗號分隔骗绕。
- concat方法 連接多個數(shù)組藐窄。
示例:
var a = [1,2,3,4];
a.join() // "1,2,3,4"
a.join('') // '1234'
Array.prototype.join.call(a, '-') // "1-2-3-4"
a.concat(["world"]) // [1, 2, 3, 4, world]
3.2.3.4 shift方法,unshift方法
shift 刪除數(shù)組的第一個元素酬土,并返回該元素荆忍。
unshift 在數(shù)組的第一個位置添加元素,并返回數(shù)組長度。
var list = ['a','b','c'];
console.log(list.shift()); // a
console.log(list.unshift(0)); // 3
console.log(list); // [0, "b", "c"]
3.2.3.5 reverse方法
反轉(zhuǎn)
var a = ['a', 'b', 'c'];
a.reverse() // ["c", "b", "a"]
3.2.3.6 slice方法
1刹枉、作用相當于substring叽唱。
第一個參數(shù)為起始位置(從前往后,0開始微宝;從后往前棺亭,-1開始),
第二個參數(shù)為終止位置(但不包括該位置的元素)
參數(shù)是負數(shù)蟋软,表示從后向前排序镶摘;
第一個參數(shù)值大于數(shù)組成員的個數(shù),或者第二個參數(shù)小于第一個參數(shù)岳守,則返回空數(shù)組凄敢。
var a = ["a","b","c"];
a.slice(1,2) // ["b"]
a.slice() // ["a","b","c"]
a.slice(-2) // ["b", "c"]
a.slice(-2,-1) // ["b"]
a.slice(-2,0) // []
a.slice(-2,1) // []
a.slice(-2,2) // ["b"]
a.slice(4) // []
a.slice(2, 6) // ["c"]
2、將類似數(shù)組的對象轉(zhuǎn)為真正的數(shù)組棺耍。
Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 }) // ['a', 'b']
Array.prototype.slice.call(document.querySelectorAll("div"));
3.2.3.7 splice方法
splice方法用于刪除元素贡未,并可添加新元素。返回值是被刪除的元素蒙袍。
第一個參數(shù)是刪除的起始位置俊卤,
第二個參數(shù)是被刪除的元素個數(shù)(可以為0)。
更多的參數(shù)表示要被插入數(shù)組的新元素害幅。
var a = ["a","b","c"];
a.splice(1,1) // ["b"] a變?yōu)閇"a","c"]
a.splice(1,0,'X') // ["b"] a變?yōu)閇"a","X","c"]
a.splice(1,2,9,8) // ["b"] a變?yōu)閇"a",9,8]
3.2.3.8 sort方法
排序消恍,默認是按照字典順序排序。排序后以现,原數(shù)組將被改變狠怨。
可以接受一個參數(shù),表示按照自定義方法進行排序邑遏。
var list=[3,2,5];
list.sort(); // 2,3,5
list.sort(funtion(a,b){
return b-a;
}); // 5,3,2
3.2.4 ECMAScript 5 新加入的數(shù)組方法
map佣赖、forEach、filter记盒、every憎蛤、some、reduce纪吮、reduceRight與函數(shù)式操作有關(guān)俩檬。它們可以在數(shù)組或類似數(shù)組的對象上使用。
其參數(shù)是一個函數(shù)碾盟,這個函數(shù)本身又接受三個參數(shù):數(shù)組的當前元素elem棚辽、該元素的位置index和整個數(shù)組arr。
另外冰肴,上下文對象(context)可以作為第二個參數(shù)屈藐,傳入forEach(), every(), some(), filter(), map()方法榔组,用來綁定函數(shù)運行時的上下文。
3.2.4.1 map方法联逻,forEach方法
//map方法對數(shù)組的每個元素執(zhí)行一個函數(shù)瓷患,所有結(jié)果返回一個新數(shù)組。
var a = [1, 2, 3]
var a2 = a.map(function(elem, index, arr){
return elem + elem;
});
console.log(a); //[1, 2, 3]
console.log(a2); //[2, 4, 6]
//通過call方法可以將map用在類似數(shù)組的對象上遣妥。
var b = [].map.call("abc", function(elem, index, arr){
return elem + elem;
});
console.log(b); //["aa", "bb", "cc"]
//forEach和map類似擅编,區(qū)別是不返回新數(shù)組(可以改變原數(shù)組的值)。
var c = [1, 2, 3];
var c2 = c.forEach(function(elem, index, arr){
arr[index] = elem * index;
return elem;
});
console.log(c); //[0, 2, 6]
console.log(c2); //undefined
//還可以接受第二個參數(shù)箫踩,用來綁定函數(shù)中的this關(guān)鍵字爱态。
[1, 2, 3].map(function(elem, index, arr){
this.push(elem * elem); //this指向out變量
}, out);
3.2.4.2 filter方法
filter對所有成員調(diào)用一個函數(shù),所有結(jié)果為true的成員組成一個新數(shù)組返回境钟。(c#的Where)
[1,2,3,4,5].filter(function(elem){
return (elem>3);
})
// [4,5]
filter方法還可以有兩個可選參數(shù)index锦担、arr,分別是當前數(shù)組成員的位置和整個數(shù)組慨削。
[1, 2, 3, 4, 5].filter(function(elem, index, arr){
return index % 2 === 0;
});
// [1, 3, 5]
3.2.4.3 some方法洞渔,every方法
some 判斷是否存在滿足條件的元素。
[1, 2, 3, 4, 5].some(function(elem, index, arr){
return elem >= 3;
});
// 返回true
every 判斷是否所有元素都滿足條件缚态。
[1, 2, 3, 4, 5].every(function(elem, index, arr){
return elem >= 3;
});
// 返回false
3.2.4.4 reduce方法(歸約)磁椒,reduceRight方法
reduce 依次處理數(shù)組的每個元素,最終累計為一個值玫芦。(c#的Aggregate)
[1, 2, 3, 4, 5].reduce(function(x, y,index,arr){
console.log(index); //跳過0浆熔,直接從1開始
return x*y;
});
//120
可以對對累計變量指定初值。(和Aggregate一樣)
reduceRight就是從右向左執(zhí)行reduce桥帆。
[1, 2, 3, 4, 5].reduceRight(function(x, y){
return x+y;
}, '---');
// ---54321
3.2.4.5 indexOf 和 lastIndexOf
indexOf方法返回給定元素在數(shù)組中第一次出現(xiàn)的位置医增,如果沒有出現(xiàn)則返回-1。
lastIndexOf找最后一個老虫。
['aa','bb','cc'].indexOf('b') //-1
['aa','bb','cc'].indexOf('bb') //1
3.2.4.6 鏈式使用
如果返回值依然是數(shù)組叶骨,當然就可以鏈式使用了。比如:map祈匙、forEach忽刽、filter
3.3 包裝對象和Boolean對象
3.3.1 包裝對象
可以將原始類型的值(數(shù)值、字符串菊卷、布爾值)變成對象缔恳,這就是“包裝對象”宝剖。
var v1 = new Number(123);
var v2 = new String("abc");
var v3 = new Boolean(true);
typeof v1 // "object"
v1 === 123 // false
包裝對象使原始類型也可以調(diào)用Object的原生方法洁闰。
3.3.1.1 包裝對象的構(gòu)造函數(shù)
Number、String和Boolean這三個原生對象有兩種用万细。
1扑眉、構(gòu)造函數(shù)
2纸泄、方法(相當于生成實例后再調(diào)用valueOf方法)
new Number(123); //[object Number]
Number(123); //123
3.3.1.2 包裝對象實例的方法
1、valueOf
返回對應的原始類型的值腰素。
new Boolean("true").valueOf()
// true
2聘裁、toString
返回對應的原始類型值的字符串形式。
new Boolean("true").toString()
// "true"
3.3.1.3 原始類型的自動轉(zhuǎn)換
原始類型可以自動調(diào)用定義在其包裝對象上的方法和屬性弓千。
包括三個包裝對象各自定義在實例上的方法衡便。
"abc".length // 3
'abc'.charAt === String.prototype.charAt // true
實質(zhì)是字符串被JavaScript引擎自動轉(zhuǎn)為String對象的實例,然后調(diào)用這個實例的length屬性洋访。得到返回值后镣陕,再自動銷毀這個臨時的包裝對象實例。
自定義方法
還可以在原型上添加自定義方法和屬性姻政。
String.prototype.double = function (){
return this.valueOf() + this.valueOf();
};
"abc".double() // abcabc
但是呆抑,這種自定義方法和屬性的機制,只能定義在包裝對象的原型上汁展,想要直接對原始類型的變量添加屬性鹊碍,則無效。
var s = "abc";
s.p = 123;
s.p // undefined
3.3.2 Boolean對象
3.3.2.1 構(gòu)造函數(shù)
用于生成布爾值的包裝對象的實例食绿。
var b = new Boolean(true);
typeof b // "object"
b.valueOf() // true
3.3.2.2 工具方法
將任意值轉(zhuǎn)為布爾值侈咕。
(undefined、null器紧、+0乎完、-0、''品洛、NaN為false树姨,其它都是true)
使用not運算符(!)也可以達到同樣效果。
var a = "false";
new Boolean(a).valueOf() // true
Boolean(a) // true
!!a // true
注意:對象被自動類型轉(zhuǎn)換為布爾時桥状,結(jié)果都是true帽揪。
if (Boolean(false))
console.log('true'); // 無輸出
if (new Boolean(false))
console.log('true'); // true
3.3.3 Number對象
3.3.3.1 構(gòu)造函數(shù)
var n = new Number(1);
typeof n // "object"。
3.3.3.2 工具方法
請看“數(shù)據(jù)類型轉(zhuǎn)換”
3.3.3.3 Number對象的屬性
正無限(POSITIVE_INFINITY)
負無限(NEGATIVE_INFINITY)
NaN
MAX_VALUE
MIN_VALUE
3.3.3.4 Number對象實例的方法
1辅斟、Number.prototype.toString()
Number對象有單獨的toString方法转晰,它可以接受一個參數(shù)(表示進制)。
(3).toString() // "3"
(3).toString(2) // "11"
3.toString(2) // SyntaxError //JavaScript引擎解釋成小數(shù)點
3..toString(2) // "11" //兩個點就會理解成調(diào)用對象屬性
3.5.toString() // "3.5" //可以直接對一個小數(shù)使用toString方法
3['toString'](2) // "11" //通過方括號運算符也可以調(diào)用toString方法士飒。
將其他進制的數(shù)查邢,轉(zhuǎn)回十進制,需要使用parseInt方法酵幕。
2扰藕、Number.prototype.toFixed()
將一個數(shù)轉(zhuǎn)為指定位數(shù)的小數(shù)。
(3).toFixed(2)// "3.00"
(3.005).toFixed(2)// "3.01"
3芳撒、Number.prototype.toExponential()
將一個數(shù)轉(zhuǎn)為科學計數(shù)法形式邓深。
(10).toExponential(1)// "1.0e+1"
(1234).toExponential(1)// "1.2e+3"
4未桥、Number.prototype.toPrecision()
將一個數(shù)轉(zhuǎn)為指定位數(shù)的有效數(shù)字。
(12.34).toPrecision(1)// "1e+1"
(12.34).toPrecision(2)// "12"
(12.34).toPrecision(3)// "12.3"
(12.34).toPrecision(5)// "12.340"
toPrecision方法用于四舍五入時不太可靠
5芥备、自定義方法
同樣冬耿,Number.prototype對象上面可以自定義方法,被Number的實例繼承萌壳。
Number.prototype.add = function (x) {
return this + x;
};
(8).add(2) // 10
3.3.4 String
3.3.4.1 構(gòu)造函數(shù)
var s = new String("abc");
typeof s // "object"
3.3.4.2 工具方法
String(true) // "true"
String(5) // "5"
3.3.4.3 String.fromCharCode()
該方法根據(jù)Unicode編碼亦镶,生成一個字符串。
String.fromCharCode(104, 101, 108, 108, 111)
// "hello"
注意袱瓮,該方法不支持編號大于0xFFFF的字符染乌。這種情況下,只能使用四字節(jié)的UTF-16編號懂讯。
String.fromCharCode(0xD842, 0xDFB7)
// "??"
3.3.4.4 實例對象的屬性和方法
1荷憋、length屬性
返回字符串的長度。
2褐望、charAt 和 charCodeAt 方法
- charAt返回字符串指定位置的字符勒庄。
- charCodeAt方法返回給定位置字符的Unicode編碼(十進制表示)。
- 如果給定位置為負數(shù)瘫里,或者過大实蔽,則這兩個方法返回NaN(或"")。
示例:
"abc".charAt(1) // "b"
"abc".charAt(-1) // ""
"abc".charAt(3) // ""
"abc".charCodeAt(1) // 98
"abc".charCodeAt(-1) // NaN
"abc".charCodeAt(3) // NaN
chatAt可以用下標代替:
"abc"[1] // "b"
注意:如果遇到Unicode大于65536的字符(即第一個字節(jié)在U+D800到U+DBFF之間)谨读,就要連續(xù)使用兩次charCodeAt局装。
"張".charCodeAt(0) // 23534
"張".charCodeAt(1) // 65533
3、concat方法
連接多個字符串(原來的字符串不受影響)劳殖。
"a".concat("bb") // abb
"a".concat("bb","c") // abbc
其實字符串連接用加號(+)就好铐尚。
4、substring方法哆姻,substr方法和slice方法
- substring(a,b) 取從a到b(不包括b)位置的子串宣增。如果a小于b,則兩個參數(shù)互換矛缨。
- slice(a,b) 和substring唯一不同是爹脾,如果a小于b,兩個參數(shù)不互換箕昭,返回空字符串灵妨。
- substr(a,b) 取從a開始長度為b的子串。
示例:
var s = "abcde";
s.substring(2, 3); // "c"
s.substring(3, 2); // "c"
s.slice(2, 3); // "c"
s.slice(3, 2); // ""
s.substr(2, 3); // "cde"
s.substr(3, 2); // "de"
- 如果沒有第二個參數(shù)落竹,表示一直取到字符串結(jié)束泌霍。
- 如果參數(shù)為負:
substring,自動將負數(shù)轉(zhuǎn)為0筋量。
slice烹吵,負數(shù)表示從尾部開始計算。
substr桨武,第一個參數(shù)是負數(shù)表示從尾部開始計算肋拔;負第二個參數(shù)是負數(shù)將被轉(zhuǎn)為0。
示例:
"Hello World".slice(-3) // "rld"
"Hello World".slice(4,-3) // "o Wo"
"Hello World".substring(-3) // "Hello World"
"Hello World".substring(4,-3) // "Hell"
"Hello World".substr(-3) // "rld"
"Hello World".substr(4,-3) // ""
5呀酸、indexOf 和 lastIndexOf 方法
都用來確定一個字符串在另一個字符串中的位置凉蜂。lastIndexOf從尾部開始匹配。
"hello world".indexOf("o") // 4
"hello world".lastIndexOf("o") // 7
它們還可以接受第二個參數(shù)性誉,表示從該位置開始匹配窿吩。
"hello world".indexOf("o", 6) // 7
"hello world".lastIndexOf("o", 6) // 4
6、trim 方法
去除字符串兩端的空格错览。(不改變原字符串)
" hello ".trim() // "hello"
7纫雁、toLowerCase 和 toUpperCase 方法
toLowerCase轉(zhuǎn)小寫,toUpperCase轉(zhuǎn)大寫倾哺。
"Hello".toLowerCase() // "hello"
"Hello".toUpperCase() // "HELLO"
8轧邪、localeCompare方法
比較兩個字符串。返回值小于0羞海,表示第一個字符串屑捎蕖;大于0却邓,表示第一個字符串大;等于0硕糊,表示相等。
'apple'.localeCompare('banana') // -1
'apple'.localeCompare('apple') // 0
9腊徙、搜索和替換
- match:返回匹配的子字符串數(shù)組(默認只返第一個)简十。找不到則返回null。
- search:返回第一個匹配的位置撬腾。找不到則返回-1勺远。
- replace:替換匹配的字符串(默認只替換第一個)。
- split:分割字符串时鸵,返回分割后的數(shù)組胶逢。
(如省略分割規(guī)則,則返回數(shù)組的唯一成員就是原字符串饰潜。)
示例:
var matchs="abcdefabcdef".match("bc");
console.log(matchs); // ["bc"]
console.log(matchs.index); // 1
console.log(matchs.input); // "abcdefabcdef"
var matchs2="abcdefabcdef".match(/bc/g);
console.log(matchs2); // ["bc", "bc"]
//matchs2就沒有index和input了
console.log("abcdefabcdef".search("bc")); // 1
console.log("Cat,dog cat,mice".replace(/cat/gi,"*")); // "*,dog *,mice"
console.log("|a,b|c".split()); // ["|a,b|c"]
console.log("|a,b|c".split(/,|\|/)); // ["", "a", "b", "c"]
3.4 Math對象
Math是JavaScript的內(nèi)置對象初坠,提供一系列數(shù)學常數(shù)和數(shù)學方法。它不能作為構(gòu)造函數(shù)或工具函數(shù)使用彭雾。
3.4.1 屬性
E:常數(shù)e碟刺。。
PI:常數(shù)Pi薯酝。
3.4.2 方法
1半沽、round 四舍五入爽柒。(注意:負數(shù)和正數(shù)有不同)
console.log(Math.round(1.4)); //1
console.log(Math.round(1.5)); //2
console.log(Math.round(-1.5)); //-1
console.log(Math.round(-1.6)); //-2
2、abs方法者填,max方法浩村,min方法
Math.abs(-1) // 1
Math.max(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
3、floor(小于參數(shù)的最大整數(shù))占哟,ceil(大于參數(shù)的最小整數(shù))
Math.floor(3.2) // 3
Math.floor(-3.2) // -4
Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3
4心墅、pow(指數(shù)),sqrt(平方根)
Math.pow(2, 2) // 4
Math.pow(2, 3) // 8
Math.sqrt(4) // 2
Math.sqrt(-4) // NaN //如第一參數(shù)是負值榨乎,則返回NaN怎燥。
5、log(e的自然對數(shù))蜜暑,exp方法(10的對數(shù))
6铐姚、random 0到1之間的偽隨機數(shù)。(左閉右開)
Math.random() // 0.7151307314634323
// 返回給定范圍內(nèi)的隨機數(shù)
Math.random() * (max - min) + min;
7肛捍、三角函數(shù)方法
3.5 Date對象
3.5.1 概述
3.5.1.1 Date()
返回當前日期和時間的字符串谦屑。
3.5.1.2 new Date()
返回值為當前時間的Date對象。
var date1 = Date();
var date2 = new Date();
typeof date1; // string
typeof date2; // object
3.5.1.3 new Date(milliseconds)
參數(shù)為從1970年1月1日UTC開始計算的毫秒數(shù)篇梭。
new Date(3600*24*1000); // 1970年1月2日
3.5.1.4 new Date(datestring)
參數(shù)是Date.parse()能接受的字符串氢橙。
new Date("2013-02-15")
3.5.1.5 new Date(year, month [, day, hours, minutes, seconds, ms])
注意:如果只有一個數(shù)值參數(shù),那將被當做毫秒數(shù)恬偷。
月從0開始計算悍手,0表示1月 (可為負數(shù)或很大的數(shù))
天從1開始計算,0表示上個月最后一天 (可為負數(shù)或很大的數(shù))
年的0袍患,表示1900年坦康;負數(shù),則表示公元前诡延。
new Date(2015); // 1970.1.1 8點多
new Date(2015,0); // 2015.1.1
new Date(2015,1); // 2015.2.1
new Date(2015,0,-1); // 2014.12.30
new Date(2015,0,0); // 2014.12.31
new Date(2015,0,1); // 2015.1.1
new Date(2015,1,0); // 2015.1.31
new Date(2015,1,1); // 2015.2.1
new Date(2015,1,29); // 2015.3.1
new Date(1,0); // 1901.1.1
new Date(0,0); // 1900.1.1
new Date(-1,0); // -1.1.1
3.5.1.6 日期的運算
兩個日期對象進行減法滞欠,返回的是間隔毫秒數(shù);
進行加法肆良,返回的是兩個字符串的連接筛璧。
3.5.2 Date對象的方法
3.5.2.1 Date.now()
返回距離1970年1月1日的毫秒數(shù)。
Date.now() // 1364026285194
另:window.performance.now()返回頁面加載到命令運行時已經(jīng)過去的毫秒數(shù)惹恃。
3.5.2.2 Date.parse()
返回字符串表示的時間距離1970年1月1日UTC的毫秒數(shù)或NaN夭谤。
Date.parse("Aug 9, 1995") // 807897600000
3.5.2.3 Date.UTC()
默認Date對象返回的是當前時區(qū)的時間。Date.UTC方法可以返回UTC時間巫糙。
用法與Date構(gòu)造函數(shù)完全一致朗儒。
3.5.3 Date實例對象的方法
3.5.3.1 Date.prototype.toString()
toString是默認的調(diào)用方法,所以如果直接讀取Date對象實例,就相當于調(diào)用實例的toString方法醉锄。
new Date().toString(); // Mar 04 2015 17:56:06
new Date(); // Mar 04 2015 17:56:06
3.5.3.1 Date.prototype.toUTCString()乏悄,Date.prototype.toISOString()
new Date().toUTCString(); // Mar 04 2015 9:56:06
3.5.3.1 Date.prototype.toDateString(),Date.prototype.toTimeString()
toDateString返回日期部分的字符串恳不,
toTimeString返回時間部分的字符串檩小。
new Date().toDateString(); // Mar 04 2015
3.5.3.1 Date.prototype.toLocaleDateString(),Date.prototype.toLocaleTimeString()
toLocaleDateString返回日期的當?shù)貙懛ǎ?br> toLocaleTimeString返回時間的當?shù)貙懛ā?/p>
new Date().toLocaleDateString(); // 2015/3/4
new Date().toLocaleTimeString(); // 下午6:11:04
3.5.3.1 Date.prototype.valueOf()
返回距離1970年1月1日UTC的毫秒數(shù)妆够,等同于getTime方法识啦。
new Date().valueOf() // 1362790014817
new Date().getTime() // 1362790014817
3.5.3.1 Date.prototype.get系列方法
- .getTime():返回距離1970年1月1日的毫秒數(shù)负蚊,等同于valueOf方法神妹。
- .getDate():返回對應每個月的幾號(從1開始)。
- .getDay():返回星期(0-6)家妆,星期日為0鸵荠。
- .getFullYear():返回四位的年份。
- .getMonth():返回月份(0-11)伤极。
- .getHours():返回小時(0-23)蛹找。
- .getMilliseconds():返回毫秒(0-999)。
- .getMinutes():返回分鐘(0-59)哨坪。
- .getSeconds():返回秒(0-59)庸疾。
上面的方法返回的都是當前時區(qū)的時間,Date對象還提供了這些方法對應的UTC版本当编,比如getUTCFullYear()等届慈。
3.5.3.1 Date.prototype.set系列方法
.setDate(date):設置實例對象對應的每個月的幾號(1-31),返回改變后毫秒時間戳忿偷。
.setFullYear(year [, month, date]):設置四位年份金顿。
.setHours(hour [, min, sec, ms]):設置小時(0-23)。
.setMilliseconds():設置毫秒(0-999)鲤桥。
.setMinutes(min [, sec, ms]):設置分鐘(0-59)揍拆。
.setMonth(month [, date]):設置月份(0-11)。
.setSeconds(sec [, ms]):設置秒(0-59)茶凳。
.setTime(milliseconds):設置毫秒時間戳嫂拴。
new Date().setFullYear(0,0,1)); // 0年1月1日 18:24:44
3.5.3.1 Date.prototype.toJSON()
返回JSON格式的日期對象。
jsonDate = new Date().toJSON();
console.log(jsonDate); // 2015-03-04T10:28:54.215Z
var backToDate = new Date(jsonDate);
console.log(backToDate); // Date對象
3.6 RegExp對象
3.6.1 概述
創(chuàng)建正則表達式有兩種方法:
1贮喧、使用字面量顷牌,以斜杠表示開始和結(jié)束。
2塞淹、使用RegExp構(gòu)造函數(shù)
var regex = /xyz/ig; // ig是修飾符
var regex = new RegExp("xyz","ig");
3.6.2 正則對象的屬性和方法
3.6.2.1 屬性
- ignoreCase:只讀 表示是否設置了i修飾符窟蓝。
- global:只讀 表示是否設置了g修飾符。
- lastIndex:可讀可寫,只有設置了g才有意義 返回下一次開始搜索的位置运挫。
- source:只讀 返回正則表達式的字符串形式(不包括反斜杠)状共。
- multiline:只讀 表示是否設置了m修飾符。
示例:
var r = /abc/igm;
r.ignoreCase // true
r.global // true
r.multiline // true
r.lastIndex // 0
r.source // "abc"
3.6.2.2 test方法
1谁帕、驗證字符串是否符合某個模式峡继。
/CAT/i.test('cats and dogs') // true
2、如果正則表達式帶有g(shù)修飾符匈挖,則每次test方法都從上一次結(jié)束的位置開始向后匹配碾牌。
顯然這個是通過閉包實現(xiàn)的,如果不能對同一個RegExp對象交叉?zhèn)魅氩煌膮?shù)儡循,以免出錯舶吗。
var r = /x/g;
var s = '_x_x';
r.lastIndex // 0
r.test(s) // true
r.lastIndex // 2
r.test(s) // true
r.lastIndex // 4
r.test(s) // false
r.lastIndex // 0
3、如果正則模式是一個空字符串择膝,則匹配所有字符串誓琼。
new RegExp("").test("abc")// true
3.6.2.3 exec方法
返回匹配結(jié)果。
匹配成功肴捉,返回數(shù)組腹侣,里面包括(匹配結(jié)果、input齿穗、index)傲隶。匹配失敗,返回null窃页。
var reg = /x/g ;
var r = reg.exec('_x_x') // ["x"] //r.index是1
r = reg.exec('_x_x') // ["x"] //r.index是3
r = reg.exec('_x_x') // null
如果RegExp里包含圓括號跺株,則返回的數(shù)組會包括多個元素。第一個元素是整個匹配結(jié)果腮出,后面的元素就是圓括號對應的匹配結(jié)果帖鸦。整個返回數(shù)組的length屬性等于匹配成功的組數(shù)+1。
var s = 'x_x';
var r = /(x)/;
r.exec(s) // ["_x", "x"]
上面代碼的exex方法胚嘲,返回一個數(shù)組作儿。第一個元素是整個匹配的結(jié)果,第二個元素是圓括號匹配的結(jié)果馋劈。
var r = /a(b+)a/g;
var s = "_abbba_aba_";
while(true) {
var match = r.exec(s);
if (!match) break;
console.log(match,match[1]);
}
//["abbba", "bbb"] "bbb"
//["aba", "b"] "b"
如果正則對象是一個空字符串攻锰,則exec方法會匹配成功,但返回的也是空字符串妓雾。
3.6.3 字符串對象的方法
3.6.3.1 match:查找匹配的子字符串娶吞。
'_x_x'.match(/x/) // ["x"]
與正則對象的exec方法非常類似:匹配成功返回一個數(shù)組,失敗返回null械姻。
但如果正則帶有g(shù)修飾符妒蛇,則會返回所有匹配成功的結(jié)果。
'_x_x'.match(/x/g) // ["x","x"]
3.6.3.2 search:搜索。
返回第一個滿足條件的匹配結(jié)果的位置绣夺,或-1吏奸。
該方法會忽略g參數(shù)。
'_x_x'.search(/x/)// 1
3.6.3.3 replace:替換陶耍。
replace的第一個參數(shù)是搜索模式奋蔚,第二個是要替換為的內(nèi)容。
搜索模式如果不加g修飾符烈钞,就替換第一個匹配成功的值泊碑,否則替換所有。
"aaa".replace("a", "B") // "Baa"
"aaa".replace(/a/, "B") // "Baa"
"aaa".replace(/a/g, "B") // "BBB"
replace方法的第二個參數(shù)可以使用美元符號$毯欣,用來指代所替換的內(nèi)容馒过。
- $& 指代匹配的子字符串。
- $` 指代匹配結(jié)果前面的文本仪媒。
- $' 指代匹配結(jié)果后面的文本沉桌。
- $n 指代匹配成功的第n組內(nèi)容谢鹊,n從1開始計數(shù)(當然了算吩,因為第0組是全部匹配結(jié)果啊)。
- $$ 指代美元符號$佃扼。
示例:
"abc".replace("b", "[$`-$&-$']")// "a[a-b-c]c"
"hello world".replace(/(\w+)\s(\w+)/,"$2 $1")// "world hello"
第二個參數(shù)還可以是一個函數(shù)偎巢,將匹配內(nèi)容替換為函數(shù)返回值。
3.6.3.4 split:分割兼耀。
split的第一個參數(shù)是分隔規(guī)則压昼,第二個是返回數(shù)組的最大成員數(shù)。
'a, b,c, d'.split(',') // [ 'a', ' b', 'c', ' d' ]
'a, b,c, d'.split(/, */) // [ 'a', 'b', 'c', 'd' ]
'a, b,c, d'.split(/, */, 2) // [ 'a', 'b' ]
如果正則表達式帶有括號瘤运,則括號匹配的部分也會作為數(shù)組成員返回窍霞。
"aaa*a*".split(/(a*)/)// [ '', 'aaa', '*', 'a', '*' ]
'a, b , '.split(/ *(,) */)// ["a", ",", "b", ",", ""]
3.6.4 匹配規(guī)則
3.6.4.1 字面量字符和元字符
大部分字符在正則表達式中,就是字面的含義拯坟,比如/a/匹配a但金,/b/匹配b。它們都叫做“字面量字符”(literal characters)郁季。
還有一部分字符有特殊含義冷溃,不代表字面的意思。它們叫做“元字符”(metacharacters)梦裂。
1似枕、點(.)
匹配除回車(\r)、換行(\n)年柠、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符凿歼。
2、位置字符
^ 表示字符串的起首独旷。
$ 表示字符串的行尾词爬。
3懂拾、選擇符(|)
/11|22/.test("911") // true
3.6.4.2 字符類
字符類(class)表示有一系列字符可供選擇阱冶,只要匹配其中一個就可以了饰恕。所有可供選擇的字符都放在方括號內(nèi)贯被。
/[abc]/.test("apple") // true
1荤牍、脫字符(^)
如果方括號內(nèi)的第一個字符是[^]氧敢,則表示除了字符類之中的字符侯嘀,其他字符都可以匹配另凌。
/[^abc]/.test("xyz"); // true
/[^abc]/.test("xyc"); // true
/[^abc]/.test("ac"); // false
注意,脫字符只有在字符類的第一個位置才有特殊含義戒幔,否則就是字面含義吠谢。
2、連字符(-)
當-
不出現(xiàn)在方括號之中诗茎,就不是連字符工坊。
/a-c/.test(" a-c "); // true //這個-不是連接符
/a-c/.test("-"); // false //這個-不是連接符
/[3-5]/.test("a3b"); // true //這個-是連接符
[1-31] //這個不代表1到31,只代表1到3敢订。
3王污、重復類
{} 表示模式的重復次數(shù)。{n}表示重復n次楚午,{n,}表示至少重復n次昭齐,{n,m}表示重復不少于n次,不多于m次矾柜。
/lo{2}k/.test("look") // true
/lo{2,5}k/.test("looook") // true
4阱驾、量詞符
? 表示某個模式出現(xiàn)1次或0次,等同于{0, 1}怪蔑。
- 表示某個模式出現(xiàn)0次或多次里覆,等同于 {0,}。
- 表示某個模式出現(xiàn)1次或多次缆瓣,等同于 {1,}喧枷。
以上三個量詞符,默認都是貪婪模式捆愁。比如割去,對于字符串“aaa”來說,/a+/將會匹配“aaa”昼丑,而不會匹配“aa”呻逆。
如果要改為非貪婪模式,可以在量詞符后面加一個問號菩帝。比如咖城,/a+?/將會只匹配“a”茬腿。
/a+/.exec("aa"); // ["aa"]
/a+?/.exec("aa"); // ["a"]
/^a+?/.exec("aa"); // ["a"]
5、轉(zhuǎn)義符
正則模式中宜雀,需要用斜杠轉(zhuǎn)義的切平,一共有12個字符:^、.辐董、[悴品、$、(简烘、)苔严、|、孤澎、+届氢、?、{覆旭、\退子。
注意:如果使用RegExp創(chuàng)建正則對象,轉(zhuǎn)義需要使用兩個斜杠*型将,因為字符串內(nèi)部會先轉(zhuǎn)義一次寂祥。
/1\+1/.test("1+1") // true
(new RegExp("1\\+1")).test("1+1") // true
6、修飾符
- g(global) 全局匹配
默認第一次匹配成功后茶敏,正則對象就停止向下匹配壤靶。
加上g后缚俏,每次都是從上一次匹配成功處繼續(xù)向后匹配惊搏。
var regex = /b/g;
regex.test('abba'); // true
regex.test('abba'); // true
regex.test('abba'); // false
- i(ignorecase) 忽略大小寫
默認正則對象區(qū)分大小寫。
加上i后忽略大小寫忧换。
/abc/.test("ABC") // false
/abc/i.test("ABC") // true
- m(multiline) 多行模式
默認正則對象會將換行符當作算入字符串的開頭或結(jié)尾恬惯。
加上m后,正則對象會忽略字符串頭部或尾部的換行符亚茬,即^和$會忽略換行符酪耳。
/world$/.test("hello world\n") // false
/world$/m.test("hello world\n") // true
7、預定義模式
預定義模式指的是某些常見模式的簡寫方式刹缝。
\d 匹配0-9之間的任一數(shù)字碗暗,相當于[0-9]。
\D 匹配所有0-9以外的字符梢夯,相當于[^0-9]言疗。
\w 匹配任意的字母、數(shù)字和下劃線颂砸,相當于[A-Za-z0-9_]噪奄。
\W 除所有字母死姚、數(shù)字和下劃線以外的字符,相當于/[^A-Za-z0-9_]/ 勤篮。
\s 匹配空格(包括制表符都毒、空格符、斷行符等)碰缔,相等于[\t\r\n\v\f]账劲。
\S 匹配非空格的字符,相當于[^\t\r\n\v\f]金抡。
\b 匹配詞的邊界涤垫。
\B 匹配非詞邊界,即在詞的內(nèi)部竟终。
8蝠猬、特殊字符
正則對象對一些不能打印的特殊字符,提供了表達形式统捶。
\n 匹配換行鍵榆芦。
\r 匹配回車鍵。
\t 匹配制表符tab(U+0009)喘鸟。
\v 匹配垂直制表符(U+000B)匆绣。
\f 匹配換頁符(U+000C)。
\0 匹配null字符(U+0000)什黑。
9崎淳、組匹配
正則表達式的括號表示分組匹配,括號中的模式可以用來捕獲分組的內(nèi)容愕把。
var m = "abcabc".match(/(.)b(.)/);
m // ["abc", "a", "c"]
注意拣凹,使用組匹配時,不宜同時使用g修飾符恨豁,否則match方法不會捕獲分組的內(nèi)容嚣镜。
var m = "abcabc".match(/(.)b(.)/g);
m // ["abc", "abc"]
上面代碼使用帶g修飾符的正則表達式,結(jié)果match方法只捕獲了匹配整個表達式的部分橘蜜。
在正則表達式內(nèi)部菊匿,可以用\n引用括號匹配的內(nèi)容,n是從1開始的自然數(shù)计福,表示對應順序的括號跌捆。
/(.)b(.)\1b\2/.test("abcabc");
/(.)b(.)\1b\2/.test("abcXbc");
- 非捕獲組 (?:x)
表示不返回該組匹配的內(nèi)容。
var m = "abc".match(/(?:.)b(.)/);
m[1] // "c" //如果是match(/(.)b/)則m[1]是"a"
var url = /(http|ftp):\/\/([^/\r\n]+)(\/[^\r\n]*)?/;
url.exec("http://google.com/"); // ["http://google.com/", "http", "google.com", "/"]
var url = /(?:http|ftp):\/\/([^/\r\n]+)(\/[^\r\n]*)?/;
url.exec("http://google.com/"); // ["http://google.com/", "google.com", "/"]
- 先行斷言 x(?=y)
表示x只有在y前面才匹配象颖,y不會被計入返回結(jié)果佩厚。
var m = "abc".match(/b(?=c)/);
m // "b"
- 后行斷言 x(?!y)
表示x只有不在y前面才匹配,y不會被計入返回結(jié)果力麸。
var m = "abd".match(/b(?!c)/);
m // ["b"]
3.7 JSON對象
3.7.1 JSON格式
對象:是一個無序的“‘名稱/值’對”集合可款。
{string:value, ...string:value}
數(shù)組:是值(value)的有序集合育韩。
[value, ...value]
值:
字符串(必須雙引號)、
數(shù)值(必須十進制)闺鲸、
布爾值筋讨、
null、
JSON格式的對象摸恍、
JSON格式的數(shù)組悉罕。
3.7.2 JSON對象
JSON.stringify()
將一個值轉(zhuǎn)為JSON字符串。
正則對象會被轉(zhuǎn)成空對象立镶。
JSON.stringify方法還可以接受一個數(shù)組參數(shù)壁袄,指定需要轉(zhuǎn)成字符串的屬性。還可以接受一個函數(shù)來更改默認的字符串化的行為媚媒。
JSON.parse()
將JSON字符串轉(zhuǎn)化成值嗜逻。
var aaa={id:123,name:"dgl"};
JSON.stringify(aaa); // "abc"
JSON.stringify("abc"); // {"id":123,"name":"dgl"}
JSON.parse('"abc"'); // abc
JSON.parse('{"id":123,"name":"dgl"}'); //對象{id: 123, name: "dgl"}
3.8 ArrayBuffer:類型化數(shù)組
略。