/*
* XExtends Core v1.0.1
*
* Free open source
* Author: xu_liangzhan@163.com
*/
(function(){
'use strict';
var
str_num = 'number',
str_undefined = 'undefined',
symbol_iterator = 'iterator',
global = typeof window === str_undefined ? this : window,
__xe = global.XExtends = {version : "1.0.0"},
__symbolMap = {},
__symbolForList = [],
__incrementId = Math.round(Math.random()*100),
__decrementId = Math.round(Math.random()*10000);
function getSymbolIndex(key, type){
for(var index = 0, len = __symbolForList.length; index < len; index++){
if(key === __symbolForList[index][type]){
return index;
}
}
}
/*
* ES6 不可变的数据类型,用来产生唯一的标识,但是却无法直接访问这个标识
*/
function XESymbol(key){
var value;
if(this && this.constructor === XESymbol){
throw new TypeError('Symbol is not a constructor');
}
if(__symbolMap.hasOwnProperty(key)){
throw new TypeError('Cannot convert a Symbol value to a string');
}
return __symbolMap[value = 'XESymbol(' + key + ') ^' + (__decrementId--) + Date.now() + '' + (__incrementId++) + '' + Math.random()] = key, value;
}
XESymbol.iterator = XESymbol(symbol_iterator);
XESymbol['for'] = function(key){
var value, index = getSymbolIndex(key, 0);
if(index === undefined){
__symbolForList.push([key, value = XESymbol(key)]);
}else{
value = __symbolForList[index][1];
}
return value;
}
XESymbol.keyFor = function(key){
var index = getSymbolIndex(key, 1);
if(typeof index === str_num){
return __symbolForList[index][0];
}
if(!__symbolMap.hasOwnProperty(key)){
throw new TypeError(key + ' is not a symbol');
}
}
XESymbol.isSymbol = function(value){
return typeof getSymbolIndex(value, 1) === str_num || __symbolMap.hasOwnProperty(value);
}
if(!global.Symbol){
global.Symbol = XESymbol;
}
__xe.Symbol = XESymbol;
if(!global.Symbol.isSymbol){
global.Symbol.isSymbol = function(value){
return typeof value === "symbol";
}
}
})();
(function(){
'use strict';
var
str_obj = 'object',
str_fn = 'function',
str_str = 'string',
str_arr = 'array',
str_num = 'number',
str_bool = 'boolean',
str_undefined = 'undefined',
str_error_nullobject = 'Cannot convert undefined or null to object',
proto_string = String.prototype,
proto_array = Array.prototype,
iterator_index = Symbol('Iterator Index'),
iterator_list = Symbol('Iterator Value'),
global = typeof window === str_undefined ? this : window,
__xe = global.XExtends;
function findItem(list, callback, context, has){
for(var index = 0, len = list.length; index < len; index++){
if(callback.call(context || global, list[index], index, list)){
return {index : index, value : has ? true : list[index]};
};
}
return {index : -1, value : has ? false : has};
}
function getArrayIteratorResult(iterator, value, done){
return done = iterator[iterator_index]++ >= iterator[iterator_list].length, {done : done, value : done ? undefined : value};
}
function ArrayEntriesIterator(list){
this[iterator_index] = 0;
this[iterator_list] = list;
this.next = function(){
return getArrayIteratorResult(this, [this[iterator_index], this[iterator_list][this[iterator_index]]]);
}
}
function ArrayIndexIterator(list){
this[iterator_index] = 0;
this[iterator_list] = list;
this.next = function(){
return getArrayIteratorResult(this, this[iterator_index]);
}
}
function ArrayValueIterator(list){
this[iterator_index] = 0;
this[iterator_list] = list;
this.next = function(){
return getArrayIteratorResult(this, this[iterator_list][this[iterator_index]]);
}
}
function each(obj, callback, context){
for(var key in obj){
if(obj.hasOwnProperty(key)){
callback.call(context, obj[key], key, obj)
}
}
}
function getObjectIterators(obj, getIndex){
if(__xe.isObject(obj)){
var result = [];
for(var key in obj){
if(obj.hasOwnProperty(key)){
result.push([key, obj[key], [key, obj[key]]][getIndex]);
}
}
return result;
}
throw new TypeError(str_error_nullobject);
}
function toAssignValue(obj){
return __xe.isObject(obj) || __xe.isFunction(obj) ? obj : Array.from(obj);
}
each({Object : str_obj, Undefined : str_undefined, Boolean : str_bool, String : str_str, Number : str_num, Function : str_fn}, function(type, method){
__xe['is' + method] = function(obj){
return typeof obj === type;
};
});
each({isRegExp : RegExp, isPlainObject : Object, isArray : Array, isDate : Date, isError : Error, isTypeError : TypeError}, function(object, method){
__xe[method] = function(obj){
return obj && obj.constructor === object || false;
}
});
/*
* Object method
*/
each({
/*
* ES5 浅拷贝一个或者多个对象到目标对象中
*
* @param Object target 对象
* @param Object ...
* @return Object
*/
assign : function(target){
if(target === null || target === undefined){
throw new TypeError(str_error_nullobject);
}
target = toAssignValue(target);
for(var source, index = 1, len = arguments.length; index < len; index++){
source = toAssignValue(arguments[index]);
for(var key in source){
if(source.hasOwnProperty(key)){
target[key] = source[key];
}
}
}
return target;
},
/*
* ES6判断两个值是否是相同的值
*
* @param Object v1 值
* @param Object v2 值
* @return Boolean
*/
is : function(v1, v2){
if(v1 === v2){
return v1 !== 0 || 1/v1 === 1/v2;
}
return v1 !== v1 && v2 !== v2;
},
/*
* ES5 遍历对象的属性
*
* @param Object obj 对象
* @return Array
*/
keys : function(obj){
return getObjectIterators(obj, 0);
},
/*
* ES8遍历对象的属性值
*
* @param Object obj 对象
* @return Array
*/
values : function(obj){
return getObjectIterators(obj, 1);
},
/*
* ES8 遍历对象的属性名和属性值
*
* @param Object obj 对象
* @return Array
*/
entries : function(obj){
return getObjectIterators(obj, 2);
},
/*
* ES5 在一个对象上定义新的属性或修改现有属性
*
* @param Object obj 对象
* @param Object props 属性
* @return Object
*/
defineProperties : function(obj, props){
if(obj && (__xe.isObject(obj) || __xe.isFunction(obj))){
if(props === null || props === undefined){
throw new TypeError(str_error_nullobject);
}
for(var key in props){
if(props.hasOwnProperty(key)){
Object.defineProperty(obj, key, props[key]);
}
}
return obj;
}
throw new TypeError('Object.defineProperties called on non-object');
}
}, function(fn, name){
if(!Object[name]){
Object[name] = fn;
}
});
/*
* Function method
*/
each({
/*
* ES5 创建一个新的函数, 当被调用时,将其this关键字设置为提供的值
*
* @param Object context 上下文
* @return Function
*/
bind : function(context){
var fn = this;
return function(){
return fn.apply(context, arguments);
}
}
}, function(fn, name){
if(!Function.prototype[name]){
Function.prototype[name] = fn;
}
});
/*
* Date method
*/
each({
/*
* ES5 返回至今毫秒数
*
* @return Number
*/
now : function(){
return new Date().getTime();
}
}, function(fn, name){
if(!Date[name]){
Date[name] = fn;
}
});
/*
* Number method
*/
each({
/*
* ES6 检查一个数值是否非无穷
*
* @param Number val 数值
* @return Boolean
*/
isFinite : function(val){
r
![avatar](https://profile-avatar.csdnimg.cn/28592a90b3684262a380212f0432bcb9_xlz26296.jpg!1)
也只能是酱紫
- 粉丝: 377
- 资源: 8
最新资源
- 机械臂运动仿真与轨迹分析:基于机器人工具箱的MATLAB正逆运动学工作空间探索与示教应用,机械臂运动仿真与轨迹分析:基于MATLAB机器人工具箱的正逆运动学工作空间探索与示教实践,机械臂运动仿真,机器
- 三相VIENNA整流器仿真研究:T型整流器双闭环PI控制及中点电位平衡控制策略,SPWM调制与高效能表现,三相VIENNA整流器仿真研究:T型整流器双闭环PI控制及中点电位平衡控制策略,SPWM调制与
- win32汇编环境,对话框程序使用跟踪条控件示例二
- apollo自动驾驶10.0-感知-lidar-完整注释版
- 五个带隙基准电路展示:包含曲率补偿与高PSRR特性,基于0.18um工艺的基准源电路设计珍藏版,展示五个带隙基准电路:含曲率补偿与高PSRR的BGR,基于0.18um工艺,完整电路及仿真测试成果,可直
- 双馈风机虚拟惯性与下垂控制在系统一次调频中的MATLAB模型:频率二次跌落研究,“双馈风机虚拟惯性与下垂控制在一次调频中的MATLAB应用:转速回复引发频率二次跌落研究”,双馈风机(永磁同步风机)惯性
- 含UPFC电力系统的潮流计算程序:一键设置,轻松复现lunwen,只需调整UPFC安装与控制参数,含UPFC电力系统的潮流计算程序:快速复现Lunwen的实用工具,只需设置安装位置与控制参数,含UPF
- 30天开发操作系统 第 21 天 -保护操作系统
- 富水断层破碎带隧道工程中流固耦合作用下的突水突泥机理及注浆治理技术研究,流固耦合作用下富水断层破碎带隧道突水突泥机理及注浆治理技术实践,富水断层破碎带隧道突水突泥机理及注浆治理技术研究 隧道开挖卸荷
- Notepad_202502151235_47394.png
- go1.23.5.Windows-amd64安装包
- JimuFlow RPA工具Windows版v1.0.0
- 1-1.学生类定义.cpp
- SVG技术在100MW直驱风电场中的应用:五个链路,每链路等值20台2MW直驱风机,配以10Mvar SVG定电压控制,构建10kV电压等级风电系统,基于SVG技术的100MW直驱风电场等值分析:单
- pycharm安装教程和基本配置
- 一个用 c 语言编写的图书管理系统源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)