typeof
ECMAScript有5種基本類型數(shù)據(jù):
- undefined
- null
- boolean
- number
- string
另外還有一種復(fù)雜的數(shù)據(jù)類型
- object
typeof就是用來檢測變量的數(shù)據(jù)類型的,typeof可能會返回以下值:
- undefined
- boolean
- string
- number
- object
- function
instanceof
typeof操作符在檢測引用類型的值時,總是會返回object,所以用處不大。
instanceof用來檢測對象類型的,返回值是 true | false。
例如:
person instanceof Object
colors instanceof Array
函數(shù)
即使定義的時候只接收兩個參數(shù),但是調(diào)用時未必一定要傳兩個參數(shù)
原因: 參數(shù)的內(nèi)部是用一個數(shù)組(arguments)來表示的。
沒有重載:因為沒有函數(shù)簽名
數(shù)組方法
- isArray()
- toString() valueof() join()
- push() pop()
- shift() unshift()
- sort() reverse()
- 操作方法: slice() splice()
- indexOf()
- 迭代方法:every() filter() forEach() map() some()
比較常用的幾個方法:
join()
push()
slice():基于當(dāng)前數(shù)組中的一個或多個創(chuàng)建一個新數(shù)組
indexOf()
filter(function(){})
forEach(function(){})
map(function(){... return ...;} :返回一個新數(shù)組
面向?qū)ο?/h2>
數(shù)據(jù)屬性
[[configurable]] : 能否通過刪除屬性從而重新定義屬性。默認(rèn)為true
[[enumerable]] : 能否通過for-in循環(huán)返回屬性。默認(rèn)為true
[[writable]] :能否修改屬性值。默認(rèn)為true
[[value]] : 這個屬性的值。默認(rèn)為undefined
舉例:
var person={
name:"Tangwenxing"
}
上面person對象的name屬性值被設(shè)置為Tangwenxing,也就是說它的[[value]]值被設(shè)置位Tangwenxing.
Object.defineProperty()用來修改屬性的默認(rèn)特性(configurable,enumerable,writable,value),它有三個參數(shù):
- 屬性所在的對象
- 屬性的名字
- 一個描述符對象
使用方法參見如下代碼:
var person={};
Object.defineProperty(person,"name",{
writable:false,
value:"Tangwenxing",
configurable:false
})
現(xiàn)在的name屬性不可以被刪除也不可以重新賦值了。
訪問屬性
主要是設(shè)置getter setter方法,因為不太重要,所以不提了。
Object.defineProperties用法
var person={}
Object.defineProperties(person,{
name:{
value:"Tangwenxing",
writable:false
},
age:{
value:25,
writable:true
}
})
Object.getOwnPropertyDescriptor用法
var descriptor = Object.getOwnPropertyDescriptor(person,"name");
alert(descriptor.writable);
原型模式
每個函數(shù)都有一個prototype屬性,這個屬性是一個指針,指向一個對象。(這句話很重要,關(guān)鍵詞是:函數(shù),prototype是一個指針)
prototype指向原型對象。
所有原型對象都會自動獲得一個construnctor屬性(這句話也很重要)
function Person(){}
Person.prototype.name="twx";
Person.prototype.age=29;
Person.prototype.sayName=function(){
alert(this.name);
};
var person1=new Person();
var person2=new Person();
Person函數(shù)有一個prototype屬性,prototype指向一個(匿名)原型對象。
實例person1、person2指向Person.prototype.
在實例中創(chuàng)建原型中的同名屬性,會覆蓋原型中的那個屬性。
接上面的程序
...
...
alert(person1.name); //twx
person1.name = "fgh";
alert(person1.name); //fgh ——-來自實例
delete person1.name;
alert(person1.name); //twx --來自原型
hasOwnProperty()
檢測一個屬性是存在實例中還是原型中
接上面的程序
...
...
person1.hasOwnProperty("name"); //false
person1.name = "fgh";
person1.hasOwnProperty("name"); //true
delete person1.name;
person1.hasOwnProperty("name"); //false
Object.keys()
獲取對象上所有可枚舉的實例屬性
var per1Keys = Object.keys(person1);
alert(per1Keys); //name,age,sayName
更簡單的原型
function Person(){}
Person.prototype = {
name:"twx",
age:25,
job:"IT",
sayName:function(){
alert(this.name);
}
}
前面提到了,原型對象會自動獲取一個constructor屬性。但是在這里,我們完全重寫了原型對象,因此constructor屬性也不在是默認(rèn)的(默認(rèn)指向?qū)ο蟮臉?gòu)造函數(shù))。
因此可以這樣寫:
function Person(){}
Person.prototype = {
constructor:Person, //讓它重新指向構(gòu)造函數(shù)
name:"twx",
age:25,
job:"IT",
sayName:function(){
alert(this.name);
}
}
原生對象(String Array等)的原型
定義新方法:
String.prototype.startsWith=function(text){
return this.indexOf(text) = 0;
}
var message = "Hello World!";
msg.startWith("Hello") //true
組合使用構(gòu)造模式和原生模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ['shely','Bob'];
}
Person.prototype = {
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person1 = new Person("twx",25,"IT");
var person2 = new Person("hyc",27,"SALE");
person1.friends.push("JLK");
alert(person1.friends); //'shely','Bob','JLK'
alert(person2.friends); //'shely','Bob'
alert(person1.sayName === person2.sayName); //true