strict模式目前無人實現,但是按標准的說法strict模式是非strict的完全子集
strict模式究竟是什么意思?很多同學認為使用strict模式是強迫使用良好的代碼風格,我的意見是strict不是良好風格的代碼而是高效的代碼。通過使用strict模式,編譯器有了把變量優化成內存地址的能力。
具體限制為
eval中不再能聲明變量,聲明的函數將會變成全局的
var定義只能在函數級,if、for、while、switch等不能有var定義
不能使用with語句
不能使用arguments.callee
普通的函數調用中this是null
試圖改變只讀屬性將會拋出異常
delete失敗會拋出異常
arguments不再和形參綁定
函數不能有同名參數
使用的方法是用一個strict聲明,這個聲明是一個字符串表達式(為了兼容非strict模式),例如
strict聲明只能是'use strict'和"use strict",包括轉義、字符串斷行在內的任何改動都不會被認為是strict聲明
'use strict';
eval("var a=1;")
alert(a);
eval("var a=1;")
alert(a);
strict也可以作用於函數級別, John Resig的建議很不錯
//
非strict代碼...
( function(){
"use strict";
// 用strict模式編寫我們的庫
})();
// 用戶仍然可以自由使用非strict代碼...
( function(){
"use strict";
// 用strict模式編寫我們的庫
})();
// 用戶仍然可以自由使用非strict代碼...
2. 數組
數組變化不小,有一些用起來蠻順手的擴展:
Array.prototype.indexOf, Array.prototype.lastIndexOf 正向查找和逆向查找,這個沒什么好說的,看名字都知道是干什么的
Array的集合操作一直深得月同學喜愛,這下終於成了標准
Array.prototype.every:檢查一個數組里所有元素都符合某個條件 數理邏輯中的任意符號 ∀(符號看不到的換宋體)
Array.prototype.some : 檢查一個數組里是否存在元素符合某個條件 數理邏輯中的存在符號 ∃
Array.prototype.forEach : 這個就是普通的遍歷了
Array.prototype.map : 對一個數組每一個元素執行函數,把所有返回值做為一個數組返回
Array.prototype.filter : filter從一個數組中選出符合條件的元素,不過並不改變原來的數組
迭代操作
Array.prototype.reduce 和Array.prototype.reduceRight 提供了迭代操作
想想吧,用Array.prototype.forEach怎么求一個數組的所有元素的和?無論如何,你都需要用到一個外部變量。而Array.prototype.reduce更適合一些
3.Function.prototype.bind
對大多數JSer來說,Function.prototype.bind並不陌生了,這個prototype.js中的著名函數終於成為標准的一部分,並且有了更佳的內部實現方式。用法還是老樣子4.String.prototype.trim
這個就是方便了,去掉字符串兩端空格
alert(" 啦啦 ".trim());
5. Date.now()是一個新的函數,得到當前的time stamp
這個是一個非常小的變動 實際相當於new Date().getTime()6.原型式編程
Object.getPrototypeOf 可以獲取一個對象的原型(注意,一個"對象"的原型,不是函數的prototype屬性,即標准中所說的[[prototype]]) 這個函數的作用大致相當於SpiderMonkey的 __proto__屬性,區別在於這個函數是低命名污染的,而且無法set
Object.create 可以以指定原型創建對象,效果大約等同於
function create(proto)
{
var klass = function(){} ;
klass.prototype = proto;
return new klass;
}
Object.create的第二個參數是附加在新對象上的屬性,可參考第三條
有意思的是,我們終於可以創建一個原型鏈“干凈”的對象了,不需要每個對象都繼承Object.prototype
代碼
7.屬性操作
Object.getOwnPropertyNames可以獲取一個對象所有屬性名組成的數組,包括那些不可枚舉的屬性,這是以前for in的替代品
Object.defineProperty是新的定義屬性的方式,比起之前直接賦值,我們可以更好地控制屬性的可訪問性、可枚舉性,大家一直期待的getter和setter也在此實現,正式成為標准:
一個只讀屬性的例子:
一個getter和setter的例子
不能枚舉的屬性(以后擴展Array就不用心驚膽顫啦):
也可以用Object.getOwnPropertyDescriptor獲取一個對象的屬性的"屬性"
還支持一次定義好多屬性Object.defineProperties 不過用處不大
8. JSON支持
JSON對象類似Math,其實就是命名空間的作用,實際只有2個函數JSON.stringify和JSON.parse
Date對象也添加了一個相關方法toJSON,像Date.now()一樣,它也只是個快捷的東西