實用小方法

是否相等
Object.is(a, b) // 判斷兩個值是否完全相等赎瑰,比===強在+0-0羊瘩,NaN的判斷
對象淺拷貝
Object.assign(target, o2, o3, o4) // 將o234合并到target對象上俩檬,同名屬性替換
利用Set去重
[...new Set([1,2,3,4,5,5,5,5])]
返回去除小數(shù)后的值,等于1.111 | 0
Math.trunc(1.111) //1纲熏, 
判斷一個數(shù)是正數(shù)還是負數(shù),-1負數(shù)妆丘,0,-0局劲,其他值反水NaN
Matn.sign(1.111) // +1飘痛,
遍歷鍵名,arr.keys()
var arr = ['a', 'b' ,'c' ,'d']
for(let index of arr.keys()) {
    console.log(index)
}
遍歷值容握,arr.values()
var arr = ['a', 'b' ,'c' ,'d']
for(let index of arr.values()) {
    console.log(index)
}
遍歷鍵值對宣脉,arr.entries()
var arr = ['a', 'b' ,'c' ,'d']
for(let index of arr.entries()) {
    console.log(index)
}
是否包含某個值
[1, 2, 3].includes(2) // true
檢測是否含有
s.has(2) // 返回true/false
判斷是否是數(shù)字
const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n;
EXAMPLE:
validateNumber('10'); // true
轉(zhuǎn)化金額格式
const toDecimalMark = num => num.toLocaleString('en-US');
EXAMPLE:
toDecimalMark(12305030388.9087); // "12,305,030,388.909"
四舍五入并指定位數(shù)
const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);
EXAMPLE:
round(1.005, 2); // 1.01
字符串轉(zhuǎn)化成數(shù)組形式
const words = (str, pattern = /[^a-zA-Z-]+/) => str.split(pattern).filter(Boolean);
EXAMPLE:
words('I love javaScript!!'); // ["I", "love", "javaScript"]
words('python, javaScript & coffee'); // ["python", "javaScript", "coffee"]
限制字符長度,超出末尾顯示...
const truncateString = (str, num) =>
  str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str;
EXAMPLE:
truncateString('boomerang', 7); // 'boom...'
只展示部分末尾字段剔氏,其余用符號隱藏
const mask = (cc, num = 4, mask = '*') => `${cc}`.slice(-num).padStart(`${cc}`.length, mask);
EXAMPLE:
mask(1234567890); // '******7890'
mask(1234567890, 3); // '*******890'
mask(1234567890, -4, '$'); // '$$$$567890'
挑選出對象中需要的key/value
const pick = (obj, arr) =>
  arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
EXAMPLE:
pick({ a: 1, b: '2', c: 3 }, ['a', 'c']); // { 'a': 1, 'c': 3 }
重置修改對象的某個指定的key
const renameKeys = (keysMap, obj) =>
  Object.keys(obj).reduce(
    (acc, key) => ({
      ...acc,
      ...{ [keysMap[key] || key]: obj[key] }
    }),
    {}
  );
EXAMPLE:
const obj = { name: 'Bobo', job: 'Front-End Master', shoeSize: 100 };
renameKeys({ name: 'firstName', job: 'passion' }, obj); // { firstName: 'Bobo', passion: 'Front-End Master', shoeSize: 100 }
雙層嵌套數(shù)組轉(zhuǎn)化對象格式
const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]);
const objectFromPairs = arr => arr.reduce((a, [key, val]) => ((a[key] = val), a), {});
EXAMPLE:
objectToPairs({ a: 1, b: 2 }); // [ ['a', 1], ['b', 2] ]
objectFromPairs([['a', 1], ['b', 2]]); // {a: 1, b: 2}
對比兩個對象值塑猖,并進行合并
const merge = (...objs) =>
  [...objs].reduce(
    (acc, obj) =>
      Object.keys(obj).reduce((a, k) => {
        acc[k] = acc.hasOwnProperty(k) ? [].concat(acc[k]).concat(obj[k]) : obj[k];
        return acc;
      }, {}),
    {}
  );
EXAMPLE:
const object = {
  a: [{ x: 2 }, { y: 4 }],
  b: 1
};
const other = {
  a: { z: 3 },
  b: [2, 3],
  c: 'foo'
};
merge(object, other); // { a: [ { x: 2 }, { y: 4 }, { z: 3 } ], b: [ 1, 2, 3 ], c: 'foo' }
對比對象的value是否一樣
const equals = (a, b) => {
  if (a === b) return true;
  if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();
  if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) return a === b;
  if (a.prototype !== b.prototype) return false;
  let keys = Object.keys(a);
  if (keys.length !== Object.keys(b).length) return false;
  return keys.every(k => equals(a[k], b[k]));
};
EXAMPLE:
equals({ a: [2, { e: 3 }], b: [4], c: 'foo' }, { a: [2, { e: 3 }], b: [4], c: 'foo' }); // true
獲取URL參數(shù)
const getURLParameters = url =>
  (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
    (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),
    {}
  );
EXAMPLE:
getURLParameters('http://url.com/page?name=Adam&surname=Smith'); // {name: 'Adam', surname: 'Smith'}
getURLParameters('google.com'); // {}
復(fù)制內(nèi)容到剪貼板
const copyToClipboard = str => {
  const el = document.createElement('textarea');
  el.value = str;
  el.setAttribute('readonly', '');
  el.style.position = 'absolute';
  el.style.left = '-9999px';
  document.body.appendChild(el);
  const selected =
    document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;
  el.select();
  document.execCommand('copy');
  document.body.removeChild(el);
  if (selected) {
    document.getSelection().removeAllRanges();
    document.getSelection().addRange(selected);
  }
};

