js基礎面試篇


1.typeof 只能區分值類型的,數組,對象,null都為object,function也可以識別
2. 類型裝換的情況
	- 字符串拼接
	- == 運算符
	- if語句
	- 邏輯運算符

3.js內置函數
	- OBject
	- Array
	- Boolean
	- String
	- Number
	- Function
	- Date
	- RegExp
	- Error

4.按存儲方式區分變量類型,值類型和引用類型
5.理解json --js對象 JSON.stringify({a:10} JSON.parse('{"a":"23"}')
6.原型和原型鏈
	- 判斷一個變量是數組類型
	- 寫一個原型鏈繼承的例子
	- 描述new一個對象的過程
	- zepto或其他的框架如何使用原型鏈
	- 構造函數
	- 原型規則
		- 所有的引用類型(數組,對象,函數),都具有對象特性,即可自由擴展屬性(除了null)var obj ={};obj.a="123"
		- 所有的引用類型(數組,對象,函數),都有一個__proto__屬性,屬性值是一個普通對象obj.__proto__
		- 所有的函數,都有一個prototype屬性,屬性值也是一個普通的對象 fn.prototype
		- 所有的引用類型(數組,對象,函數),__proto__屬性值指向它的構造函數的prototype屬性值obj__proto__===Object.prototype
		- 當試圖得到一個對象的某個屬性時,如果這個對象本身沒有這個屬性,那么就會去它的__proto__(即它的構造函數的prototype)中找
	- 原型鏈
		- instanceof 使用instanceof判斷一個函數是否是一個變量的構造函數
		- this指向實例本身
		- 循環對象自身的屬性 for in 瀏覽器默認會屏蔽原型的屬性  for(var item in f) {if(f.hasOwnProperty(item){是自身的屬性})}_
		- f.toString() 去 var f = new Fun(); f.__proto__找 

7.
	- 執行上下文 
		- 范圍:一段<script>或則一個函數
		- 全局:變量定義,函數聲明,一段script
		- 函數:變量定義,函數聲明,this,arguments ,函數
	- 變量提升 var a = undefined; a= 100;
	- this集中不同使用場景
		- 作為構造函數的執行 function a(name){this.name = name} var f = new a('aaa')
		- 作為對象屬性的執行 var obj ={name:'a',aaa:function(){console.log(this.name)}} obj.aaa() //this === obj
		- 作為普通函數執行 function fn(){console.log(this)} //this === window
		- call apply bind function fn1(name){console.log(name)} fn1.apply({x:1001},[100]) / fn1.call({x:1001},120) /  var aaa = function (name){console.log(name,this)}.bind({name:119}) aaa()
	- 創建10a標簽,點擊彈出對應的序號
	- 理解作用域,作用鏈
		- 沒有塊作用域
		- 只有函數和全局作用域
		- 作用域鏈一級一級往上面找
	- 實際開發中閉包作用
		- 函數作為返回值
		- 函數作為參數傳遞
		- 作用域在該函數里面找的 function a(){var b=100;return function(){console.log(b)}} var b=123; var c = a();c() //100
8.異步和單線程
	- 同步和異步
	- setTimeout
	- 前端使用異步的場景 
		- 定時任務 setTimeout setInterval
		- 網絡請求 ajax請求,動態<img>加載
		- 事件綁定
	- 單線程 --只能同時干一件事
9.日期和math
	- Date.now() //獲取當前時間毫秒值
	- d.getTime() //獲取毫秒值
	- d.getFullYear() //年
	- d.getMonth() //月(0-11)
	- d.getDate() //日 0-31
	- d.getHours() //0-59
	- d.getMinutes()  //0-59
	- d.getSeconds() //0-59
	- Math。random() //0-1 很多小數位數
10.數組api
	- forEach 遍歷所有元素 arr.forEach((item,index)=>{})
	- every 判斷所有元素是否都符合條件 arr.every((item,index)=>{ if(item <4){return true}})
	- some 判斷是否有至少一個元素符合條件 arr.some((item,index)=>{ if(item <4){return true}})
	- sort 排序 arr.sort(function(a,b){return a-b;//小到大 return b-a;//大到小})
	- map 對元素重新組裝,生成新數組 arr.map(item=>{return 'a'+item})
	- filter 過濾符合條件的元素 arr.filter(item=>{if(item>2){return true}})
11.對象api
	- for in 
	- 封裝一個對象數組能循環的forEach 簡單區分數組和對象 arr instanceOf Array 
12.js web api
	- DOM Document Object Model
		- DOM本質 xml 樹
		- DOM節點
		- DOM操作 
			- 獲取DOM節點 
				- document.getElementById
				- document.getElementsByTagName
				- divNode.length
				- divNode[0]
				- document.getElementByClassName
				- document.querySelectorAll
				- divNode[0].style.width
				- divNode[0].style.width = '200px'
				- divNode[0].className 
				- divNode[0].className = 'active'
				- divNode[0].nodeName
				- divNode[0].nodeType
				- divNode[0].getAttribute('src')
				- divNode[0].setAttribute('src')
			- DOM 結構操作
				- 新增節點 document.createElement('div') appendChild()
				- 獲取父元素 divNOde[0].parentElement
				- 獲取子元素 divNode[0].childNodes
				- 刪除節點 removeChild()
				- 獲取兄弟節點
	- BOM Browser Object Model
		- 檢測瀏覽器類型
		- 拆解url各部分
		- navigator
			- navigator.userAgent
		- screen
			- screen.width
			- screen.height
		- location
			- location.href
			- location.protocol
			- location.host
			- location.pathname
			- location.search
			- location.hash
		- history
			- history.go()
			- history.back()
	- 事件
		- 編寫通用的事件監聽函數 divNode[0].addEventLIstener('click',fn)
		- 描述事件冒泡流程 
		- 代理 div1.addEventListerner('click',function(e){if(e.target.nodeName == 'P'){}})
		- 阻止冒泡 e.stopPropatation()
	- Ajax
		- 手動編寫一個ajax
		- 跨域的幾種實現方式
		- XMLHttPRequest
		- 狀態說明
			- 2xx 表示成果處理請求200
			- 3xx 需要重定向,瀏覽器直接跳轉
			- 4xx 客戶端請求錯誤404
			- 5xx 服務器端錯誤
	- 存儲
		- cookie
			- 本身用於客戶端和服務器通信
			- 也有本地存儲的功能
			- document.cookie="" 獲取和修改
			- 存儲量太小,只有4kb
			- 所有的http請求都帶着,影響效率
		- sessionStorage
			- 最大容量5M
			- sessionStorage.setItem(key,value); sessionStorage.getItem(key)
			- 瀏覽器關閉就會銷毀
		- localStorage
			- 最大容量5M
			- localStorage.setItem(key,value); localStorage.getItem(key)
			- 一直保留,除非手動清除
			- 兼容:ios Safari隱藏模式下,localStorage.getItem()會報錯,建議統一使用try-catch
13.開發環境
	- 開發工具
		- sublime
		- vscode
	- git
		- git status
		- git add
		- git checkout xxx
		- git commit -m "xxx"
		- git push origin master
		- git pull origin master
		- git branch
		- git checkout -b xxx/git checkout xxx
		- git merge xxx
		- 多人協作
			- git clone xxx
			- git checkout -b dev
			- vim xxx.file
			- git add xxx
			- git commit
			- git push origin dev
			- git checkout master
			- git pull origin master
			- git merge dev
			- git push origin master
	- 模塊化
		- export {getFun:function(){}}
		- var a = require("xx.js");
		- webpack
			- 新建webpack.config.js
			- var path = require('path')
			- var webpack = require('webpack')
			- module.exports = {context:path.resolve(__dirname,'./src'),entry:{app:'./app.js'},output:...}
		- node 
			- npm init 
			- npm install webpack --save-dev (--save-dev 在開發環境 --save 正式測試都有)
	- 上線
		- 將測試完成的代碼提交到git版本master分支
		- 將服務器的代碼全部打包並記錄版本號,備份
		- 將master分支代碼提交覆蓋到線上,生成新版本
	- 運行環境
		- 瀏覽器通過訪問鏈接得到頁面的內容
		- 通過繪制和渲染,顯示在最后的頁面樣式
		- 頁面加載過程
			- 從輸入url到得到html的詳細過程
			- window.onload ,DOMContentLoaded
			- 加載資源的形式 1.輸入URL加載頁面 2.<script src="xx" ></script>
			- 加載一個資源的過程
				- 瀏覽器根據DNS服務器得到域名的IP地址
				- 向這個IP的機器發送http請求
				- 服務器收到,處理並返回HTML請求
				- 瀏覽器得到返回內容
			- 瀏覽器渲染頁面的過程
				- 根據HTML結構生成DOM tree
				- 根據css生成cssom
				- 將DOM和CSSOM整合形成RenderTree
				- 根據RenderTree開始渲染和顯示
				- 遇到<script>時,會執行並阻塞渲染
		- 性能優化
			- 多使用內存,緩存或則其他方法
			- 減少cpu計算,減少網絡請求
			- 加載頁面和靜態資源
				- 靜態資源的壓縮合並
				- 靜態資源緩存
				- 使用CDN讓資源加載更快
				- 使用SSR后端渲染,數據直接輸出到HTML
			- 頁面渲染
				- CSS放在body前面,js放在body后面
				- 懶加載
				- 減少DOM查詢,對DOM查詢做緩存
				- 減少DOM,盡量多個操作合並在一起執行
				- 事件節流
				- 盡早執行操作(如DOMContentLoaded)
		- 安全性
			- xss跨站攻擊
				- 輸入文章,偷偷插入script
				- 攻擊代碼中,獲取cookie,發送自己的服務器
				- 會把查看者的cookie發送到攻擊者服務器
				- 措施
					- 前端替換關鍵字,例如替換<為&lt;>為&gt;
					- 后端替換
			- XSRF跨站仿造
				- 登陸一個網站
				- 付費網站接口沒有任何驗證
				- 然后收到郵件,隱藏<img src="xx/pay?id=ass"
				- 查看郵件的時候,悄悄付費了
				- 措施
					- 增加驗證流程,例如輸入指紋,密碼,短信驗證碼

		- 面試技巧
			- 簡歷
				- 簡潔明了,重點突出項目經歷和解決方案
				- 把個人博客放在簡歷中,定期維護更新博客
				- 把個人開源項目放在簡歷中,並維護開源項目
				- 簡歷真實,保持能力和經歷的真實性
			- 面試過程
				- 如何看待加班?
				- 千萬不可挑戰面試官
				- 學會給面試官驚喜,拓展知識點
				- 遇到不會回答的問題,回答知道的部分的
				- 談談缺點,比如什么不會,但最近在學

				


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM