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 ...
随机推荐
- 出现win8.1蓝屏重启故障该如何解决?
出现win8.1蓝屏重启故障该如何解决?电脑出现win8.1蓝屏重启故障,系统提示“你的电脑遇到问题,需要重新启动,我们只收集某些错误信息,然后为你重新启动.”怎么解决?本教程为你提供了win8.1蓝 ...
- linux中ll和du的区别
首先,明确一个概念,linux中目录其实也是一个文件,它存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系. 其中inode和数据块block的关系http://c.bianchen ...
- LA3211 飞机调度 Now or later-二分法&TwoSet
https://vjudge.net/problem/UVALive-3211 As you must have experienced, instead of landing immediately ...
- java servlet上传文件并把文件内容显示在网页中
servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- CLRS:sorting in linear time O(n)
//intput array A,output array result. count array count . //all the elements is in te range of 0~k ...
- SQL表自连接用法
一个表与自身进行连接,称为自连接 问题的提出:一个网友提出这样一个SQL题目,说自己想了很久没解决,我一看,这不是很简单吗 可是自己在查询分析器调试了半天原来问题并不是那不简单 有一个学生表,里面 ...
- java 设计模式-代理
代理模式对其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式的思想 ...
- Android WebRTC 音视频开发总结(一)
本系列文章主要总结和分享WebRTC开发过程中的一些经验,转载请说明出处(博客园RTC.Blacker),更多交流与合作请看页面上方的子标题! 一.WebRTC是什么? 可能您还不知道WebRTC是什 ...
- .NET中的计时器控件Timer
本章借介绍一些粗浅的Timer控件使用方法. 介绍Timer控件的常用属性和事件 1. Interval 属性表示 Timer控件的时间间隔. 类型是int默认是毫秒. 2. Enabled 属性 表 ...