判斷變量是否為undefined
typeof variable === "undefined"
判斷變量是否為null
variable === null
最快速給數(shù)值加入千位分隔符
(123456.789).toLocaleString()
// 輸出 "123,456.789",常用。
(1234566).toLocaleString('zh-Hans-CN-u-nu-hanidec');
// 輸出"一,二三四,五六六"
(1234566).toLocaleString('zh-Hans-CN-u-nu-hanidec',{useGrouping: true});
// 給.toLocaleString()加第二個(gè)參數(shù),依然輸出"一,二三四,五六六"
(1234566).toLocaleString('zh-Hans-CN-u-nu-hanidec',{useGrouping: false});
// 輸出"一二三四五六六",這個(gè)比較有用,也就是最簡(jiǎn)單的將阿拉伯?dāng)?shù)字變成漢字的辦法。
字符串變數(shù)字
僅適用于字符串只包含數(shù)字的情況
var a = '33433';
var b = + a;
b; // 33433
數(shù)字變字符串
var a = 33433;
var b = a + '';
b; // '33433'
任何變量和字面量變布爾值
!!'d32a'; // true
var a = 0;
!!a; // false
利用a標(biāo)簽解析URL字符串
隨便給你一個(gè)復(fù)雜的URL字符串,你怎么解析它的每一部分?用復(fù)雜的正則匹配?No。在JS代碼里先創(chuàng)建一個(gè)a標(biāo)簽然后將需要解析的URL賦值給a的href屬性,然后就得到了一切我們想要的了。
var a = document.createElement('a');
a.;
console.log(a.host); // www.cnblogs.com
擴(kuò)展一下就得到了一個(gè)更加健壯的解析URL各部分的通用方法了。下面代碼來(lái)自James的博客:
function parseURL(url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':',''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function(){
var ret = {},
seg = a.search.replace(/^\?/,'').split('&'),
len = seg.length, i = 0, s;
for (;i<len;i++) {
if (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
hash: a.hash.replace('#',''),
path: a.pathname.replace(/^([^\/])/,'/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
segments: a.pathname.replace(/^\//,'').split('/')
};
}
Array.prototype.slice方法把類(lèi)數(shù)組對(duì)象轉(zhuǎn)換為真·數(shù)組
數(shù)組的 slice 方法通常用來(lái)從一個(gè)數(shù)組中抽取片斷。但這個(gè)方法還可以用來(lái)將“類(lèi)數(shù)組”元素(比如 arguments 參數(shù)列表、節(jié)點(diǎn)列表和屬性列表)轉(zhuǎn)換成真正的數(shù)組:
var nodesArr = Array.prototype.slice.call(document.querySelectorAll("div"));
// 得到一個(gè)由 div 元素組成的“真正的”數(shù)組
var argsArr = Array.prototype.slice.call(arguments);
// 把 arguments 轉(zhuǎn)換成一個(gè)“真正的”數(shù)組
你還可以使用一次簡(jiǎn)單的 slice 調(diào)用來(lái)克隆一個(gè)數(shù)組:
var clone = myArray.slice(); // 數(shù)組的淺克隆
向數(shù)組最前、最后追加元素,你以為用哪個(gè)方法?
案例1:向最后追加數(shù)組,通常我們知道用push
var arr = [1,2,3,4,5];
arr.push(6);
其實(shí)有比push更快的方法:
var arr = [1,2,3,4,5];
arr[arr.length] = 6;
也就是說(shuō),就算計(jì)算一次arr的長(zhǎng)度,這種方法依然比push快。實(shí)際工作中應(yīng)該采用arr[arr.length] = 6;,除非你的同事或者上司認(rèn)為你很蠢,而你又懶得爭(zhēng)辯。
案例2:向數(shù)組最前追加元素,通常我們用unshift()
var arr = [1,2,3,4,5];
arr.unshift(0);
但更快的方法是
var arr = [1,2,3,4,5];
[0].concat(arr);
unshift()方法是跟shift()方法對(duì)立的,表示在最前追加一個(gè)元素。實(shí)際工作中,看你的具體情況,如果你的原始數(shù)組不用保留,就用unshift()方法,雖然它慢但是也是常規(guī)的方法。如果你的原始數(shù)組必須保留,那么就用[0].concat(arr)方法。
用splice() 方法向/從數(shù)組中添加/替換/刪除項(xiàng)目
其實(shí)splice()方法并不是什么“奇技淫巧”,但是很多人不一定能全面了解它的所有用法。
該方法直接對(duì)原始數(shù)組操作,會(huì)改變?cè)紨?shù)組。
語(yǔ)法
arrayObject.splice(index,howmany,item1,.....,itemX)
參數(shù) 描述
index 必需。整數(shù),規(guī)定添加/刪除項(xiàng)目的位置,使用負(fù)數(shù)可從數(shù)組結(jié)尾處規(guī)定位置。
howmany 必需。要?jiǎng)h除的項(xiàng)目數(shù)量。如果設(shè)置為 0,則不會(huì)刪除項(xiàng)目。
item1, ..., itemX 可選。向數(shù)組添加的新項(xiàng)目。
返回值
類(lèi)型 描述
Array 包含被刪除項(xiàng)目的新數(shù)組,如果有的話。
說(shuō)明
splice() 方法可刪除從 index 處開(kāi)始的零個(gè)或多個(gè)元素,并且用參數(shù)列表中聲明的一個(gè)或多個(gè)值來(lái)替換那些被刪除的元素。
案例1:在中央添加一個(gè)元素。由于不刪除元素,所以howmany值為0。
var items = ['one', 'two', 'three', 'four'];
items.splice(items.length / 2, 0, 'hello');
items;
案例2:替換倒數(shù)第二個(gè)和倒數(shù)第一個(gè)元素。所以howmany值為2。
var items = ['one', 'two', 'three', 'four'];
items.splice(-2, 2, 'hello','world');
items;
案例3:刪除倒數(shù)第三個(gè)元素。howmany值為1。item1不填。
var items = ['one', 'two', 'three', 'four'];
items.splice(-3, 1);
items;
Array.prototype.sort 方法
你不僅可以對(duì)簡(jiǎn)單類(lèi)型的數(shù)組項(xiàng)進(jìn)行排序,可以通過(guò)屬性來(lái)排序?qū)ο髷?shù)組。這對(duì)處理服務(wù)器傳來(lái)的對(duì)象數(shù)組非常有用。
[
{ name: "Robin Van PurseStrings", age: 30 },
{ name: "Theo Walcott", age: 24 },
{ name: "Bacary Sagna", age: 28 }
].sort(function(obj1, obj2) {
// 增序排列:前者的 age 小于后者
return obj1.age - obj2.age;
});
用 length 屬性來(lái)截?cái)鄶?shù)組或清空數(shù)組
截?cái)鄶?shù)組比slice要快,清空數(shù)組更是最最佳的方法。
var myArray = yourArray = [1, 2, 3];
myArray.length = 2;
yourArray; // [1, 2]
myArray; // [1, 2]
使用Array.prototype.push.apply()來(lái)合并對(duì)象+數(shù)組
合并多個(gè)數(shù)組的常用方法是.concat(),但是,Array.prototype.push.apply()有一點(diǎn)特性是.concat()做不到的,就是把數(shù)組中的元素合并到對(duì)象中。如果不需要這個(gè)length屬性,可以delete它。
var mergeTo = {a:4,b:5};
var mergeFrom = [7,8,9];
Array.prototype.push.apply(mergeTo, mergeFrom);
mergeTo;
// 得到:Object {0: 7, 1: 8, 2: 9, a: 4, b: 5, c: 6, length: 3}
也就是說(shuō),將數(shù)組合并到對(duì)象中,數(shù)組會(huì)先被視為對(duì)象,然后執(zhí)行合并。而且,對(duì)象中會(huì)多出一個(gè)length屬性,它的值就是原對(duì)象的屬性個(gè)數(shù)。
但是,不要以為Array.prototype.push.apply()能合并兩個(gè)對(duì)象。
高效探測(cè)功能特性和對(duì)象屬性的辦法
if(navigator.geolocation) {
// ...
}
不要像上面這么寫(xiě)。原因1是效率低,2是可能導(dǎo)致內(nèi)存泄露,3是如果返回假值,即使屬性是存在的,依然判斷不出這個(gè)屬性。所以應(yīng)該這么寫(xiě):
if("geolocation" in navigator) {
// 在這里干點(diǎn)事情
}
字符串的.replace()方法的第二個(gè)參數(shù)可以為函數(shù)
從手冊(cè)我們可以看到,第二個(gè)參數(shù)“規(guī)定了替換文本或生成替換文本的函數(shù)”。簡(jiǎn)單舉個(gè)例子,將某字符串里的所有@符號(hào),替換為從1開(kāi)始的自然數(shù),怎么做:
var str = 'gsfd@fdgd@rf@z@fgdfg@fdgdfsg';
var i = 0;
var a = str.replace(/@/g, function() {
return ++i;
});
a;
// 得到:gsfd1fdgd2rf3z4fgdfg5fdgdfsg
如果被替換的不是@,而是^標(biāo)記呢?這樣就可以給字符串中的每個(gè)自然段標(biāo)記1開(kāi)始的自然數(shù)了。
Math.max.apply獲取數(shù)組元素中的最大值
var arr = [1, 5, 4, 12355, 43, 123, 123, 3, 4454, 43];
var max = Math.max.apply(null, arr);
console.log(max);
max改成min可獲得最小值
var arr = [1, 5, 4, 12355, 43, 123, 123, 3, 4454, 43];
var min = Math.min.apply(null, arr);
console.log(min);
利用位運(yùn)算實(shí)現(xiàn)數(shù)字取整
var num = 5.63;
console.log(~~num); // 5
整數(shù)補(bǔ)前置0,變成類(lèi)似'00004243'的字符串
根據(jù)實(shí)際需要修改0的個(gè)數(shù)和“10”這個(gè)數(shù)字即可。
function addPreZero(numeric, requiredLength) {
return ('0000000000' + numeric).slice(10 + (numeric + '').length - requiredLength)
}
addPreZero(4545, 7);
// "0004545"
雖然看起來(lái)比較山寨,但是比起來(lái)按部就班的計(jì)算,要省很多代碼。按部就班的計(jì)算,需要先計(jì)算數(shù)值的位數(shù),然后用要求位數(shù)減去數(shù)值位數(shù),然后用'0'拼出這么多位,然后再加到這個(gè)數(shù)值的前面。