docs: function Param() {
  		if (arguments.length == 0) {
  			throw new ERR.Arguments('1+', 0);
  		}
  
  		if (arguments.length == 1 && arguments[0] instanceof Param) {
  			return arguments[0];
  		}
  
  		this.type = null;
  		this.minSize = 1;
  		this.maxSize = 1;
  		this.nil = false;
  		this.undef = false;
  		this.absent = false;
  		this.absentValue = undefined;
  		this.arrayed = false;
  
  		var setSize = (function(size) {
  			if (typeof size == 'string') {
  				// 清除所有空白字符。
  				size = size.replace(/\s/g, '');
  				if (size == '*' || size == '...') {
  					this.minSize = 0;
  					this.maxSize = Infinity;
  					this.arrayed = true;
  					return true;
  				}
  				if (size == '+') {
  					this.minSize = 1;
  					this.maxSize = Infinity;
  					this.arrayed = true;
  					return true;
  				}
  
  				// 区间形式。
  				if (/^\{.+\}$/.test(size)) {
  					size = size.slice(1, -1);
  				}
  				if (/^\d+$/.test(size)) {
  					this.minSize = this.maxSize = parseInt(size);
  					this.arrayed = true;
  					return true;
  				}
  				if (/^,(\d+)$/.test(size)) {
  					this.minSize = 0;
  					this.maxSize = parseInt(RegExp.$1);
  					this.arrayed = true;
  					return true;
  				}
  				if (/^(\d+),$/.test(size)) {
  					this.minSize = parseInt(RegExp.$1);
  					this.maxSize = Infinity;
  					this.arrayed = true;
  					return true;
  				}
  				if (/^(\d+),(\d+)$/.test(size)) {
  					this.minSize = parseInt(RegExp.$1);
  					this.maxSize = parseInt(RegExp.$2);
  					this.arrayed = true;
  					return true;
  				}
  				return false;
  			}
  
  			if (Number.isInteger(size) && size > 0) {
  				this.minSize = this.maxSize = size;
  				this.arrayed = true;
  				return true;
  			}
  
  			return false;
  		}).bind(this);
  
  		var type = arguments[0], decos = [];
  
  		// ---------------------------
  		// 处理特殊的参数占位符。
  		if (setSize(type)) {
  			this.type = Type.ANY;
  			return this;
  		}
  
  		// ---------------------------
  		// 处理数据类型。
  
  		if (typeof type == 'string') {
  			// 如果首参数是字符串，则它可能包括数据类型别名及修饰符，我们需要首先将其拆分。
  			// 拆分后第一个字符串作为数据类型（别名，后面还会继续处理），其余作为修饰符。
  			decos = type.trim().split(/\s+/);
  			type = decos.shift();
  		}
  
  		this.type = Type.parse(type);
  
  		// ---------------------------
  		// 处理修饰符。
  
  		var DECOS = ['NULL', 'UNDEFINED', 'ABSENT'], i;
  
  		for (i = 1; i < arguments.length; i++) {
  			if (typeof arguments[i] == 'string') {
  				decos = decos.concat(arguments[i].trim().split(/\s+/));
  			}
  			else if (Number.isInteger(arguments[i])) {
  				decos.push(arguments[i]);
  			}
  
  			// @tag 20180222
  			else if (arguments[i] instanceof Absent) {
  				this.absent = true;
  				this.absentValue = arguments[i].value;
  			}
  		}
  		
  		for (i = 0; i < decos.length; i++) {
  			var rawDeco = decos[i];
  
  			// 尝试作为量化修饰符应用。
  			if (setSize(rawDeco)) continue;
  
  			// 设置缺省值。
  			// 注意：为避免歧义，缺省值字面量中不得出现空格。
  			// @tag 20180222
  			if (/^=(.+)$/.test(rawDeco)) {
  				this.absent = true;
  				this.absentValue = eval(RegExp.$1);
  				continue;
  			}
  
  			// 普通修饰符不区分大小写。
  			decos[i] = decos[i].toUpperCase();
  
  			// 如果修饰符不合法，须抛出异常。
  			if (!has(DECOS, decos[i])) {
  				throw new ERR.Range('param decorator', DECOS, rawDeco);
  			}
  		}
  
  		// 为了避免可能的语法冲突，这些修饰符对应的属性名回避了 JavaScript 保留字。
  
  		// 参数是否可以为 null
  		this.nil = has(decos, 'NULL');
  
  		// 参数是否可以为 undefined
  		this.undef = has(decos, 'UNDEFINED');
  
  		// 参数是否可以缺席。
  		if (!this.absent) {
  			this.absent = has(decos, 'ABSENT');
  		}
  	}