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