String(obj){
return 1、javascript中如何檢測一個變量是String類型?
方法一:typeof()
function isString(obj){
return typeof(obj) === "string" ? true : false;
}
方法二:
function isString(obj){
return obj.constructor === String ? true :false;
}
方法三:
faunction is
Object.prototype.toString.call(obj)==="[Object String]" ? true : false;
}
2、用js去除字符串空格
- 方法一:使用replace正則匹配的方法
- 去掉所有空格:str = str.replace(/\s*/g,"");
- 去掉兩側空格:str = str.replace(/^\s*|\s*$/g,"");
- 去掉左空格 : str = str.replace(/^\s*,"");
- 去掉右側空格:str = str.replace(/(\s*$)/g,"");
- 方法二:使用str.trim()方法
- 侷限性:無法去除中間空格
- 去掉右側空格:str.trimRight();
- 去掉左側空格:str.trimLeft();
- 方法三:使用jquery,$.trim(str)方法
- 侷限性:無法去除中間空格
3、js字符串操作函數
- concat() – 將兩個或多個字符的文本組合起來,返回一個新的字符串。
- indexOf() – 返回字符串中一個子串第一處出現的索引。如果沒有匹配項,返回 -1 。
- charAt() – 返回指定位置的字符。
- lastIndexOf() – 返回字符串中一個子串最後一處出現的索引,如果沒有匹配項,返回 -1 。
- match() – 檢查一個字符串是否匹配一個正則表達式。
- substr() 函數 -- 返回從string的startPos位置,長度爲length的字符串
- substring() – 返回字符串的一個子串。傳入參數是起始位置和結束位置。
- slice() – 提取字符串的一部分,並返回一個新字符串。
- replace() – 用來查找匹配一個正則表達式的字符串,然後使用新字符串代替匹配的字符串。
- search() – 執行一個正則表達式匹配查找。如果查找成功,返回字符串中匹配的索引值。否則返回 -1 。
- split() – 通過將字符串劃分成子串,將一個字符串做成一個字符串數組。
- length – 返回字符串的長度,所謂字符串的長度是指其包含的字符的個數。
- toLowerCase() – 將整個字符串轉成小寫字母。
- toUpperCase() – 將整個字符串轉成大寫字母。
4、添加、移除、移動、複製、創建和查找節點
- 創建新節點
- createDocumentFragment() 創建一個DOM片段
- createElement() 創建一個具體的元素
- createTextNode() 創建一個文本節點
- 添加、移除、替換、插入
- appendChild() 添加
- removeChild() 移除
- replaceChild() 替換
- insertChild() 插入
- 查找
- getElementsByTagName()通過標籤查找
- getElementsByName()通過元素的Name屬性的值
- getElementById() 通過元素ID 唯一性
5、比較typeof與instanceof
- typeof的定義和用法:返回一個字符串,用來說明變量的數據類型。
- typeof一般只能返回幾個結果:number,boolean,string,function,object,undefined.
- typeof來獲取一個變量是否存在
- 對於 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的侷限性。
- Instanceof定義和用法:instanceof 用於判斷一個變量是否屬於某個對象的實例。
6、閉包:
- 定義和用法:當一個函數的返回值是另外一個函數,而返回的那個函數如果調用了其父函數內部的其它變量,如果返回的這個函數在外部被執行,就產生了閉包。
- 表現形式:使函數外部能夠調用函數內部定義的變量。
- 變量的作用域
理解閉包,首先必須理解Javascript特殊的變量作用域。
變量的作用域分類:全局變量和局部變量。
特點:
1、函數內部可以讀取函數外部的全局變量;在函數外部無法讀取函數內的局部變量。
2、函數內部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明瞭一個全局變量!
- 使用閉包的注意點
- 濫用閉包,會造成內存泄漏:由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
- 會改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。
7、跨域:
由於瀏覽器同源策略,凡是發送請求url的協議、域名、端口之間任意一個與當前地址不同即爲跨域。
存在跨域的情況:
- 網絡協議不同
- 端口不同
- 域名不同
- 子域名不同
- 域名和與域名對應ip
跨域請求資源的方法
- proxy代理
- 定義和用法:proxy代理用於將發送給後臺服務器,通過服務器來發送請求,然後將請求的結果傳遞給前端。
- 實現方法:通過nginx代理
- 注意點:如果你的代理是https協議的請求,那麼你的proxy首先要信任該證書(尤其是自定義證書)或者忽略證書檢查,否則你的請求無法成功。
- CORS 【Cross-Origin Resource Sharing】
- 定義和用法:是現代瀏覽器支持跨域資源請求的一種最常用的方式。
- 使用方法:一般需要後端人員在處理請求數據的時候,添加允許跨域的相關操作。
- jsonp
- 定義和用法:通過動態插入一個script標籤。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面後會立即執行(沒有阻塞的情況下)。
- 特點:通過情況下,通過動態創建script來讀取他域的動態資源,獲取的數據一般爲json格式。
- 缺點:
1、這種方式無法發送post請求
2、另外要確定jsonp的請求是否失敗並不容易,大多數框架的實現都是結合超時時間來判定。
8、圾回收機制方式及內存管理
- 回收機制方式
- 定義和用法:垃圾回收機制(GC:Garbage Collection),執行環境負責管理代碼執行過程中使用的內存。
- 原理:垃圾收集器會定期(週期性)找出那些不在繼續使用的變量,然後釋放其內存。但是這個過程不是實時的,因爲其開銷比較大,所以垃圾回收器會按照固定的時間間隔週期性的執行。
- 垃圾回收策略:標記清除(較爲常用)和引用計數。
- 標記清除:
- 定義和用法:當變量進入環境時,將變量標記"進入環境",當變量離開環境時,標記爲:"離開環境"。某一個時刻,垃圾回收器會過濾掉環境中的變量,以及被環境變量引用的變量,剩下的就是被視爲準備回收的變量。
- 目前爲止,IE、Firefox、Opera、Chrome、Safari的js實現使用的都是標記清除的垃圾回收策略或類似的策略,只不過垃圾收集的時間間隔互不相同。
- 引用計數:
- 定義和用法:引用計數是跟蹤記錄每個值被引用的次數。
- 基本原理:就是變量的引用次數,被引用一次則加1,當這個引用計數爲0時,被視爲準備回收的對象。
- 標記清除:
- 內存管理
1、什麼時候觸發垃圾回收?
垃圾回收器週期性運行,如果分配的內存非常多,那麼回收工作也會很艱鉅,確定垃圾回收時間間隔就變成了一個值得思考的問題。
IE6的垃圾回收是根據內存分配量運行的,當環境中的變量,對象,字符串達到一定數量時觸發垃圾回收。垃圾回收器一直處於工作狀態,嚴重影響瀏覽器性能。
IE7中,垃圾回收器會根據內存分配量與程序佔用內存的比例進行動態調整,開始回收工作。
2、合理的GC方案:(1)、遍歷所有可訪問的對象; (2)、回收已不可訪問的對象。
3、GC缺陷:(1)、停止響應其他操作;
4、GC優化策略:(1)、分代回收(Generation GC);(2)、增量GC
9、開發過程中遇到的內存泄露情況,如何解決的
- 定義和用法:內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。C#和Java等語言採用了自動垃圾回收方法管理內存,幾乎不會發生內存泄露。我們知道,瀏覽器中也是採用自動垃圾回收方法管理內存,但由於瀏覽器垃圾回收方法有bug,會產生內存泄露。
- 內存泄露的幾種情況:
- 當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內存泄露。
- 由於是函數內定義函數,並且內部函數--事件回調的引用外暴了,形成了閉包。閉包可以維持函數內局部變量,使其得不到釋放。
10、javascript面向對象中繼承實現
- 面向對象的基本特徵有:封閉、繼承、多態。
- 在JavaScript中實現繼承的方法:
- 原型鏈(prototype chaining)
- call()/apply()
- 混合方式(prototype和call()/apply()結合)
- 對象冒充
11、數組方法及屬性
方法:
- arr.flat();數組扁平化
flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數組,可以將flat()方法的參數寫成一個整數,表示想要拉平的層數,默認爲1。
- concat() 連接兩個或更多的數組,並返回結果。
- join() 把數組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。
- pop() 刪除並返回數組的最後一個元素。
- shift() 刪除並返回數組的第一個元素
- push() 向數組的末尾添加一個或更多元素,並返回新的長度。
- unshift() 向數組的開頭添加一個或更多元素,並返回新的長度。
- reverse() 顛倒數組中元素的順序。
- slice() 從某個已有的數組返回選定的元素
- sort() 對數組的元素進行排序
- splice() 刪除元素,並向數組添加新元素。
語法:arrayObject.splice(index,howmany,item1,.....,itemX)
index:必需。整數,規定添加/刪除項目的位置,使用負數可從數組結尾處規定位置。
howmany:必需。要刪除的項目數量。如果設置爲 0,則不會刪除項目。
item1, ..., itemX:可選。向數組添加的新項目。
- toSource() 返回該對象的源代碼。
只有 Gecko 核心的瀏覽器(比如 Firefox)支持該方法,也就是說 IE、Safari、Chrome、Opera 等瀏覽器均不支持該方法。
- toString() 把數組轉換爲字符串,並返回結果。
- toLocaleString() 把數組轉換爲本地數組,並返回結果。
- valueOf() 返回數組對象的原始值
12、數組去重
let arr1=[1,2,3,4,5,6];
let arr2 = [2,3,6,7,8,10] ;
let newArr = […new Set([…arr1,arr2])].sort();
13、求數組最值
最大值:Math.max.apply(null,arr); |
|
最小值:Math.min.apply(null,arr); |
|
14、數組排序
冒泡排序:即實現數組由小到大進行排序;思路爲:每次比較相鄰的兩個數,如果後一個比前一個小,換位置。如果要實現由大到小排序,使用reverse()即可;
var arr = [3, 1, 4, 6, 5, 7, 2];
function bubbleSort(arr) {
var len = arr.length;
for (var i = len; i >= 2; --i) {
for (var j = 0; j < i - 1; j++) {
if (arr[j + 1] < arr[j]) {
var temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr2 = bubbleSort(arr);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7]
var arr3 = arr2.reverse();
console.log(arr3); // [7, 6, 5, 4, 3, 2, 1]
快速排序:
思路:採用二分法,取出中間數,數組每次和中間數比較,小的放到左邊,大的放到右邊。
var arr = [3, 1, 4, 6, 5, 7, 2];
function quickSort(arr) {
if(arr.length == 0) {
return []; // 返回空數組
}
var cIndex = Math.floor(arr.length / 2);
var c = arr.splice(cIndex, 1);
var l = [];
var r = [];
for (var i = 0; i < arr.length; i++) {
if(arr[i] < c) {
l.push(arr[i]);
} else {
r.push(arr[i]);
}
}
return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr));
//[1, 2, 3, 4, 5, 6, 7]
15、數組翻轉(非reverse())
方法一:
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length) {
var num = arr.pop(); //刪除數組最後一個元素並返回被刪除的元素
arr2.push(num);
}
console.log(arr2);
// [4, 3, 2, 1]
方法二:
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length){
var num = arr.shift(); //刪除數組第一個元素並返回被刪除的元素
arr2.unshift(num);
}
console.log(arr2);