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 ...
随机推荐
- nginx 配置高并发
一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...
- VS2013 当前不会命中断点还未为文档加载任何符号
情况:在别人那边的项目可以调试,在我这边不行.看来是电脑环境问题了 自己试过 VS2013修复下(用了1个半小时),点评:无效 网上 五花八门的都不适合 1.设置与当前版本不一致取消打勾. 点评 ...
- Java创建WebService服务及客户端实现
简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto. ...
- 学习练习 java面向对象封装汽车
package com.hanqi; //汽车 public class Car { // 车牌 private String CheP; // 油箱容量 private double YouXRL ...
- JavaCC首页、文档和下载 - 语法分析生成器 - 开源中国社区
JavaCC首页.文档和下载 - 语法分析生成器 - 开源中国社区
- jquery ajax 保存讲解
jquery ajax 参数传递与数据保存实例是一款适合于初学者用的,首先我们是讲一下关于如何利用ajax +php进行数据操作,然后再详细的介绍关于jquery ajax的帮助说明. jquery ...
- 【MVC】ASP.NET MVC 请求生命周期
当一个asp.net mvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在asp.net mvc应用程序Http request和Http response 过程中,主要包含8个步骤: ...
- systemctl
旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig - ...
- select 语句占位符
对于已预备的语句,可以使用位置保持符.以下语句将从tb1表中返回一行: mysql> SET @a=1; mysql> PREPARE STMT FROM "SELECT * F ...
- s3c6410_MMU地址映射过程详述
参考: 1)<ARM1176 JZF-S Technical Reference Manual>: Chapter 3 System Control Coprocessor Chapter ...