ECMAScript5
淘宝整理的es5-safe
/********* It provides the following methods: Function.prototype.bind
Object.keys
Array.isArray
Array.prototype.forEach
Array.prototype.map
Array.prototype.filter
Array.prototype.every
Array.prototype.some
Array.prototype.reduce
Array.prototype.reduceRight
Array.prototype.indexOf
Array.prototype.lastIndexOf
String.prototype.trim
Date.now **********/ (function() { // es5-safe
// ----------------
// Provides compatibility shims so that legacy JavaScript engines behave as
// closely as possible to ES5.
//
// Thanks to:
// - http://es5.github.com/
// - http://kangax.github.com/es5-compat-table/
// - https://github.com/kriskowal/es5-shim
// - http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/
// - https://gist.github.com/1120592
// - https://code.google.com/p/v8/ var OP = Object.prototype;
var AP = Array.prototype;
var FP = Function.prototype;
var SP = String.prototype;
var hasOwnProperty = OP.hasOwnProperty;
var slice = AP.slice; /*---------------------------------------*
* Function
*---------------------------------------*/ // ES-5 15.3.4.5
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
FP.bind || (FP.bind = function(that) {
var target = this; // If IsCallable(func) is false, throw a TypeError exception.
if (typeof target !== 'function') {
throw new TypeError('Bind must be called on a function');
} var boundArgs = slice.call(arguments, 1); function bound() {
// Called as a constructor.
if (this instanceof bound) {
var self = createObject(target.prototype);
var result = target.apply(
self,
boundArgs.concat(slice.call(arguments))
);
return Object(result) === result ? result : self;
}
// Called as a function.
else {
return target.apply(
that,
boundArgs.concat(slice.call(arguments))
);
}
} // NOTICE: The function.length is not writable.
//bound.length = Math.max(target.length - boundArgs.length, 0); return bound;
}); // Helpers
function createObject(proto) {
var o; if (Object.create) {
o = Object.create(proto);
}
else {
/** @constructor */
function F() {
} F.prototype = proto;
o = new F();
} return o;
} /*---------------------------------------*
* Object
*---------------------------------------*/
// http://ejohn.org/blog/ecmascript-5-objects-and-properties/ // ES5 15.2.3.14
// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
// https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute
// http://msdn.microsoft.com/en-us/library/adebfyya(v=vs.94).aspx
Object.keys || (Object.keys = (function() {
var hasDontEnumBug = !{toString: ''}.propertyIsEnumerable('toString');
var DontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
var DontEnumsLength = DontEnums.length; return function(o) {
if (o !== Object(o)) {
throw new TypeError(o + ' is not an object');
} var result = []; for (var name in o) {
if (hasOwnProperty.call(o, name)) {
result.push(name);
}
} if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i])) {
result.push(DontEnums[i]);
}
}
} return result;
}; })()); /*---------------------------------------*
* Array
*---------------------------------------*/
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array
// https://github.com/kangax/fabric.js/blob/gh-pages/src/util/lang_array.js // ES5 15.4.3.2
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
Array.isArray || (Array.isArray = function(obj) {
return OP.toString.call(obj) === '[object Array]';
}); // ES5 15.4.4.18
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/foreach
AP.forEach || (AP.forEach = function(fn, context) {
for (var i = 0, len = this.length >>> 0; i < len; i++) {
if (i in this) {
fn.call(context, this[i], i, this);
}
}
}); // ES5 15.4.4.19
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
AP.map || (AP.map = function(fn, context) {
var len = this.length >>> 0;
var result = new Array(len); for (var i = 0; i < len; i++) {
if (i in this) {
result[i] = fn.call(context, this[i], i, this);
}
} return result;
}); // ES5 15.4.4.20
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
AP.filter || (AP.filter = function(fn, context) {
var result = [], val; for (var i = 0, len = this.length >>> 0; i < len; i++) {
if (i in this) {
val = this[i]; // in case fn mutates this
if (fn.call(context, val, i, this)) {
result.push(val);
}
}
} return result;
}); // ES5 15.4.4.16
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
AP.every || (AP.every = function(fn, context) {
for (var i = 0, len = this.length >>> 0; i < len; i++) {
if (i in this && !fn.call(context, this[i], i, this)) {
return false;
}
}
return true;
}); // ES5 15.4.4.17
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
AP.some || (AP.some = function(fn, context) {
for (var i = 0, len = this.length >>> 0; i < len; i++) {
if (i in this && fn.call(context, this[i], i, this)) {
return true;
}
}
return false;
}); // ES5 15.4.4.21
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
AP.reduce || (AP.reduce = function(fn /*, initial*/) {
if (typeof fn !== 'function') {
throw new TypeError(fn + ' is not an function');
} var len = this.length >>> 0, i = 0, result; if (arguments.length > 1) {
result = arguments[1];
}
else {
do {
if (i in this) {
result = this[i++];
break;
}
// if array contains no values, no initial value to return
if (++i >= len) {
throw new TypeError('reduce of empty array with on initial value');
}
}
while (true);
} for (; i < len; i++) {
if (i in this) {
result = fn.call(null, result, this[i], i, this);
}
} return result;
}); // ES5 15.4.4.22
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
AP.reduceRight || (AP.reduceRight = function(fn /*, initial*/) {
if (typeof fn !== 'function') {
throw new TypeError(fn + ' is not an function');
} var len = this.length >>> 0, i = len - 1, result; if (arguments.length > 1) {
result = arguments[1];
}
else {
do {
if (i in this) {
result = this[i--];
break;
}
// if array contains no values, no initial value to return
if (--i < 0)
throw new TypeError('reduce of empty array with on initial value');
}
while (true);
} for (; i >= 0; i--) {
if (i in this) {
result = fn.call(null, result, this[i], i, this);
}
} return result;
}); // ES5 15.4.4.14
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
AP.indexOf || (AP.indexOf = function(value, from) {
var len = this.length >>> 0; from = Number(from) || 0;
from = Math[from < 0 ? 'ceil' : 'floor'](from);
if (from < 0) {
from = Math.max(from + len, 0);
} for (; from < len; from++) {
if (from in this && this[from] === value) {
return from;
}
} return -1;
}); // ES5 15.4.4.15
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
AP.lastIndexOf || (AP.lastIndexOf = function(value, from) {
var len = this.length >>> 0; from = Number(from) || len - 1;
from = Math[from < 0 ? 'ceil' : 'floor'](from);
if (from < 0) {
from += len;
}
from = Math.min(from, len - 1); for (; from >= 0; from--) {
if (from in this && this[from] === value) {
return from;
}
} return -1;
}); /*---------------------------------------*
* String
*---------------------------------------*/ // ES5 15.5.4.20
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/trim
// http://blog.stevenlevithan.com/archives/faster-trim-javascript
// http://jsperf.com/mega-trim-test
SP.trim || (SP.trim = (function() { // http://perfectionkills.com/whitespace-deviations/
var whiteSpaces = [ '\\s',
//'0009', // 'HORIZONTAL TAB'
//'000A', // 'LINE FEED OR NEW LINE'
//'000B', // 'VERTICAL TAB'
//'000C', // 'FORM FEED'
//'000D', // 'CARRIAGE RETURN'
//'0020', // 'SPACE' '00A0', // 'NO-BREAK SPACE'
'1680', // 'OGHAM SPACE MARK'
'180E', // 'MONGOLIAN VOWEL SEPARATOR' '2000-\\u200A',
//'2000', // 'EN QUAD'
//'2001', // 'EM QUAD'
//'2002', // 'EN SPACE'
//'2003', // 'EM SPACE'
//'2004', // 'THREE-PER-EM SPACE'
//'2005', // 'FOUR-PER-EM SPACE'
//'2006', // 'SIX-PER-EM SPACE'
//'2007', // 'FIGURE SPACE'
//'2008', // 'PUNCTUATION SPACE'
//'2009', // 'THIN SPACE'
//'200A', // 'HAIR SPACE' '200B', // 'ZERO WIDTH SPACE (category Cf)
'2028', // 'LINE SEPARATOR'
'2029', // 'PARAGRAPH SEPARATOR'
'202F', // 'NARROW NO-BREAK SPACE'
'205F', // 'MEDIUM MATHEMATICAL SPACE'
'3000' // 'IDEOGRAPHIC SPACE' ].join('\\u'); var trimLeftReg = new RegExp('^[' + whiteSpaces + ']+');
var trimRightReg = new RegExp('[' + whiteSpaces + ']+$'); return function() {
return String(this).replace(trimLeftReg, '').replace(trimRightReg, '');
} })()); /*---------------------------------------*
* Date
*---------------------------------------*/ // ES5 15.9.4.4
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/now
Date.now || (Date.now = function() {
return +new Date;
}); })();
ECMAScript5的更多相关文章
- ECMAScript5之Object
在ECMAScript5中对Object新增的些方法,以前没注意的同志们,嘻嘻,下面我们再一起来边看边学. 1.Object之create Create单词意为创造嘛,作为Object的静态方法,不言 ...
- ECMAScript5之Array
在ECMAScript5中对Array新增的些方法,以前没注意的同志们,嘻嘻,下面我们一起来边看边学. 1.Array之isArray(element) 看到isArray,不言而喻,就是判断一个对象 ...
- ECMAScript5之StrictMode
ECMAScript5引入一个严格模式的概念(Strict Mode). 它的作用就是不让Javascript的容错那么高,让我们对编写代码的规范要求高一点. 比如,当我们使用严格模式编写JavaSc ...
- 了解一下JavaScript的未来——ECMAScript5
神马是EcmaScript5 首先得先搞清楚ECMAScript是神马,我们知道JavaScript或者说LiveScript最开始是Netscape搞出来的,后来微软也跟进搞出了Jscript,Sc ...
- ECMAScript5的其它新特性
之前两篇博客 ECMAScript5 Object的新属性方法,ECMAScript5 Array新增方法,分别介绍了ECMAScript5对Object和Array的拓展,这两个对象最常用,而且改动 ...
- ECMAScript5 Array新增方法
数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Arr ...
- ECMAScript5 Object的新属性方法
虽然说现在并不是所有的浏览器都已经支持ECMAScript5的新特性,但相比于ECMAScript4而言ECMAScript5被广大浏览器厂商广泛接受,目前主流的浏览器中只有低版本的IE不支持,其它都 ...
- JS性能方面--内存管理及ECMAScript5 Object的新属性方法
Delete一个Object的属性会让此对象变慢(多耗费15倍的内存) var o = { x: 'y' }; delete o.x; //此时o会成一个慢对象 o.x; // var o = { x ...
- ECMAScript5新增对象语法糖getter和setter
在新的ECMAScript5中新添加了两个语法糖,这两个语法糖是这样的. var obj = (function(){ var num = 10; return { get n(){ return n ...
随机推荐
- oracle 删除表、表空间、用户时,如何释放磁盘空间
truncate table tablename DROP STORAGE; drop 执行drop table xx 语句drop后的表被放在回收站(user_recyclebin)里,而不是直接删 ...
- Eclipse中Jsp页面警告的解决方法小结
恩,只要是开发人员,这样的小事情总会遇到的,对于这其中的某些警告性的错误是不影响代码的运行的,对应的功能也是能实现的,不过总给人一种不太好看的感觉!如果代码写的比较符合规范,这些问题也就自然而然的消失 ...
- org.springframework.core.NestedIOException
今天遇到的一个小异常,报错信息如下: 2013-11-13 10:00:32 org.apache.catalina.core.StandardContext listenerStart严重: Exc ...
- python中operator.itemgetter
直接上例子: rs= [... {... "datetime": "Mon, 31 Aug 2015 23:00:00 GMT",... ...
- awk中怎么比较字符串??
awk -vOFS="_" '{print $1,$2,$3} http://bbs.chinaunix.net/thread-1099655-1-1.html
- 【HTML/XML 11】XML和HTML的混合使用
导读:在前面介绍了很多关于XML和HTML的东西,他们其实各有各的好处,在很多时候都需要结合起来使用.现在已经有XML和HTML结合的产物:XHTML(可扩展超文本标记语言).在本篇博客中,则主要介绍 ...
- 微信JS-SDK]微信公众号JS开发之卡券领取功能详解
js sdk: http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.952-.E6 ...
- Git 从服务器取得最新代码覆盖本地
第一种方法 git fetch --all git reset --hard origin/master git fetch下载远程最新的, 然后,git reset master分支重置 第二种方法 ...
- javascript之值传递与引用传递
在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strat ...
- Android IOS WebRTC 音视频开发总结(二七)-- whatsapp之转发优先
最近看了一篇老外在webrtcHacks上写的文章,主要介绍webrtc和whatsapp的传输机制,蛮好的,加上自己的理解进行总结, 希望对大伙有所帮助,转载请说明出处,原文来自博客园RTC.Bla ...