打算寫一個前端面試系列的知識,博客很久沒有進行更新,更新的都是一些的基礎知識。
最近在投簡歷進行面試,說是面試,其實就是一個自己的使用自己大白話的知識概括吧。歡迎感興趣的小伙伴進行學習或者提出建議和改正!
大概計划章節如下
1-1 關於面試題
2-1 變量類型和計算-變量類型
2-2 變量類型和計算-強制類型轉換
2-3 變量計算-理解json
2-4 原型和構造函數-構造函數
2-5 原型和構造函數-原型規則
2-6 原型和構造函數-原型鏈
3-1 作用域和閉包-變量提升
3-2 作用域和閉包-this
3-3 作用域和閉包-作用域
3-4 作用域和閉包-閉包
4-1 異步和單線程-異步
4-2 異步和單線程-單線程
5-1 日期常用API
5-2 數組常用API
5-3 undefined和null
1-1 關於面試題
關於面試,雖然我個人還在面試過程當中,但是我有抽空看一點點的題目。我覺得認為萬變不離其宗,基礎知識把握好,題目做起來就不會錯得那么難看哈哈哈。
看到題目,1:看考點;2:知識點;3:擴展;
2-1 變量類型和計算-變量類型(按存儲方式區分類型)
變量類型分為:值類型和引用類型
基本數據類型(值類型)分為:undefined,null,number,boolean,string.
引用類型分為:對象、數組、函數等
兩者之間的區別在於:值類型每個變量的儲存各自的值不會相互影響,不可以添加屬性和方法。而引用類型剛好相反
值類型簡單代碼演示
var a = 100; var b = a; a = 200; console.log(b)//100
引用類型代碼演示
var a = {age:20};//a賦值對象 var b = a;//b的指針指向a b.age = 21; console.log(a.age)//21
使用typeof可以進行檢測值類型和函數,但是引用類型的對象數組區分不出來,也可以用instanceof指定類型對象來檢測
推薦文章:https://segmentfault.com/a/1190000008472264
2-2 變量類型和計算-強制類型轉換:變量的計算會導致類型的強制轉換
變量的計算大概有以下幾種:
1、字符串的拼接:
以下代碼輸出的結果是什么
console.log(1+'2'+'2');//122 console.log(1++'2'+'2');//1++'2'變成1+2,等於3拼接成為32 console.log('A'-'B'+'2');//NAN加上拼接的字符2 結果為NAN2 console.log('A'-'B'+2);//前面是NAN,后面是加法運算+2。運算操作中其中一個為NAN則整體為NAN
2、== 運算符
什么時候用==,什么時候用===
==值相等,===完全相等(包括類型);
if (obj.a==null){ //相當於obj.a==null||obj.a===undefined的簡寫形式 //這個是jquery源碼推薦的寫法 }
3、if語句
var b = 100; if(b){ //此處的b強制轉換成布爾類型 }
4、邏輯運算符號
console.log(10&&0);//0; console.log("||'abc'");//||'abc'; console.log(!window.abc);//true; var a = 100; console.log(!!a);//兩個!!則是true
2-3 變量計算-理解json
json在js中是對象和數組,常用的json就是將json轉換成字符串,字符串轉換成對象。
json是一種數據交換的文本格式,目的是取代繁重的xml
json常用Api:
json.stringify({a:10,b:20}); //json轉換成字符串 json.parse('{"a":10,"b":20}') //字符串轉換成json
推薦文章:http://blog.csdn.net/qq_32528231/article/details/52783210
2-4 原型和構造函數-構造函數
什么是構造函數?
普通函數要創建一類對象時,就被稱為構造函數,也叫構造器。new fn()的形式創建,new對象的過程也克隆了obj.prototype對象
function Foo(){ //建議構造函數首字母大寫 this.name = 20; } var Foo2 = new Foo; console.log(Foo2.name);//20
函數的創建方式
fn();//不報錯 function fn(){ //函數聲明式,定義在哪都能調用 } fn1();//報錯 var fn1 = function(){ //函數表達式,繼承的是變量,調用只能在定義后面 }
2-5 原型和構造函數(constructor)-原型規則
1、所有引用類型,_proto_屬性值指向它的構造函數的prototype屬性值:
obj._proto_ === object.prototype;
Fn.prototype.constructor === Fn:
instanceof方法可以判斷引用類型屬於哪個構造函數的方法,判斷變量是否是數組類型。
2、可擴展性
推薦文章:https://www.cnblogs.com/pompey/p/6675559.html
極力推薦,配合文章中的代碼實戰更為清晰
2-6 原型和構造函數-原型鏈
原型鏈:是一種行為委托機制。
配合__proto__指向的鏈路從下往上尋找,找不到就是unefined
一個原型鏈繼承的例子。【注意修改id,此處演示id為div1】
function Elem(id){ this.elem = document.getElementById(id) }; Elem.prototype.html = function(val){ var elem = this.elem; if (val){ elem.innerHTML = val; return this; }else { return elem.innerHTML } } var div1 = new Elem('div1'); div1.html('<p> hello </p>');
new 一個對象的過程
創建、this指向、執行對this賦值、返回this
3-1 作用域和閉包-變量提升
一個變量,在局部作用域的級別優先於全局作用域
自由變量:即當前作用域沒有定義的變量
var a = 250; function fn(){ var b = 100; console.log(a);//自由變量 console.log(b); } fn(); //250 //100
換一種情況
var a = 250; function fn(){ console.log(a);//自由變量,變量在局部得到提升,還未賦值狀態 var a = 100;//得到提升 console.log(a); } fn(); //undefined //100
以上另一種情況的代碼演示,就叫做提升自由變量
3-2 作用域和閉包-this
this在執行時才能確認值,定義時無法確認
擴展認識:
call、apply、bind綁定this指向。這其中最常用的是call
function fn1(name,age){ alert(name); console.log(this); } fn1.call({x:100},'zhangsan',20); //彈出“zhangsan” //this指向{x: 100}
3-3 作用域和閉包-作用域
分為局部作用域和全局作用域。局部同名變量優先級高於同名全局變量。js沒有塊級作用域
作用域鏈:自由變量從下往上往父類進行查找是否存在這個屬性。這個一整個的過程就是作用域鏈
3-4 作用域和閉包-閉包
內部函數能引用外部函數中的變量,和作用域鏈密不可分,存儲私有屬性,封裝變量。
4-1 異步和單線程-異步
js是單線程,異步和單線程是相輔相成的。
單線程就意味着不能同時做兩件事,而同步會阻塞代碼的運行,所以只能排隊。而異步就是個插隊的。
什么時候會用到異步?
需要進行耗時較長的操作都會用到異步。比如網絡請求ajax、動態<img>加載等
4-2 異步和單線程-單線程
單線程一次只能完成一件事,其余的任務都得排隊按順序完成,前一個完成了才能進行下一個
5-1 日期常用API
getTime();//毫秒數 getFullYear();//年 getMonth();//月 (0~11)要+1 getDate();//日 getHours();//小時 getMinutes();//分鍾 getSeconds();//秒 Date.now();//當前時間毫秒數 new Date();//當前時間
5-2數組常用API
forEach:遍歷
every:判斷所有元素是否都符合條件
some:判斷是否至少有一個元素符合條件
map:重新組裝數組元素
filter:過濾符合條件的元素
sort:排序(從小到大、從大到小)
5-3 undefined和null
var a = undefined; var b = null; a == b;//true a === b;//true
以上代碼顯示出null和undefined的行為非常相似
但是根據用法來說
null表示“沒有對象“的意思,就是此處不應該有值
undefined表示”缺少值“,就是此處應該有值,但是還沒有定義
null常用情況
作為參數,表示這個參數不是對象
作為原型鏈的終點
undefined常用情況
變量聲明了,沒有賦值
調用函數時,沒有提供該有的參數,該參數為undefined
對象沒賦值屬性,屬性值為undefined
函數沒返回值時,默認返回undefined