vue 瀏覽器打印事件
printLink(){
    var el = document.getElementById("printEventName");
    var iframe = document.createElement('IFRAME');
    var doc = null;
    iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
    document.body.appendChild(iframe);
    doc = iframe.contentWindow.document;
    doc.write('<style type="text/css"></style><div>' + el.innerHTML + '</div>');
    doc.close();
    iframe.contentWindow.focus();
    iframe.contentWindow.print();
    if (navigator.userAgent.indexOf("MSIE") > 0){document.body.removeChild(iframe);}
}
JavaScript通用日期時間格式化方法
function dateFormat(val, format) {
  let date = new Date(val)
  let o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小時
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds(), // 毫秒
  }
  if (/(y+)/.test(format)) {
    format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  }
  for (var k in o) {
    if (new RegExp(`(${k})`).test(format)) {
      format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
    }
  }
  return format
}
栗子:
var datetime = new Date().getTime()
var date1 = dateFormat(datetime, 'yyyy.MM.dd hh:mm:ss')
var date2 = dateFormat(datetime, 'yyyy-MM-dd hh:mm:ss')
var date3 = dateFormat(datetime, 'yyyy-MM-dd')
console.log(date1) // 2018.04.27 16:38:35
console.log(date2) // 2018-04-27 16:38:35
console.log(date3) // 2018-04-27
光標(biāo)所在位置插入字符,并設(shè)置光標(biāo)位置

@param {dom} 輸入框
@param {val} 插入的值
@param {posLen} 光標(biāo)位置處在 插入的值的哪個位置

setCursorPosition (dom,val,posLen) {
    var cursorPosition = 0;
    if(dom.selectionStart){
        cursorPosition = dom.selectionStart;
    }
    this.insertAtCursor(dom,val);
    dom.focus();
    console.log(posLen)
    dom.setSelectionRange(dom.value.length,cursorPosition + (posLen || val.length));
}
光標(biāo)所在位置插入字符
insertAtCursor(dom, val) {
    if (document.selection){
        dom.focus();
        sel = document.selection.createRange();
        sel.text = val;
        sel.select();
    }else if (dom.selectionStart || dom.selectionStart == '0'){
        let startPos = dom.selectionStart;
        let endPos = dom.selectionEnd;
        let restoreTop = dom.scrollTop;
        dom.value = dom.value.substring(0, startPos) + val + dom.value.substring(endPos, dom.value.length);
        if (restoreTop > 0){
            dom.scrollTop = restoreTop;
        }
        dom.focus();
        dom.selectionStart = startPos + val.length;
        dom.selectionEnd = startPos + val.length;
    } else {
        dom.value += val;
        dom.focus();
    }
}
判斷是否滾動到最低
const bottomVisible = () =>
  document.documentElement.clientHeight + window.scrollY >=
  (document.documentElement.scrollHeight || document.documentElement.clientHeight);
EXAMPLE:
bottomVisible(); // true
獲取當(dāng)前滾動位置
const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});
EXAMPLE:
getScrollPosition(); // {x: 0, y: 200}
滾動到頂部
const scrollToTop = () => {
  const c = document.documentElement.scrollTop || document.body.scrollTop;
  if (c > 0) {
    window.requestAnimationFrame(scrollToTop);
    window.scrollTo(0, c - c / 8);
  }
};
EXAMPLE:
scrollToTop();
獲取明天的日期
const tomorrow = () => {
  let t = new Date();
  t.setDate(t.getDate() + 1);
  return t.toISOString().split('T')[0];
};
EXAMPLE:
tomorrow(); // 2018-10-19 (if current date is 2018-10-18)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谈跛,一起剝皮案震驚了整個濱河市羊苟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌感憾,老刑警劉巖蜡励,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阻桅,居然都是意外死亡凉倚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門嫂沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稽寒,“玉大人,你說我怎么就攤上這事趟章⌒硬冢” “怎么了慎王?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宏侍。 經(jīng)常有香客問我赖淤,道長,這世上最難降的妖魔是什么谅河? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任咱旱,我火速辦了婚禮,結(jié)果婚禮上旧蛾,老公的妹妹穿的比我還像新娘。我一直安慰自己蠕嫁,他們只是感情好锨天,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剃毒,像睡著了一般病袄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赘阀,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天益缠,我揣著相機與錄音,去河邊找鬼基公。 笑死幅慌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轰豆。 我是一名探鬼主播胰伍,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酸休!你這毒婦竟也來了骂租?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斑司,失蹤者是張志新(化名)和其女友劉穎渗饮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宿刮,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡互站,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵缺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片云茸。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谤饭,靈堂內(nèi)的尸體忽然破棺而出标捺,到底是詐尸還是另有隱情懊纳,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布亡容,位于F島的核電站嗤疯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闺兢。R本人自食惡果不足惜茂缚,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋谭。 院中可真熱鬧脚囊,春花似錦、人聲如沸桐磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽我擂。三九已至衬以,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間校摩,已是汗流浹背看峻。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衙吩,地道東北人互妓。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像坤塞,于是被迫代替她去往敵國和親车猬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容