[toc]
## 基本類型和引用類型的值
基本類型值指的是簡單的數據段,而引用類型指的是可能有多個值構成的對象。
##### 5個基本類型值:
- [Number](#Number)
- [String](#String)
- [Boolean](#Boolean)
- [Null and Undefined](#null和undefined)
- [全局對象](#全局對象)
---
##### 動態屬性
引用類型的值,我們可以添加、改變和刪除其屬性和方法,如果對象的不不背銷毀或者屬性不被刪除,則這個屬性將一直存在。
```javascript
var a = {name: 'James'}
a.age = 18;
console.log(a.age); //-->18
delete a.age;
console.log(a.age); //-->undefined
```
**無法給直接類型值添加屬性**
```javascript
var a = 'String';
a.age = 18;
console.log(a.age); //-->undefined
```
---
##### 復制變量值
復制基本類型值時,原先的變量改變后不影響復制的值
```javascript
var a = 1,
b = a;
console.log(a, b); //--> 1,1
a = 2;
console.log(a, b); //--> 2,1 b復制a后是完全獨立的
```
復制引用類型值時,復制的是指向引用類型值得**指針**,這個指針**指向存儲在堆中的一個對象**。
```javascript
var a = {},
b = a;
a.name = 'James';
console.log(b.name); //-->James
//改變b,a也會改變
b.name = 'Jack';
console.log(a.name); //-->Jack
```
---
### Number
在javascript中能夠表示的最大整數范圍是 **-2^53 ~ 2^53**
##### javascript 中的算術運算
```javascript
Math.pow(2,53); //--> 2的53次方
Math.round(.6); //--> 1.0 四舍五入,返回的還是浮點型
Math.ceil(.6); //--> 1.0 向上取整
Math.floor(.6); //--> 0.0 向下取整
Math.abs(-1); //--> 1 取絕對值
Math.max(2, 5, 6); //--> 6 取最大值
Math.min(-1, -2, 1);//--> -2 取最小值
Math.random(); //--> 取0-1的隨機數
Math.PI //--> 圓周率π
Math.E //--> e: 自然對數的底數
Math.sqrt(3); //--> 3的平方根
Math.pow(3, 1/3); //--> 3的立方根
Math.sin(0); //--> 三角函數: 還有Math.cos(), Math.atan()等
Math.log(10); //--> 10的自然對數
Math.log(100)/Math.LN10; //-->以10為底100的對數
Math.exp(3); //--> e的三次冪
```
當數字運算返回的結果超過最大整數時,結果是Infinity,負數則是-Infinity;
可以通過isFinite()方法判斷;
NaN也有isNaN()判斷;
##### 浮點運算和四舍五入錯誤
```javascript
var x = .3 - .2,
b = .2 - .1;
x == b; //--> false
```
---
### String
##### \轉義符
```
//常用的轉義符
\n //換行
\t //水平制表
\r //回車
\' //單引號轉義
\" //雙引號轉義
\\ //\轉義
```
##### String方法和屬性
字符串方法:
```javascript
var a = 'String';
a.charAt(0); //-->'S', 第一個字符
a.charAt(a.length-1); //--> 't', 最后一個字符
a.substring(1, 4); //-->'tri'
a.slice(1,4); //-->同上
a.slice(-3); //-->'ing',最后3個字符
a.indexOf('S'); //-->0,S第一次出現的位置
a.lastIndexOf('S'); //-->0, S最后一次出現的位置
a.indexOf('i',3); //-->3, i在位置3及之后首次出現的位置
a.split(', '); //-->['String']
a.split(''); //-->['S', 't', 'r', 'i', 'n', 'g']
a.split(); //-->['String']
a.split(' '); //-->['String']
a.replice('S', 's'); //-->'string' 全文字符替換
a.toUpperCase(); //-->'STRING' 轉換成大寫
a.toLowerCase(); //-->'string' 轉換成小寫
```
---
##### Boolean
幾種會被轉化成false的值:
```javascript
Boolean(0);
Boolean(-0);
Boolean(undefined);
Boolean(null);
Boolean(NaN);
Boolean('');//空字符串, 如果是空格字符換則為true
```
---
##### null和undefined
null是特殊的object對象
```javascript
typeof null; //Object
```
undefined表示變量未定義的值,如果函數沒有返回值,也會返回undefined
```javascript
var a = {},
b;
console.log(a.a); //undefined
console.log(b); //undefined
```
**null == undefined 返回true**
**null === undefined 返回false**
**null和undefined不包含任何值和屬性**
---
##### 全局對象
> 全局對象在javascript中有著很重要的作用:全局對象的屬性是全局定義的符號,javascript程序可以直接使用
- 全局屬性,比如undefined、Infinity和NaN
- 全局函數,比如isNaN()、parseInt()、eval()
- 構造函數,比如Date()、RegExp()、String()、Object()和Array()
- 全局對象,比如Math, JSON
---
##### 不可變的原始值和可變的對象引用
> 對字符串進行操作,返回的是一個新的值,原來的并沒被改變
> 而對對象引用進行操作,例如數組的一些操作,會改變原先的數組
```javascript
var a = {x: 1};
a.y = 2;
a.x = 3;//對象屬性可以改變
```
對象的比較并非是值的比較,具有相同屬性和值的兩個單獨的對象不相同,相同元素的兩個單獨的數組也不相同;
```javascript
var a = {x: 1, y: 1},
b = {x: 1, y: 1},
x = [],
y = [];
a === b; //false
x === y; //false
```
對象通常被稱為**引用類型**,對象的值都是引用。**對象的比較是引用的比較,當兩個對象引用同一個基對象是,才相等。**
```javascript
var a = [],
b = a;
b === a; //true
a[1] = 1; //a改變了,b也會隨著改變
a === b; //true
```
---