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 ...
随机推荐
- NHibernate输出SQL语句
用了NHierbate之后,很少需要写原生的SQL语句,由于总是看不到SQL语句,所以有时候对SQL调优非常不利.因此产生了让NHibernate输出它所生成的SQL语句的想法,以便于后续调优. 一. ...
- SOS 调试扩展 (SOS.dll) 《第五篇》
一.SOS扩展命令 SOS包含几十个命令,要熟练使用SOS,首先要了解SOS有哪些命令.下面给出SOS命令列表. 命令 描述 BPMD [<module name> <method ...
- HTML中解决双击会选中文本的问题
HTML中解决双击会选中文本的问题 <div unselectable="on" style="-moz-user-select:none;" onsel ...
- LiveView 0.8 RC1 could boot evidence files acquired from Win10 64bit
The latest Windows 10 will be more and more popular in the very near future. Now let's take a look i ...
- 基于s5pv210嵌入式系统busybox文件系统移植
基于s5pv210嵌入式系统busybox文件系统移植 1.下载源码 busybox.net/downloads下载最新版的busybox源码,最新源码为1.21.1 2.解压源码文件 tar xvf ...
- 在Eclipse中查看JDK类库的源代码
http://blog.csdn.net/a81895898/article/details/8486802 在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> ...
- RECT 数据结构
数据结构RECT定义了一个矩形的左上角和右下角的坐标 ? 1 2 3 4 5 6 7 8 typedef struct _RECT{ LONG left; LONG t ...
- VMware vSphere Client的简单使用教程
1.首先登陆进去ESXI管理 实验VMware VS6.0版本 2新建虚拟机 确认信息 点击完成 2.开启虚拟机 右键打开控制台 加载光驱 选择虚拟机 Ctrl+Alt+delete重启 安装 来 ...
- 线程池(C#)
转自:http://blog.sina.com.cn/s/blog_494305f30100ryw7.html 在这里你可以学到Microsoft研究CLR实现线程池的原理机制,从而更灵活的处理CLR ...
- 利用脚本设置本机IP地址
各位同学,在日常工作中.常出现需要指定IP的地址的清况.为了解决这一个问题,我特意为自己编写了一段脚本.方便设定自己笔记本的IP地址.供大家参考. 其中包括无线wifi和有线网络设定两个IP的操作. ...