I javascript數據類型
一、六種數據類型
五種基本類型(原始類型):
- Number
- String
- Boolean
- Null
- Undefined
一種對象類型
- Object(Function,Array,Date...)
二、隱式轉換
巧用‘+’ 和 ‘-’隱式轉換規則
- 最常用且容易疑惑的是加法運算,除了算數意義,還表示字符串拼接:
var a = 'The answer is ' + 47;//The answer is 47
'37' + 7 = 377
'37' - 7 = 30 //把字符串轉換成數值類型
'=='等于,類型不同時,嘗試類型轉換和比較
- ‘1.23’ == 1.23 //string轉number
- 0 == false// boolean轉number
- null == undefined
- new Object() == new Object()
- [1,2] == [1,2]
- object == number | string //嘗試對象轉為基本類型
- 其他false
'==='全等于
- 類型不同,返回false
- 類型相同
NaN != NaN
new Object == new Object
null === null
undefined ===undefined
三、包裝對象
臨時性的對象,用完即時刪除,設置屬性時訪問不到。
四、類型檢測
常用類型檢測方法:
-
typeof:適用于檢測基本類型
typeof -
instanceof:適用于檢測對象的類型,值得注意到是,不同window或iframe間的對象類型檢測不能用instanceof
instanceof -
Object.prototype.toString:
Object.prototype.toString
類型檢測小結:![]()
II javascript表達式和運算符
1.表達式
表達式是指能計算出值的任何可用程序單元 --Wiki
表達式是一種js短語,可以使js解釋器用來產生一個值。--《Js權威指南》
1.1 原始表達式
- 常量,直接量:3.14,“test”
- 關鍵字:null,this,true
- 變量:i,j,k
1.2 數組,對象的初始化表達式
- [1,2]
new Array(1,2)
- [1,,,4]
[1,undefined,undefined,4] - {x:1,y:2}
var o =new Object();o.x=1;o.y=2;
1.3 函數表達式
- var fe = function(){};
- (function(){console.log("hello world!");})();
- function add(){};
1.4 屬性訪問表達式
- var o = {x:1}
o.x
o['x']
1.5 調用表達式
- funcName()
1.6 對象創建表達式
- new Func(1,2);
- new Object;
2.運算符
2.1 常用運算符
常用運算符
2.2 特殊運算符
特殊運算符
2.3 運算優先級
運算優先級
III javascript語句和嚴格模式
1.語句(statement)
- block,break,continue,empty,if...else,switch,try catch
- var,function,return,do...while,for,for..in,while
- debugger,label,with
2.塊(block)
快語句常用于組合0~多個語句。塊語句用一對{}定義,但是沒有塊級作用域,有函數作用域
有函數作用域
有函數作用域
沒有塊級作用域
沒有塊級作用域
3.嚴格模式(use strict)
嚴格模式是一種特殊的執行模式,它修復了部分語言上的不足,提供更強的錯誤檢查,并增強安全性。
IV javascript對象
1.概述
對象中包含一系列屬性,這些屬性使無序的。每個屬性都有一個字符串key和對應的value:
var obj = {x:1,y:2};
obj.x = 1;
obj.y = 2;
2.對象的結構
2.1 結構圖解:
對象obj是函數foo的一個實例(var obj = new foo()),而函數foo的原型上定義了一個屬性z(foo.prototype.z = 3),對象obj除了自身的x,y屬性外,還繼承了z屬性,那是因為對象obj內部的[[prototype]]屬性(指針)指向函數foo的原型,在查找對象屬性時查找到了z屬性。之外它還擁有[[class]],[[extensible]]等對象標簽和writable,enumerable等屬性標簽。
對象的結構
2.2 對象創建
- 對象字面量
var obj1 = {x:1,y:2}
var obj2 = {
x:1,
y:2,
o:{
z:3,
n:4
}
};
- new Object
new Object
new Object2 -
Object.create
Object.create
2.3 屬性操作
屬性讀寫
屬性讀寫
-
屬性刪除
屬性刪除 - 屬性檢測
屬性檢測
屬性檢測 -
屬性枚舉
屬性枚舉
3.getter setter
3.1 get/set 關鍵字定義方法
3.2 一些復雜的應用,檢測輸入是否合法
3.3 get/set與原型鏈的關系
當嘗試去修改位于原型上的屬性時,如果是一般屬性,則可以在對象內部創建新值以修改。如果要修改的屬性含有get關鍵字,那么就不能修改。要想嘗試去修改的話,可以調用Object的定義屬性方法。
![]()
同樣的,如果嘗試修改原型上的屬性是只讀的(writable=false,默認是false),也不能直接修改。還是要用Object.defineProperty()方法去修改。
![]()
4.屬性標簽
4.1 定義屬性
方法getOwnPropertyDescripor(對象,’屬性名‘)(標簽屬性訪問器)用于獲取屬性的標簽。該方法以鍵值對形式返回一個對象。
方法defineProperty(對象,‘屬性’,{標簽:值})自定義屬性的配置信息。
![]()
方法keys(對象)枚舉對象上的屬性,對于設置了不可枚舉(enumerable:false)的屬性不枚舉出來。
![]()
4.2 定義多個屬性
方法defineProperties(對象,{
屬性1:{value:"",標簽:值},
屬性2:{value:"",標簽:值}
})定義多個屬性。
![]()
結合get/set方法定義屬性
![]()
屬性權限對照表
![]()
5.對象標簽
5.1對象原型標簽指向對應的原型(原型鏈的形成)
5.2 表示對象的類別(屬于哪類引用類型)
5.3 擴展性標簽(對標簽進行修改)
6.序列化和其它對象方法
6.1把對象序列化為JSON數據和解析json數據
值為undefined的屬性序列化時不顯示,值為NaN或Infinity的屬性會轉換成null,new Date()會被轉換為UTC。
![]()
6.2自定義序列化方法toJSON:function(){}
6.3 其它對象方法
V javascript數組(Array)
1 創建數組、數組操作
- js中數組是弱類型的,數組中的每一項可以保存任何類型的數據
var arr = [1,true,null,undefined,{x:1},[1,2.3]];
- js中數組的大小是動態可調整的,可以隨著數據的添加自動增長
var arr = [1,2,3,4,5];
arr[5] = 6; // 增加第5項
arr.length //6 自動增長,也可以動態修改
arr[2]; //3 訪問數組第2項 - 創建數組-使用Array構造函數
var arr = new Array();
var arr = new Array(20); //如果是數值,指定長度;如果是其它類型,則創建包含這個值的只有一項的數組
var arr = new Array(“red”,“blue”,“orange”,“black”); //指定元素
var arr = Array(); //可以省略new關鍵字 - 創建數組-數組字面量表示法(不會調用Array構造函數)
var arr = [1,2,3,4];
var arr = []; //空數組 - 檢測數組
if(Array.isArray( 要檢測的數組 )){//對數組執行操作} - 轉換方法
var arr = ['a','b','c'];
arr.toString(); //拼接成一個以逗號分隔的字符串 a,b,c
arr.valueOf(); //返回原數組
alert(arr); //同toString(),會在后臺調用toString()方法
arr.join(','); //a,b,c
arr.join('|'); //a|b|c
如果數組中的某一項的值是null或undefined,該值在join(),toString(),toLocaleString()和valueOf()方法的返回結果中以空字符串顯示
2 數組方法
![]()
- 棧方法(后進先出-向后推入push(),末尾取出pop())
var arr = new Array();
arr.push('NBA','AT&T'); // 推入2項
arr.pop(); // 取得最后一項 'AT&T'
- 隊列方法(先進先出-向前推入unshift(),前端取出shift())
var arr =new Array(1,2,3);
arr.unshift('num'); //在前端添加一項
arr.shift(); //取得第一項 - 重排序方法(升序排序sort(),反轉排序reverse())
sort() 方法會調用每個數組項的toString()轉型方法,比較的是字符串。所以不是最佳方案
創建比較函數:
function compare1(v1,v2) {
if (v1 < v2) {
return -1;
}else if (v1 > v2) {
return 1;
}else{
return 0;
}
};
//對于數值類型的比較方法
function compare2(v1,v2) {
return v2 - v1;
};
var arr = [0,1,10,5];
arr.sort(compare1);//會得到正確的數值排序0,1,5,10 -
數組迭代
-
二維數組
-
Array.prototype.concat()
-
Array.prototype.slice()
-
Array.prototype.splice()
-
Array.prototype.forEach()
-
Array.prototype.map()
-
Array.prototype.filter()
-
Array.prototype.every&some()
-
Array.prototype.reduce&reduceRight()
-
Array.prototype.indexOf&lastIndexOf()