在項目實例中,不免要作一些容錯處理或者是對實例的類型判斷,那麼就能夠把這部分的判斷整理成公共的js文件,供全局使用。數組
利用object.prototype.toString.call
能夠判斷對象的類型函數
變量的兩種類型值:
一、基本類型:String,Number,Boolean,undefined,null,按值訪問
二、引用類型:Object,Array, 對象保存在內存中工具
能夠做爲項目的工具類,好比命名爲tool.js
prototype
export default isNumber(value) { return Object.prototype.toString.call(value) == '[object Number]' } export default isString(value) { return Object.prototype.toString.call(value) == '[object String]' } export default isArray(value) { return Object.prototype.toString.call(value) == '[object Array]' } export default isBoolean(value) { return Object.prototype.toString.call(value) == '[object Boolean]' } export default isUndefined(value) { return value === undefined } export default isNull(value) { return value === null } export default isSymbol(value) { return Object.prototype.toString.call(value) == '[object Symbol]' } export default isObject(value) { return ( Object.prototype.toString.call(value) == '[object Object]' || // if it isn't a primitive value, then it is a common object ( !isNumber(value) && !isString(value) && !isBoolean(value) && !isArray(value) && !isNull(value) && !isFunction(value) && !isUndefined(value) && !isSymbol(value) ) ) } //是不是一個空對象 export function isEmptyObject(obj) { if(!isObject(obj)) { return false } if(var key in obj) { return false } return true } //是不是一個空數組 export function isEmptyArray(array) { if(!isArray(array)) { return false } return array.length > 0 ? false : true } export function isFunction(value) { return Object.prototype.toString.call(value) == '[object Function]'; }
Object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說,若是拷貝後的結果是兩個對象指向同一引用地址,修改其中一個對象的屬性,則另外一個對象的屬性也會改變
因此改變引用類型值時會影響到拷貝的值code
var obj1 = {a: {b: 1}}; var obj2 = Object.assign({}, obj1); obj1.a.b = 2; obj2.a.b // 2
下面extend
函數就是解決上面的問題orm
/* 深度合併內容 引用類型克隆合併 arguments[0] = target arguments type is Object Or Array 多內容合併覆蓋優先級: arguments[0]<arguments[1]<arguments[2].. 若是sources 不是數組或者對象 則直接忽略 使用 extend(target, ...source) */ export function extend(){ var args = Array.prototype.slice.call(arguments); if(args.length === 0){ console.error('extends params is undefined') return {}; } if(args.length === 1){ return args[0] } //要合併的目標對象 var target = args[0]; //要合併的內容 var sources = args.slice(1,args.length) if(!isObject(target) && !isArray(target)){ target = {}; } sources.map(function(item){ //防止死循環 if(target === item){ return false; } //若是內容是對象 if(isObject(item)){ //開始遍歷 for(var key in item){ //若是內容是對象 if(isObject(item[key])){ //修正數據 target[key] = (target[key] && isObject(target[key]))?target[key]:{}; target[key] = extend(target[key],item[key]) }else if(isArray(item[key])){ //修正數據 target[key] = (target[key] && isArray(target[key]))?target[key]:[]; target[key] = extend(target[key],item[key]) }else{ //基本類型直接賦值 target[key] = item[key] } } }else if(isArray(item)){ for(var i = 0; i<item.length ;i++){ //若是內容是對象 if(isObject(item[i])){ //修正數據 target[i] = (target[i] && isObject(target[i]))?target[i]:{} target[i] = extend(target[i],item[i]) }else if(isArray(item[i])){ //修正數據 target[i] = (target[i] && isArray(target[i]))?target[i]:[]; target[i] = extend(target[i],item[i]) }else{ //基本類型直接賦值 target[i] = item[i] } } } //其餘類型直接忽略 }) return target }
此時引用類型克隆出來的對象就是徹底獨立的對象了,源對象修改屬性不會影響到克隆的對象對象
var obj1 = {a: {b: 1}}; var obj2 = extend({}, obj1) obj1.a.b = 2; obj2.a.b // 1
能夠合併 對象與對象,數組與數組,對象與數組等內存
時間戳是同樣的,有時須要根據需求輸出不同格式的時間形式get
/*@param date 時間戳*/ /*@param format 時間格式*/ function dateFormat(date,format){ if(!format || typeof format !== 'string'){ console.error('format is undefiend or type is Error'); return ''; } date = date instanceof Date? date : (typeof date === 'number'|| typeof date === 'string')? new Date(date): new Date(); //解析 var formatReg = { 'y+': date.getFullYear(), 'M+': date.getMonth()+1, 'd+': date.getDate(), 'h+': date.getHours(), 'm+': date.getMinutes(), 's+': date.getSeconds() } for(var reg in formatReg){ if(new RegExp(reg).test(format)){ var match = RegExp.lastMatch; format = format.replace(match, formatReg[reg]< 10 ? '0'+formatReg[reg]: formatReg[reg].toString() ); } } return format; }
這樣,把你想要的時間的格式和時間戳傳入便可。string
dateFormat(new Date().getTime(),'yyyy-MM-dd hh:mm:ss') dateFormat(new Date().getTime(),'MM-dd-yy hh:mm:ss') ...