參考: ECMAScript5.1及其新增API簡介
ECMAScript 5.1就是我們常說的es5。它在2012年就已經被公開。時至今日,除了一些較低版本的瀏覽器,各大主流瀏覽器都已經實現支持了es5的絕大部分特性。
關于對象實例的屬性,每一個實例都有兩種屬性,
function Person(name){
this.name = name
}
var p1 = new Person("ss")
p1.age = 18;
一種是實例屬性(age 和 name其實是一樣的,只是不同時間綁定的。都是直接綁定到這個對象上的,而不需要是去找它的原型proto),一種是原型屬性(即它的構造函數的prototype上的屬性)
obj.hasOwnProperty(prop)(老版本):方法用來判斷某個對象是否含有指定的自身(實例)屬性。
in 判斷對象是否有這個屬性,無論是在實例還是原型中(for in 一樣)。判斷某對象是否有某個原型屬性:
function hasPrototypeProperty(o, name){
return !o.hasOwnProperty(name) && (name in o)
}
console.log(hasPrototypeProperty(p1, "sayName"))
(ES5中又提供了兩個方法,Object.keys:返回可枚舉(能通過for in 返回)實例屬性數組,還有Object.getOwnPropertyNames 返回一個數組,包括對象所有自有(實例)屬性名稱集合(包括不可枚舉的屬性))
test:
function Person(){
this.age = 18;
}
Person.prototype.name="s";
var p1 = new Person();
for(var i in p1){
console.log(i)//age,name
}
console.log(p1.hasOwnProperty("age"));//實例屬性
console.log(p1);//打印{age: 18, __proto__:{name:"s"}}
console.log(p1.name);//可以打印值
console.log(Object.keys(p1));//只有age(實例),可枚舉的(是否可枚舉是可以設置的)
console.log(Object.getOwnPropertyNames(p1))//只有age(實例),包括不可枚舉的
新增Object接口
- 對象 構造器 說明
- Object getPrototypeOf 返回對象的原型
- Object getOwnPropertyDescriptor 返回對象自有屬性的屬性描述符
- Object getOwnPropertyNames 返回一個數組,包括對象所有自有屬性名稱集合(包括不可枚舉的屬性)
- Object create 創建一個擁有置頂原型和若干個指定屬性的對象
- Object defineProperty 給對象定義一個新屬性,或者修改已有的屬性,并返回
- Object defineProperties 在一個對象上添加或修改一個或者多個自有屬性,并返回該對象
- Object seal 鎖定對象。阻止修改現有屬性的特性,并阻止添加新屬性。但是可以修改已有屬性的值。
- Object freeze 凍結對象,阻止對對象的一切操作。凍結對象將永遠不可變。
- Object preventExtensions 讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性。
- Object isSealed 判斷對象是否被鎖定
- Object isFrozen 判斷對象是否被凍結
- Object isExtensible 判斷對象是否可以被擴展
- Object keys 返回一個由給定對象的所有可枚舉自身屬性的屬性名組成的數組
這里不打算對每個新增接口作詳細描述,不過比較常用的有如下幾個,
- Object.create
Object.create = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
- Object.defineProperties
- Object.keys
新增Array接口
- 對象 構造器 說明
- Array.prototype indexOf 返回根據給定元素找到的第一個索引值,否則返回-1
- Array.prototype lastIndexOf 方法返回指定元素在數組中的最后一個的索引,如果不存在則返回 -1
- Array.prototype every 測試數組的所有元素是否都通過了指定函數的測試-檢測數組中的所有元素是否都大于 10,返回true or false
- Array.prototype some 測試數組中的某些元素是否通過了指定函數的測試-檢測在數組中是否有元素大于 10,返回true or false
- Array.prototype forEach 讓數組的每一項都執行一次給定的函數-循環-返回 undefined(forEach無法使用break,continue跳出循環,使用return時,效果和在for循環中使用continue一致)
$.each(demoArr|demoObj, function(e, ele))
使用return或者return true
為跳過一次循環,繼續執行后面的循環
使用return false
為終止循環的執行,但是并不終止函數執行
無法使用break與continue來跳過循環
- Array.prototype map 返回一個由原數組中的每個元素調用一個指定方法后的返回值組成的新數組-求數組中每個元素的平方根
- Array.prototype filter 利用所有通過指定函數測試的元素創建一個新的數組,并返回-創建了一個新數組,該數組的元素由原數組中值大于 10 的元素組成。
- Array.prototype reduce 接收一個函數作為累加器,數組中的每個值(從左到右)開始縮減,最終為一個值
- Array.prototype reduceRight 接受一個函數作為累加器,讓每個值(從右到左,亦即從尾到頭)縮減為一個值
新增的數組接口中,基本都是比較有用的接口。需要注意的一點是,有的數組方法是不返回新數組的,有的接口是返回一個新數組,就是說使用這些新接口時,需要注意一下方法的返回值。
另外Array還有一個新增的接口,Array.isArray。顯然此新增接口并不是實例方案,而是類似“靜態方法”一樣的存在。其作用很簡單,就是判斷某一對象是否為數組。
新增Function接口
Function.prototype.bind
bind()方法會創建一個新函數,稱為綁定函數.當調用這個綁定函數時,綁定函數會以創建它時傳入 bind()方法的第一個參數作為 this,傳入 bind() 方法的第二個以及以后的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數。
Strict Mode
**Strict Mode **, 即所謂的嚴格模式。嚴格模式的意義是為了提供一種更佳良好錯誤檢查機制,讓你規避掉一些語言本身的bad point。
比如在嚴格模式下,我們不可以使用一個未經聲明的變量。
JSON對象
ES5提供一個內置的(全局)JSON對象,可用來序列化( JSON.stringfy )和反序列化( parse )對象為JSON格式。
用法及第二個參數的用法:
var test = {
"name": "gejiawen",
"age": 22
};
console.log(JSON.strinfy(test)); // '{"name": "gejiawen", "age": 22}'
console.log(JSON.parse('{"name": "larry"}')); // Object {name: "larry"}
JSON.parse('{"name": "gejiawen", "age": 22, "lucky": "13"}', function(key, value) {
return typeof value === 'string' ? parseInt(value) : value;
});
var o = {
name: 'gejiawen',
age: 22,
lucky: '13'
};
var ret = JSON.stringify(o, function(key, value) {
return typeof value === 'string' ? undefined : value;
}, 4);
console.log(ret);