* 如何創建并使用對象
* 什么是構造器函數
* 內置對象與運用
*****
# 對象
定義對象用`{}`,叫做 **對象文本標識法**
用逗號分隔屬性
鍵值對之間用冒號`:`分隔
屬性名(key)可不加引號`''`,盡量不加引號 ?
對象的屬性為函數,稱做**方法**
> 例外(必須添加引號):
> 屬性名是保留字;
> 屬性名包含空格或特殊字符
> 屬性名以數字開頭
```
var o = {
something: 1,
'yes or no': 'yes',
'!@#$%^': true
}
```
### 哈希表,關聯型數組
哈希表,關聯型數組,通常以字符串為鍵值;
一般性數組,索引型、枚舉型數組,通常以數字為鍵值。
### 訪問對象屬性
* 中括號表示法 `person['name']`,訪問不合法屬性名及動態(不定)屬性名
* 點號表示法 `person.name`,訪問合法屬性名,常用 ?
### 修改屬性與方法
添加、更新:`obj.prop = value;`
刪除:`delete obj.prop`
### this
推薦閱讀《你不知道的JavaScript》(上卷)
this的四種綁定規則
### 構造器函數
使用new操作符調用函數,函數執行特殊操作,創建對象
### 全局對象
瀏覽器 window
### 構造器屬性
創建對象的時候添加的特殊屬性
```
var obj = new Object();
obj.constructor; // Object()
var o = {};
o.constructor; // Object()
```
### 返回對象的函數
### 傳遞對象(的引用)
### 對象比較
傳遞對象,===比較為true
定義兩次,===比較為false
# 內建對象
數據封裝類對象:
* Object
* Array
* Boolean
* Number
* String
工具類對象:
* Math
* Date
* RegExp
錯誤類對象:
*****
## Object
所有對象的父級對象
```
var o = {};
var o = new Object();
```
## Array
```
var a = new Array();
var a = [];
```
數組方法:
* push()
* pop()
* shift()
* unshift()
* sort()
* join()
* slice()
* splice()
```
var a = [1,2,3,4,5];
a.slice(2,4); // [3, 4]
a.splice(1,2,'true','hi',false); // [2, 3]
a; // [1, "true", "hi", false, 4, 5]
```
## Function
? 避免使用,缺點同eval()
### 函數對象方法
* call()
* apply()
讓對象借用其他對象的方法;
將函數的this綁定到首參身上,不傳或傳null則綁定到全局對象;
二者區別在于參數的傳遞方式,apply通過數組傳參;
### arguments
```
function f(){
console.log(typeof arguments);
return arguments;
}
f(12,23,45,67);
// object
// Arguments(4)?[12, 23, 45, 67, callee: ?, Symbol(Symbol.iterator): ?]
```
arguments是對象;
該屬性引用的是 **當前被調用的函數對象**
匿名函數的遞歸調用:
```
(function(count){
if(count < 5){
alert(count);
arguments.callee(++count); // 調用當前匿名函數
}
})(1)
```
## Boolean
```
Boolean('test')
// true
Boolean('')
// false
Boolean({})
// true
var b1 = new Boolean(true); // truthy
b1.valueOf();
// true
var b2 = new Boolean(false); // falsy
b2.valueOf();
// false
Boolean(b1); // 所有布爾對象都等于true
// true
Boolean(b2);
// true
```
## Number
```
Number.MAX_VALUE
// 1.7976931348623157e+308
Number.MIN_VALUE
// 5e-324
Number.POSITIVE_INFINITY
// Infinity
Number.NEGATIVE_INFINITY
// -Infinity
Number.NaN
// NaN
```
Number對象
* toFixed()
* toExponential()
* toString([radix])
## String
```
var primitive = 'Hello';
typeof primitive; // 普通字符串類型
// "string"
var obj = new String('world');
typeof obj; // String對象
// "object"
obj;
// String?{"world"}
obj.valueOf();
// "world"
obj.toString();
// "world"
```
方法:
* toUpperCase()
* toLowerCase()
* charAt()
* indexOf()
* lastIndexOf()
* slice(start, s.length+(end))
* substring(start, (end || 0))
* split()
* concat()
* valueOf()
* search()
* match()
* replace()
## Math
* Math.random()
* Math.round()
* Math.floor()
* Math.ceil()
* Math.PI
* Math.SQRT2
* Math.E
* Math.LN2
* Math.LN10
* Math.min()
* Math.max()
* Math.pow(2,3); // 8
* Math.sqrt(9); // 3
## Date
## RegExp
```
var re = new RegExp("j.*t", 'gmi');
var re = /j.*t/img;
re.global;
```
方法:
test()
是否匹配
exec()
返回數組
### 字符串方法
search() & match()
```
var s = new String('helloJavaScriptWorld');
s.match(/a/);
// ["a", index: 6, input: "helloJavaScriptWorld", groups: undefined]
s.match(/a/g);
// (2)?["a", "a"]
s.match(/j.*a/i)
// ["Java", index: 5, input: "helloJavaScriptWorld", groups: undefined]
s.search(/j.*a/i);
// 5
```
replace()
```
s.replace(/[A-Z]/g, '');
// "helloavacriptorld"
s.replace(/[A-Z]/, '');
// "helloavaScriptWorld"
s.replace(/[A-Z]/, '_$&');
// "hello_JavaScriptWorld"
s.replace(/[A-Z]/g, '_$&');
// "hello_Java_Script_World"
s.replace(/([A-Z])/g, '_$1');
// "hello_Java_Script_World"
```
```
var email = 'gnkevin@126.com';
email.replace(/(.*)@.*/, "$1");
// "gnkevin"
```
split()
```
var csv = 'one, two , three ,four';
csv.split(/\s*,\s*/);
// ["one", "two", "three", "four"]
```
用字符串代替過于簡單的regexp對象
```
"test".replace('t','r'); // "rest"
"test".replace(new RegExp('t'), 'r'); // "rest"
```
## Error
* ReferenceError
* SyntaxError
* TypeError
# 小結
Number()、String()、Boolean()的調用分兩種:
使用new調用——新建對象;
不適用new調用——將任意值轉換為基本數據類型。