张鑫旭: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的更多相关文章

  1. ECMAScript5之Object

    在ECMAScript5中对Object新增的些方法,以前没注意的同志们,嘻嘻,下面我们再一起来边看边学. 1.Object之create Create单词意为创造嘛,作为Object的静态方法,不言 ...

  2. ECMAScript5之Array

    在ECMAScript5中对Array新增的些方法,以前没注意的同志们,嘻嘻,下面我们一起来边看边学. 1.Array之isArray(element) 看到isArray,不言而喻,就是判断一个对象 ...

  3. ECMAScript5之StrictMode

    ECMAScript5引入一个严格模式的概念(Strict Mode). 它的作用就是不让Javascript的容错那么高,让我们对编写代码的规范要求高一点. 比如,当我们使用严格模式编写JavaSc ...

  4. 了解一下JavaScript的未来——ECMAScript5

    神马是EcmaScript5 首先得先搞清楚ECMAScript是神马,我们知道JavaScript或者说LiveScript最开始是Netscape搞出来的,后来微软也跟进搞出了Jscript,Sc ...

  5. ECMAScript5的其它新特性

    之前两篇博客 ECMAScript5 Object的新属性方法,ECMAScript5 Array新增方法,分别介绍了ECMAScript5对Object和Array的拓展,这两个对象最常用,而且改动 ...

  6. ECMAScript5 Array新增方法

    数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Arr ...

  7. ECMAScript5 Object的新属性方法

    虽然说现在并不是所有的浏览器都已经支持ECMAScript5的新特性,但相比于ECMAScript4而言ECMAScript5被广大浏览器厂商广泛接受,目前主流的浏览器中只有低版本的IE不支持,其它都 ...

  8. JS性能方面--内存管理及ECMAScript5 Object的新属性方法

    Delete一个Object的属性会让此对象变慢(多耗费15倍的内存) var o = { x: 'y' }; delete o.x; //此时o会成一个慢对象 o.x; // var o = { x ...

  9. ECMAScript5新增对象语法糖getter和setter

    在新的ECMAScript5中新添加了两个语法糖,这两个语法糖是这样的. var obj = (function(){ var num = 10; return { get n(){ return n ...

随机推荐

  1. NHibernate输出SQL语句

    用了NHierbate之后,很少需要写原生的SQL语句,由于总是看不到SQL语句,所以有时候对SQL调优非常不利.因此产生了让NHibernate输出它所生成的SQL语句的想法,以便于后续调优. 一. ...

  2. SOS 调试扩展 (SOS.dll) 《第五篇》

    一.SOS扩展命令 SOS包含几十个命令,要熟练使用SOS,首先要了解SOS有哪些命令.下面给出SOS命令列表. 命令 描述 BPMD [<module name> <method ...

  3. HTML中解决双击会选中文本的问题

    HTML中解决双击会选中文本的问题 <div unselectable="on" style="-moz-user-select:none;" onsel ...

  4. 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 ...

  5. 基于s5pv210嵌入式系统busybox文件系统移植

    基于s5pv210嵌入式系统busybox文件系统移植 1.下载源码 busybox.net/downloads下载最新版的busybox源码,最新源码为1.21.1 2.解压源码文件 tar xvf ...

  6. 在Eclipse中查看JDK类库的源代码

    http://blog.csdn.net/a81895898/article/details/8486802 在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> ...

  7. RECT 数据结构

    数据结构RECT定义了一个矩形的左上角和右下角的坐标 ? 1 2 3 4 5 6 7 8 typedef struct _RECT{         LONG left;         LONG t ...

  8. VMware vSphere Client的简单使用教程

    1.首先登陆进去ESXI管理   实验VMware VS6.0版本 2新建虚拟机 确认信息 点击完成 2.开启虚拟机 右键打开控制台 加载光驱 选择虚拟机 Ctrl+Alt+delete重启 安装 来 ...

  9. 线程池(C#)

    转自:http://blog.sina.com.cn/s/blog_494305f30100ryw7.html 在这里你可以学到Microsoft研究CLR实现线程池的原理机制,从而更灵活的处理CLR ...

  10. 利用脚本设置本机IP地址

    各位同学,在日常工作中.常出现需要指定IP的地址的清况.为了解决这一个问题,我特意为自己编写了一段脚本.方便设定自己笔记本的IP地址.供大家参考. 其中包括无线wifi和有线网络设定两个IP的操作. ...