UNPKG

9.96 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var global = new Function('return this')();
6
7var isClient = typeof window === "object" && window === global;
8var isServer = !isClient;
9
10var AP = Array.prototype;
11var OP = Object.prototype;
12
13var arrayForEach = AP.forEach;
14var arraySlice = AP.slice;
15var toString = OP.toString;
16var hasOwnProperty = OP.hasOwnProperty;
17
18var referenceTypes = {'object': !0, 'function': !0};
19
20var support__proto__ = '__proto__' in {};
21
22/**
23 * function empty, do nothing
24 * @return {Undefined}
25 */
26function noop () {
27}
28
29/**
30 * function allways return false
31 * @return {Boolean} false
32 */
33function returnFalse () {
34 return false
35}
36
37/**
38 * function allways return true
39 * @return {Boolean} true
40 */
41function returnTrue () {
42 return true
43}
44
45var sNativeCode = (isNaN + '').slice((isNaN + '').indexOf('{'));
46/**
47 * test function is a javascript native method
48 *
49 * @param {Function} func native function of javascript
50 * @return {Boolean}
51 */
52function isNativeFunction(func) {
53 return toString.call(func) === '[object Function]' && sNativeCode === (func += '').slice(func.indexOf('{'))
54}
55
56/**
57 * polyfill es2015 Object.assign
58 *
59 * @param {Object} target
60 * @returns {Object} target
61 */
62var assign = isNativeFunction(Object.assign) ? Object.assign : (Object.assign = function assign(target/*, ...args*/) {
63 if (target == null) {
64 throw new TypeError('Cannot convert undefined or null to object')
65 }
66
67 var output = Object(target),
68 i = -1,
69 args = arraySlice.call(arguments, 1),
70 l = args.length;
71
72 while (++i < l) {
73 var source = args[i];
74
75 if (source) {
76 for (var prop in source) {
77 if (source.hasOwnProperty(prop)) {
78 output[prop] = source[prop];
79 }
80 }
81 }
82 }
83 return output
84});
85
86/**
87 * polyfill es5 Object.create
88 *
89 * @param {Object} object
90 * @param {Object} props
91 * @returns {Object} like {__proto__: *}
92 */
93var create = isNativeFunction(Object.create) ? Object.create : (Object.create = function create(object, props) {
94 if (object == null || !referenceTypes[typeof object]) {
95 throw 'Object prototype may only be an Object or null'
96 }
97
98 var proto = support__proto__ ? {__proto__: object} : (noop.prototype = object, new noop);
99
100 if (props) {
101 if (referenceTypes[typeof props]) {
102 for (var propName in props) {
103 if (hasOwnProperty.call(props, propName)) {
104 var prop = props[propName];
105
106 if (prop && referenceTypes[typeof prop]) {
107 object[propName] = prop.value;
108 } else {
109 throw 'Property description must be an object: value'
110 }
111 }
112 }
113 }
114 }
115 return proto
116});
117
118/**
119 * polyfill es5 Array.isArray
120 *
121 * @param {Array} arg
122 * @returns {Boolean}
123 */
124var isArray = isNativeFunction(Array.isArray) ? Array.isArray : (Array.isArray = function isArray(arg) {
125 return toString.call(arg) === '[object Array]'
126});
127
128/**
129 * test an object use 'for in'
130 *
131 * @param {Object} [object]
132 * @return {Boolean}
133 */
134function isEmptyObject(object) {
135 for (var k in object) {
136 return false
137 }
138 return true
139}
140
141/**
142 * test traverse own property first use "for in" (IE lt 10 return true)
143 * @return {Boolean}
144 */
145var firstTraverseOwnProperty = function () {
146 var o = {a: 1};
147 var c = create(o);
148 c.b = 1;
149 for (var k in c) {
150 return k === 'b'
151 }
152}();
153
154/**
155 * test an object is plain (eg: {} or new Object() created)
156 *
157 * @param {Object} [object]
158 * @return {Boolean}
159 */
160function isPlainObject (object) {
161 // Must be an Object.
162 // Because of IE, we also have to check the presence of the constructor property.
163 // Make sure that DOM nodes and window objects don't pass through, as well
164 if (!object || toString.call(object) !== "[object Object]") { return false }
165 try {
166 // Not own constructor property must be Object
167 if (object.constructor && !hasOwnProperty.call(object, "constructor") && !hasOwnProperty.call(object.constructor.prototype, "isPrototypeOf")) {
168 return false
169 }
170 } catch (e) {
171 // IE8,9 Will throw exceptions on certain host objects
172 return false
173 }
174 var k;
175 if (firstTraverseOwnProperty) {
176 for (k in object) {
177 0; // fix rollup bug
178 }
179 return typeof k !== 'string' || hasOwnProperty.call(object, k)
180 }
181 for (k in object) {
182 return hasOwnProperty.call(object, k)
183 }
184 return true
185}
186
187var keys = isNativeFunction(Object.keys) ? Object.keys : function () {
188 var unableEnumerateOwnKeys, key;
189 for (key in {toString: 1}) {
190 0; // fix rollup bug
191 break
192 }
193
194 // IE 某些属性即便为自身属性也无法枚举
195 key || (unableEnumerateOwnKeys = 'constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf'.split(' '));
196
197 /**
198 * polyfill es5.1 Object.keys
199 *
200 * @param {Object} object
201 * @returns {Object} like {__proto__: *}
202 */
203 return (Object.keys = function keys (object) {
204 var arrkeys = [], key, l, i;
205 if (unableEnumerateOwnKeys) {
206 l = unableEnumerateOwnKeys.length;
207 i = -1;
208 while (++i < l) {
209 hasOwnProperty.call(object, unableEnumerateOwnKeys[i]) && (arrkeys[l++] = unableEnumerateOwnKeys[i]);
210 }
211 }
212 for (key in object) {
213 hasOwnProperty.call(object, key) && (arrkeys[l++] = key);
214 }
215 return arrkeys
216 })
217}();
218
219/**
220 * object deep merge
221 *
222 * @param {Object} target
223 * @return {Object} target
224 */
225function merge(target/*, ...args*/) {
226 var arguments$1 = arguments;
227
228 if (target == null) {
229 throw new TypeError('Cannot convert undefined or null to object')
230 }
231
232 for (var l = arguments.length, i = 0; ++i < l;) {
233 var overrider = arguments$1[i];
234
235 if (overrider && overrider !== target) {
236 if (isArray(overrider)) {
237 mergeArray(target, overrider);
238 } else {
239 mergeObject(target, overrider);
240 }
241 }
242 }
243 return target
244
245 function mergeArray(target, overrider){
246 for (var n = overrider.length, k = -1; ++k < n;) {
247 deepMerge(target, overrider, k);
248 }
249 return target
250 }
251
252 function mergeObject(target, overrider){
253 for (var k in overrider) {
254 deepMerge(target, overrider, k);
255 }
256 return target
257 }
258
259 function deepMerge(target, overrider, key) {
260 var oValue = overrider[key];
261 var tValue = target[key];
262
263 if (oValue && oValue !== tValue && typeof oValue === 'object') {
264
265 if (isArray(oValue)) {
266 target[key] = mergeArray(tValue && isArray(tValue) ? tValue : [], oValue);
267
268 } else if (isPlainObject(oValue)) {
269 target[key] = mergeObject(tValue && isPlainObject(tValue) ? tValue : {}, oValue);
270
271 } else {
272 target[key] = oValue;
273 }
274 } else {
275 target[key] = oValue;
276 }
277 }
278}
279
280/**
281 * set or get namespace
282 * @return {Boolean} true
283 */
284function namespace (root, sNamespace, variable) {
285 // 变量判断转化
286 if (typeof root === 'string') {
287 variable = sNamespace;
288 sNamespace = root;
289 root = global;
290 }
291
292 if (!root || typeof sNamespace !== 'string') {
293 return
294 }
295
296 var namespaces = sNamespace.split('.');
297 var i = -1;
298 var l = namespaces.length - 1;
299
300 // 若未定义,则为获取命名空间
301 if (typeof variable === 'undefined') {
302 while (++i < l) {
303 root = root[namespaces[i]];
304 if (!root) {
305 return
306 }
307 }
308 return root[namespaces[l]]
309 }
310
311 while (++i < l) {
312 root = root[namespaces[i]] || (root[namespaces[i]] = {});
313 }
314 return (root[namespaces[l]] = variable)
315}
316
317function toArray (object, startIndex, endIndex) {
318 if (object == null) {
319 throw new Error('can not convert from null or undefined')
320 }
321 return arraySlice.call(object, startIndex, endIndex)
322}
323
324/**
325 * judge a object type name
326 *
327 * @param {Object|Null|Undefined|String|Number|Function|Array|RegExp|HTMLDocument|HTMLHtmlElement|NodeList|XMLHttpRequest|...} object any
328 * @return {String} string of type name, initials Capitalized
329 */
330function typeOf(object) {
331 return toString.call(object).slice(8, -1)
332}
333
334/**
335 * 全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) 。
336 * GUID是一种由算法生成的二进制长度为128位的数字标识符。
337 * GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。
338 * 在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。
339 * GUID 的总数达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性非常小,但并不为0。
340 * GUID一词有时也专指微软对UUID标准的实现。
341 */
342
343/**
344 * string of 4 chars
345 *
346 * return {String} length{4} 0-9 or a-f 范围内的一个32位十六进制数
347 */
348function S4() {
349 return (((1 + Math.random()) * 0x10000) | 0).toString(16).slice(1)
350}
351
352/**
353 * 生成一个全局唯一标识符
354 * @return {String} length{36} 返回格式为:“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx” 的字符串
355 */
356function uuid() {
357 return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4())
358}
359
360exports.assign = assign;
361exports.create = create;
362exports.isArray = isArray;
363exports.isEmptyObject = isEmptyObject;
364exports.isNativeFunction = isNativeFunction;
365exports.isPlainObject = isPlainObject;
366exports.keys = keys;
367exports.merge = merge;
368exports.namespace = namespace;
369exports.toArray = toArray;
370exports.typeOf = typeOf;
371exports.uuid = uuid;
372exports.global = global;
373exports.isClient = isClient;
374exports.isServer = isServer;
375exports.arrayForEach = arrayForEach;
376exports.arraySlice = arraySlice;
377exports.toString = toString;
378exports.hasOwnProperty = hasOwnProperty;
379exports.referenceTypes = referenceTypes;
380exports.support__proto__ = support__proto__;
381exports.noop = noop;
382exports.returnFalse = returnFalse;
383exports.returnTrue = returnTrue;