/* 一、此js主要扩展了String,Number,Array,Object,Guid,json,Date等七种数据类型,还有一些html5的数据类型,但暂未使用,此js需要立即执行的区域比较多。 没有对以下数据类型进行扩展 function Boolean null undefined。 二、此js包含了正则处理 */ Namespace.register("U.MS"); //#region 正则方法区域 U.MS.browser = /(msie|firefox|chrome|ipad|iphone|safari|opera|version|rv).*?([\d.]+)/; //区分浏览器正则 U.MS.browsers = { msie: /msie ([\d.]+)|(trident)\/([\d.]+)/, //ie正则 firefox: /firefox\/([\d.]+)/, //firfox正则 chrome: /chrome\/([\d.]+)/, //chrome正则 opera: /opera.([\d.]+)/, //opera正则 safari: /version\/([\w.]+).*(safari)/ //safari正则 }; U.MS.Event = /\[object (Keyboard|Mouse|Focus|Wheel|Composition|Storage|MS|)Event(Obj|)\]/; //判断是否为event U.MS.Guid = /^[a-fA-F0-9]{8}(-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}$/; //判断是否为Guid U.MS.English = /^[A-Za-z]+$/; //是否为英文 U.MS.RNum = /\d+/g; //数字浮点等 U.MS.Number = /^\d+$/; //整数 U.MS.Num = /^(-?\d+)(\.\d+)?$/; //浮点 U.MS.EN = /^([a-zA-Z0-9_\-]+)$/; //css样式规则 U.MS.Url = /^\w+\:\/\/([\w+]).*/; //是否是有效链接 U.MS.FileName = /^([a-zA-Z0-9\s\._-]+)$/; //文件名判断 U.MS.ZWFileName = /^[0-9a-zA-Z\u4e00-\u9fa5\._-]{1,40}\\*$/; //文件名判断 U.MS.PBrief = /^.{0,100}$/; //判断是否为有效的签名 U.MS.FFZF = /^(\w|-|[\u4E00-\u9FA5])*$/; //中文字符下划线 U.MS.ChineseIdCard = /\d{17}[\d|X]|\d{15}/; //身份证 U.MS.TelephoneNumber = /^1[0-9]{10}$/; //电话号码 U.MS.Email = /^\w+([_+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; //邮箱 U.MS.TrueName = /^[\u4e00-\u9fa5]{1,20}$|^[a-zA-Z]{1,20}$/; //真实姓名 U.MS.UserName = /^\S{1,25}$/; //用户名 U.MS.NickName = /^[0-9a-zA-Z\u4e00-\u9fa5_-]{1,40}\\*$/; //昵称 U.MS.PassWord = /^[^\u4E00-\u9FA5\uF900-\uFA2D]{6,20}$/; //密码 U.MS.Visa = /^[45]\d{15}$/; //银行卡号 U.MS.rgb = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/ //rgb颜色判断 //#endregion //#region 字符串处理 /** * 序列化json为字符串 * * @param {object 、 array} 需要序列化对象 * @returns {string} json为字符串 注释:在写api时需要获取数据库返回值并转化为可识别字符串时经常用到。可精简名字,写成好的api */ U.MS.jsonToStr = function (obj) { var i, _type = false, _str = "", _type = typeof (obj); //获取类型 //开始序列化 if (obj == null) { } else { obj = obj.valueOf(); //获取值 同时类型也为对应 if ("boolean,number".indexOf(_type) > -1) {//bool和number类型转化 _str = obj.toString(); } else if (_type == "string") {//json处理字符串时需要加上 "\""符号 _str = "\"" + obj + "\""; } else if (U.M.GetType(obj) == "array") { //数组处理 _str = "["; for (i = 0; i < obj.length; i++) { _str += U.MS.jsonToStr(obj[i]) + ((i < obj.length - 1) ? "," : "") }; _str += "]"; return _str } else {//object处理 _str = "{"; for (i in obj) { if (obj.hasOwnProperty(i)) { (_str.length > 1) && (_str += ","); _str += "\"" + i + "\":" + U.MS.jsonToStr(obj[i]); } } _str += "}"; } return _str; } } //---------------------------------- 字符串处理------------------------------------- U.M.String = { //场景:制作编辑器word,excel,txt时,把符号"'"转义成"\'",把符号"""转义成"\"". //作用,把符号"'"转义成"\'",把'张三'存入数据库,会报错,符号'''会在存储过程执行时报错,此时需要把"'"转成"\'",转换后的结果是"\'张三\'" //例:exec 存储过程 ''param'',转义为exec 存储过程 '\'param\'' //把符号"""转义成"\"",把"张三"存入数据库,会报错,符号'"'会在存储过程执行时报错,此时需要把"""转成"\"",转换后的结果是"\"张三\"" //例:exec 存储过程 ""param"",转义为exec 存储过程 "\"param\"" escapeQuotes: function () { return this.replace(/'/ig, '\'').replace(/"/ig, "\""); //字符串的形式输出 }, count: function () { //获取字符串长度 return this.substrU(); //调用SubstrU() 获取字符串长度 }, //截取字符串在制定的长度内 substrU: function (start, end) { var i, _UTF, _UN = 0, _UMS = ""; (end == null && start != null) && (end = start, start = 0); //参数只有一个的情况 start=0起点设置0 end=start把start当做截取字符串的终点 _UTF = (start == null && end == null); //没有参数情况 _UTF=true for (i = 0; i < this.length; i++) { _UN += this.charCodeAt(i) < 255 ? 1 : 2; //非常规字符判断长度为2 常规则1 if (_UN < start) { continue; } //当前长度小于起点则 continue if (_UN <= end || _UTF) {//当前长度小于 终点 _UMS += this.charAt(i); //获取字符串的第i个 continue; } break; //不符合if时 break } return (_UTF ? _UN : _UMS); //判断参数是否为空 为空返回长度 否则返回截取的字符串 }, //jsstring: function () { //json string // return this.replace(/\r\n/g, "\\r\\n").replace(/\n/g, "\\n").replace(/\"/g, "\\\""); //把 \r\n转成 \\r\\n \n转成\\n \"转成\\\" //}, //SubstrN: function (UN) { //判断是否在指定的长度内, // return this.substrU(0, UN) == this; //用SubstrU截取0-UN的字符串 判断是否等于原字符串 //}, isStrNull: function () { //判断是否为空字符串 return this.trim() == ""; //用trim 去除所有空白字符再判断是否等于 "" }, //文本换行替换成页面换行,把\r\n 换成
replaceRnToBr: function () { return this.replace(/\r\n/g, "
"); //把\r\n 换成
}, //成页面换行替换成文本换行,把
换成\r\n replaceBrToRn: function () { return this.replace(/<(BR)[^<>]*>/ig, "\r\n"); // 把
换成\r\n }, removeP: function () { //去除P标签 return this.replace(/<(p)[^<>]*>/ig, ""); //把

去掉 }, removeBr: function () { //去除BR标签 return this.replace(/<(BR)[^<>]*>/ig, ""); //把
去掉 }, removeRn: function () { //去除\r\n标签 return this.replace(/\r\n/g, ""); //把\r\n 去掉 }, replaceBrAndBlank: function () { //把
转换为 \r\n并把空格" "转换为"",应用场景在哪里? return this.replaceBrToRn().replace(/ /g, ''); }, //判断用户是否在div可编辑区域里面输入了内容。 isHtmlNull: function () { //移除
标签,移除P标签,去除所有空格。当用户发帖时需要判断用户是否输入了文字图片,可以用此函数判断用户是否输入了内容。在div可编辑时需要用此函数。 return this.removeBr().removeP().trim() != ""; // }, //把字符串中的< > 分别转换成 < > replaceLtAndGt: function () { return this.replace(/</g, "<").replace(/>/g, ">"); //所有< > 分别转换成 < > }, //把字符串中的 < >分别转换成< > replaceAngleBrackets: function () { //把字符串中的 < >分别转换成< > return this.replace(//g, ">"); //所有< > 分别转换成 < > }, //应用:从数据库取出的html代码会直接显示在页面中,为了让js,css等文字以文字的形式显示,而不是植入到页面中不显示,所以需要转义。 //HTML字符转化为ASCLL码.把字符串中的 < >分别转换成< > ,把"'"转换为"'",把"""转换为""",把 //注释:/&(?!#?[a-zA-Z0-9]+;)/g, "&"暂时不知道什么意思。 replaceHtmlSign: function () { return this.replace(/&(?!#?[a-zA-Z0-9]+;)/g, "&").replace(//g, ">").replace(/'/g, "'").replace(/"/g, """); }, replaceDoubleToAngleBrackets: function () { //html字符可输出 return this.replace(/\《/g, "<").replace(/\》/g, ">"); //所有《》转换为<> }, replaceAngleToDoubleBrackets: function () {//中文括号 return this.replace(/\/g, "》"); // 所有<>转换为《》 }, trim: function (UST) {//去除所有空格,用于发帖时标题内容是否为空的判断,创建文件夹时输入文件夹名时的判断。 return this.replace(/\ |\ |\s+|\n|\r|\t/g, UST || ""); //去除空白符号、\t、\s、\r、\n }, lTrim: function () { //去除左边空格 return this.replace(/(^\s*)/g, ""); }, rTrim: function () { //去除右边边空格 return this.replace(/(\s*$)/g, ""); }, addPreSpace: function (n) { //字符串前面追加n个空格,用于IDE编辑器环境前面空四格 var i, k = ""; for (i = 0; i < n; i++) k += " "; return k + this; }, insertString: function (str, n) { //指定位置插入字符串 //调用substr截取字符串 加上插入的字符 再加上 把原字符串删除前UN个字符的字符串 var _pre = this.substr(0, n); var _back = this.substr(n, this.length); return _pre + str + _back; }, //指定位置插入省略号, 常见于文章标题过长、文件夹名称过长,在显示时后面的字符以省略号代替 addEllipsis: function (n) { //省略号 var _str = this.substrU(0, n); //调用SubstrU 截取字符串 if (_str != this) { _str = _str + "..."; } //当修改String的原型时,会把字符串string替换为object的str,所以需要用valueOf()方法转换为字符串的string. Object对象的格式类似 String {"asdasd"} return _str.valueOf(); //判断_str是否为原字符串 不是的话返回_str加上... }, //字符串转化成number toInt: function () { var _UTV = this.valueOf(), _UMS = _UTV.match(/^(-|\+)?\d+/g); return _UMS && _UMS.length == 1 ? Number(_UMS[0]) : _UTV; }, //把原字符串source换成目标字符串target replaceStr: function (source, target) { return this.replace(new RegExp(source, "gm"), target); //把原字符串source换成目标字符串target }, parseJSON: function () { //string 转 json对象 var _UJE = null, _UST = this; try { _UJE = eval("0,(" + _UST + ")"); } catch (e) { } return (_UJE == null ? _UST : _UJE).valueOf(); }, capitalizeFirstLetter: function () { //首字母大写 return this.replace(/\b(\w)|\s(\w)/g, function (UAE) { return UAE.toUpperCase(); }); }, //回车换行替换成换行 并返回按照\n拆分出的数组 SplitRN: function () { return this.replace(/\r\n/g, "\n").split("\n"); //把\r\n替换成\n 并且根据\n把字符串分成数组 }, //根据符号"<",">"把html字符串拆分成数组,适合于IDE编辑器 ////增加一个拆分html编码为字符串数组的操作,用于编辑器的换行,定义到主项目中 //拆分HTML编码,适合于编辑器,不止是拆分html编码,同时还需要把中间的文字提出出来,例如javascript代码,div中间的文字等。 SplitAngleBrackets: function (h) { var i, s, a = []; for (i = 0; i < h.length; i++) { if (h[i] == "<") s = i; if (h[i] == ">") a.push(h.substring(s, i + 1)); }; return a; }, //过滤html标签留下纯文本,不保留任何格式 htmlToText: function () { //过滤HTML标签留下纯文本 return String(this).replace(/(<(.[^>]*)>)/g, ""); }, //过滤html标签留下纯文本,但保留换行符号 htmlToTextRn: function () { return this.replace(/(<(.[^>]*)>)/g, function (str) { return (/(<\/(div|DIV|p|P)([|^>]*)>)|<(BR)[^<>]*>/g.test(str)) ? "\r\n" : ""; }); } }; //#endregion //#region 数字Number U.M.Number = { //数字转换成货币的格式 100000 = 10,000 formatMoney: function () { var _split; // var _arr = []; var _str = this.toString(); while (_str) { //循环拆分 _split = _str.length - 3; //unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。 _arr.unshift(_str.substr(_split < 0 ? 0 : _split)); _str = _str.substr(0, _split); } return _arr.join(","); }, //数字前面补零 prefixInteger: function (n) { return (this < 10 ? "0" + this : this).valueOf(); //小于10 补零 //Array(n)创建n位数组,join(0)以0作为分隔符, return (Array(n).join(0) + this).slice(-n); }, //把角度转换成弧度, toRadians: function () { //返回圆弧率 return this * Math.PI / 180; //PI即圆周率,Math.PI/180*t是将t把角度转换成弧度.缺少应用场景 } }; //#endregion //#region 数组处理 /** * 判断是否为数组,//ie10以下浏览器不支持Array.isArray。使用return Object.prototype.toString.call(arr) === "[object Array]";做兼容。U.M.Array是为了添加Array的原型方法,而Array.isArray不是原型方法,所以没有放到U.M.Array中。 * * @param {array} 需要判断的类型 * @returns {bool} 返回真假 */ Array.isArray = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) === "[object Array]"; } //数组初始化类 U.M.Array = { /** * 判断有否有内容包含在该数组中的位置 * * @param {string、number} 需要查找的值indexOf * @returns {int} -1 >-1 -1 就是数组不存在 >-1就是位置 */ indexOf: Array.prototype.indexOf || function (val, startpoint) { var i = startpoint || 0, j; //循环数组,获取数组的值 for (; i < this.length; i++) { //在数组中查找制定的值,如果值匹配数组中的其中一个,那么返回该数组所在的位置 if (this[i] == val) { return i; } } //如果没有找到制定的位置,那么就直接返回-1 return -1; }, //对象object在数组中的位置 //参数:object 形如{"name":"张三"} objIndexOf: function (obj) { var i, j, _isfind; for (i = 0; i < this.length; i++) { _isfind = false; //默认没有找到位置。 //循环所有的obj里面的key和value,匹配所有的key和value都正确的,找到第一个匹配成功的位置 for (j in obj) { //根据key匹配了指定的值,那么设置为true if (this[i][j] == obj[j]) { _isfind = true; } //如果根据key匹配指定的值错误,那么解决forin循环直接设置为false else { _isfind = false; break; } } //如果上面的obj判断全部正确,那么返回所在的位置,否则返回-1; if (_isfind) { return i; } } //如果没有找到制定的位置,那么就直接返回-1 return -1; }, /** * 移除数组里相同的值, 类似[element,elment,elment,element],或者[1,2,3,4,3,2],或者["张三","李四","张三","","王五"] * * @param {string} 判断字段 * @param {string} 原数组 * @returns 删除的原元素本身 */ unique: function () { //移除数组里相同的值 //将数组的值作为对象的属性,通过对象的属性值来判断数组是否重复,若该项不重复则给对象对应属性值赋为true,便于之后的判断,并将数据项加入结果集中 var result = []; var obj = {}; for (var i = 0; i < this.length; i++) { if (!obj[this[i]]) { result.push(this[i]); obj[this[i]] = true; } } return result }, //以下几个函数是做浏览器兼容的,系统本身支持这些函数,但有些浏览器不支持,为了使所有浏览器都支持,则定义以下几个兼容函数。 //方法对数组的每个元素执行一次提供的函数。 //参数一:callback 为数组中每个元素执行的函数,该函数接收三个参数:currentValue(当前值) 数组中正在处理的当前元素。index(索引)数组中正在处理的当前元素的索引。arrayforEach()方法正在操作的数组。 //参数二:可选参数。当执行回调 函数时用作this的值(参考对象)。 forEach: Array.prototype.forEach || function (cb, thisArg) {//允许object和array使用 var i = 0; var _length = this.length; while (i < _length) { cb.call(thisArg, this[i], i, this); i++; } }, /** * 测试数组的所有元素是否都通过了指定函数的测试。 * * @param {function} 用来测试每个元素的函数。 * @param {Array} 执行 callback 时使用的 this 值。 * @returns {boolean} */ every: Array.prototype.every || function (cb, thisArg) { // return this.forEach(cb, UTI, "every"); var i = 0, b; var _length = this.length; while (i < _length) { b = cb.call(thisArg, this[i], i, this); if (b == false) { return b; } i++; } return true; }, /** * 方法测试数组中的某些元素是否通过由提供的函数实现的测试。 * * @param {function} 用来测试每个元素的回调函数 * @param {Array} 执行 callback 函数时 使用的this 值。 * @returns {boolean} */ some: Array.prototype.some || function (cb, thisArg) { var t = Object(this); var len = t.length; for (var i = 0; i < len; i++) { if (i in t && cb.call(thisArg, t[i], i, t)) //为数组中的每一个元素执行一次 callback 函数,如果回调函数返回true的话,则some函数返回true。 return true; } return false; }, /** * 方法测试数组中的某些元素是否通过由提供的函数实现的测试。 * * @param {function} 生成新数组元素的函数,使用三个参数: currentValue callback 的第一个参数,数组中正在处理的当前元素。 @param {int} callback 的第二个参数,数组中正在处理的当前元素的索引。 @param {Array} callback 的第三个参数,map 方法被调用的数组。 * @param {Array} 执行 callback 函数时 使用的this 值。 * @returns {Array} 返回整合过后的新数组 */ map: Array.prototype.map || function (cb, thisArg) { /*var T, A, k; // 将O赋值为调用map方法的数组. var O = Object(this); //将len赋值为数组O的长度. var len = O.length; //如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined. if (thisArg) { T = thisArg; } //创建新数组A,长度为原数组O长度len A = new Array(len); //将k赋值为0 k = 0; //当 k < len 时,执行循环. while (k < len) { var kValue, mappedValue; //遍历O,k为原数组索引 if (k in O) { //kValue为索引k对应的值. kValue = O[k]; // 执行callback,this指向T,参数有三个.分别是kValue:值,k:索引,O:原数组. mappedValue = callback.call(T, kValue, k, O); // 返回值添加到新数组A中. A[k] = mappedValue; } // k自增1 k++; } //返回新数组A return A;*/ //定义自增量 var i = 0; //定义数组长度 var _length = this.length; //定义新的数组 var arr = []; //判断传入的cb必须是个'function',若不是返回类型错误提示 if (typeof cb != "function") throw new TypeError(); //当i<_length时循环 while (i < _length) { //判断索引是否为原数组的索引 if(i in this){ // 执行callback,this指向thisArg,参数有三个.分别是this[i]:值,i:索引,this:原数组. arr.push(cb.call(thisArg, this[i], i, this)); } //i+1 i++; } //返回出新的数组 return arr; }, /** * 创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。 * * @param {function} 用来测试数组的每个元素的函数。返回true表示保留该元素(通过测试),false则不保留。 * @param {Array} 可选。执行 callback 时的用于 this 的值。 * @returns {Array} 一个新的通过测试的元素的集合的数组 */ filter: Array.prototype.filter || function (cb, thisArg) { /*var t = Object(this); var len = t.length; var res = []; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; if (cb.call(thisArg, val, i, t)) //判断是否符合回调函数中的条件,如果符合则添加到新数组中 res.push(val); } } return res;*/ //定义自增量 var i = 0; //定义数组长度 var _length = this.length; //定义新的数组 var arr = []; //判断传入的cb必须是个'function',若不是返回类型错误提示 if (typeof cb != "function") throw new TypeError(); while (i < _length) { //如果i是原数组的索引,执行call.参数有三个.分别是this[i]:值,i:索引,this:原数组. if (i in this && cb.call(thisArg, this[i], i, this)) arr.push(this[i]); i++; } return arr; }, /* mdn中没有的Array方法 reject: function (cb, UTI) { //过滤真元素 return this.forEach(cb, UTI, "reject"); }, */ /** * 返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。 * * @param {function} 针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数: element 当前元素。 index 当前元素的索引。 array 调用findIndex的数组。 * @param {Array} 可选。执行 callback 时的用于 this 的值。 * @returns {int} 用来判断是否满足测试函数中的第一个元素的值 没有返回-1 */ findIndex: Array.prototype.findIndex || function (predicate) { /*var o = Object(this); var len = o.length; var thisArg = arguments[1]; var k = 0; while (k < len) { var kValue = o[k]; if (predicate.call(thisArg, kValue, k, o)) { //如果找到这个元素的话则返回k return k; } k++; } //没有找到该元素则返回-1 return -1;*/ //定义自增量 var i = 0; //定义数组长度 var _length = this.length; //判断传入的cb必须是个'function',若不是返回类型错误提示 if (typeof predicate != "function") throw new TypeError(); while (i < _length) { //参数有三个.分别是this[i]:值,i:索引,this:原数组. if (predicate(this[i], i, this)) //如果找到这个元素的话则返回i return i; i++; } return -1; }, /** * 方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 fromIndex 处开始。 * * @param {element} 被查找的元素。 * @param {int} 从此位置开始逆向查找。默认为数组的长度减 1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。 * @returns {int} 数组中最后一个元素的索引,如未找到返回-1 */ lastIndexOf: Array.prototype.lastIndexOf || function (searchElement, fromIndex) { var n, k, t = Object(this), len = t.length; if (len === 0) { //如果数组的长度为零的话直接返回-1 return -1; } n = len - 1; if (arguments.length > 1) { n = Number(arguments[1]); if (n != n) { n = 0; } else if (n != 0 && n != (1 / 0) && n != -(1 / 0)) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } for (k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n); k >= 0; k--) { if (k in t && t[k] === searchElement) { // 如果有等于参数1 的元素,返回该元素 return k; } } //如果上述查找没有符合条件的元素,返回-1 return -1; //定义结束位置 /* var endLength = !isNaN(parseFloat(UTI)) && isFinite(UTI) ? UTI : 0; //定义自减量 var i = this.length - 1; while (i >= endLength) { if (USE == this[i])//如果等于就返回i索引 return i; i--; } //没符合条件,返回-1 return -1;*/ }, /* mdn Array方法中无此方法 */ /* sample: function (UIE, UDE) { //获取一组随机数 UDE = UDE || this; var _USE = [], _UL = UDE.length; UIE = UIE || 1; for (i = 0; (i < _UL && i < UDE.length); i++) { _USE.push(UDE[U.P.getRandom(_UL)]); } },*/ /** * 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。 * * @param {int} 用来填充数组元素的值。 * @param {int} 起始索引,默认值为0。 * @param {int} 终止索引,默认值为 this.length。 * @returns {Array} 修改后的数组。 */ fill: Array.prototype.fill || function (value) { var O = Object(this); //转换成无符号的整数 var len = O.length; var start = arguments[1]; var relativeStart = start; //判断start是否小于零,并将相应的值赋予变量 var k = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); var end = arguments[2]; var relativeEnd = end === undefined ? len : end; //判断end是否小于零,并将相应的值赋予变量 var _final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); //对数组进行填充 while (k < _final) { O[k] = value; k++; } return O; }, /** * 浅复制数组的一部分到同一数组中的另一个位置,并返回它,而不修改其大小。 * * @param {int} 0 为基底的索引,复制序列到该位置。如果是负数,target 将从末尾开始计算。 * @param {int} 0 为基底的索引,开始复制元素的起始位置。如果是负数,start 将从末尾开始计算。 * @param {int}0 为基底的索引,开始复制元素的结束位置。copyWithin 将会拷贝到该位置,但不包括 end 这个位置的元素。如果是负数, end 将从末尾开始计算。 * @returns {Array} 改变了的数组。 */ copyWithin: Array.prototype.copyWithin || function (target, start, end) { //拷贝对象 var O = Object(this); var len = O.length; //转换成无符号整数 var relativeTarget = target; //判断target是否小于0,并将判断之后的值赋予变量 var to = relativeTarget < 0 ? Math.max(len + relativeTarget, 0) : Math.min(relativeTarget, len); //start转换成无符号整数 var relativeStart = start; //判断start是否小于0,并将判断之后的值赋予变量 var from = relativeStart < 0 ? Math.max(len + relativeStart, 0) : Math.min(relativeStart, len); var end = arguments[2]; var relativeEnd = end === undefined ? len : end >> 0; //判断end是否小于0,并将判断之后的值赋予变量 var _final = relativeEnd < 0 ? Math.max(len + relativeEnd, 0) : Math.min(relativeEnd, len); var count = Math.min(_final - from, len - to); var direction = 1; if (from < to && to < (from + count)) { direction = -1; from += count - 1; to += count - 1; } //循环进行数组操作 while (count > 0) { if (from in O) { O[to] = O[from]; } else { delete O[to]; } from += direction; to += direction; count--; } //返回复制过后的数组 return O; }, /*该特性是非标准的,请尽量不要在生产环境中使用它!*/ //toSource: function () { return JSON.stringify(this); }, /* mdn Array方法中无此方法 */ //ArrayToString: function () { return JSON.stringify(this); }, //数组转换为字符串,在写api时获取后台返回的值时经常用到。 /* IE无法兼容此方法 */ /*keys: Array.prototype.keys || function () { var _UME = function (UDE) { this.i = 0; this.e = UDE; } _UME.prototype = { next: function () { //迭代 return { value: this.i++, done: this.i >= this.e.length } } } return new _UME(this); },*/ /** * 返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对。 * * @returns {object} 一个新的 Array 迭代器对象。 */ /* IE无法兼容此方法 */ //entries: Array.prototype.entries || function () { } //一维数组深拷贝是用concat()函数。 //多维数组深度拷贝函数 //重玩本关是一个难点,难度在于三维数组的拷贝,只复制地址,不复制值,这意味着通关后的数组再也回不到初始化时的数组,也就实现不了重玩本关的功能。 //javascrit数组数据类型提供了slice(0)和concat()函数实现数组的深拷贝,但只局限于一维数组,在二维,三维,四维中不起作用。 //为了解决此问题,特提供深度拷贝函数解决此问题。 //递归的适合于二维数组以上的所有维度的深拷贝。 deepCopy: function () { var _newarr = []; for (i = 0; this.length; i++) { if (Array.isArray(this[i])) { //深拷贝 deepCopy(this[i]); } else { return this.concat(); } } return _newarr; } }; //#endregion //#region Guid /** * 自定义Guid 类型 默认情况下我们给guid返回 空Guid */ window.Guid = U.M.Guid = { //生成Guid newGuid: function () { var _UN, i, _UGID = ""; for (i = 0; i < 32; i++) { _UGID += Math.floor(Math.random() * 16).toString(16); //随机0 - 16 的数字 转变为16进制的字符串 _UN = Math.floor((i - 7) / 4); //计算 (i-7)除4 if (_UN > -1 && _UN < 4 && (i == (7 + 4 * _UN))) { //会使guid中间加 "-" 形式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx _UGID += "-"; } } return _UGID; }, //空Guid emptyGuid: US.NU, // 返回一串无 "-" 的Guid Dash翻译为破折号 guidNoDash: function () { return Guid.newGuid().replace(/-/g, ""); }, //测试是不是正确的Guid 返回结果为 true 或 false IsGuid: function (UGID) { return U.MS.Guid.test(UGID); } } //#endregion