typeof
能獲得哪些類型值類型
:變量自己就是含有賦予給它的數值的,它的變量自己及保存的數據都存儲在棧的內存塊當中引用類型
:引用類型固然是分配到堆上的對象或者數據變量,根據官方一點的解釋就是引用類型的變量只包括對其所表示的數據引用
typeof abc //"undefined"
typeof NaN //"number"
typeof null //"object"
typeof console.log //"function"
複製代碼
typeof只能區分值類型,對引用類型無能爲力,只能區分函數function
NaN
表示特殊的非數字值,null
是空指針,並無指向任何一個地址
typeof
能區分的五種基本類型:string
、boolean
、number
、undefined
、symbol
和函數function
javascript
100 == '100' //true
0 == "" //true
null == undefined //true
複製代碼
var c = '';
if(c){
//....
}
複製代碼
console.log(10 && 0); //0
console.log('' || 'abc'); //'abc'
console.log(!window.abc); //true
複製代碼
判斷一個變量會被當作true仍是false 雙非判斷 var a = 100; console.log(!!a);html
在js邏輯運算中,0、NaN、""、null、false、undefined都會判爲false,其餘都爲true
前端
var add_level = (add_step == 5 && 1)||(add_step == 10 && 2)||(add_step == 12 && 4)||(add_step==15 && 5 )|| 0;
複製代碼
var add_level = {'5':1,'10':2,'15':5,'12':4}[add_step]||0; //更精簡
複製代碼
===
什麼時候使用 ==
if(obj.a == null){
//這裏至關於obj.a === null || obj.a === undefined,簡寫
//這是jquery源碼中推薦的寫法,除此以外其餘全用 ===
//主要是用於判斷這個屬性是否存在
}
複製代碼
//判斷函數參數是否存在
function (a,b){
if(a == null){
...
}
}
複製代碼
//這種寫法不能用
if(xxx == null){
//可能會報錯,這個參數未定義 not defined
}
複製代碼
JSON.stringify({a:10,b:20})
JSON.parse('{"a":10,"b":20}')
複製代碼
__proto__
屬性,屬性值是一個普通的對象prototype
屬性,屬性值也是一個普通的對象__proto__
屬性指向它的構造函數的prototype
屬性__proto__
(即它的構造函數的prototype
中尋找)
instanceof
:用於判斷引用類型屬於哪一個構造函數的方法java
f instanceof Foo
的判斷邏輯是:node
__proto__
一層一層往上,可否對應到Foo.prototype
f instance Object
var arr = []
arr instanceOf Array
//true
jquery
typeof arr
//object,typeof
是沒法判斷是不是數組的ios
通用判斷方法:Object.prototype.toString.call(arr) === "[object Array]"
面試
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;
}
}
Elem.prototype.on = function(type,fn){
var elem = this.elem
elem.addEventListener(type,fn)
}
var div1 = new Elem('content_wrapper')
//div1.html('<p>ds<p>')
//div1.on('click',function(){
// alert('clicked')
// }
//)
div1.html('<p>放大放大放大發范德薩大點的我請薩</p>').on('click',function(){
alert('clicked');
}).html('<p>javascript</p>')
複製代碼
function create() {
let obj = new Object()
let Con = [].shift.call(arguments)
obj.__proto__ = Con.prototype
let result = Con.apply(obj, arguments)
return typeof result === 'object' ? result : obj
}
複製代碼
題目:ajax
- 說一下對變量提高的理解
- 說明this幾種不一樣的使用場景
- 建立10個
< a>
標籤,點擊的時候彈出對應的序號- 如何理解做用域
- 實際開發中閉包的應用
<script>
或者一個函數
<script>
console.log(a) //undefined
var a = 100
fn('zhangsan') //'zhangsan' 20
function fn(name){
age = 20
console.log(name,age)
var age
}
複製代碼
undefined
佔位this
、arguments
都要先提取出來函數聲明
和函數表達式
的區別fn() //不會報錯
function fn(){
//聲明
}
複製代碼
fn() //Uncaught TypeError:fn1 is not a function
var a = function(){
//表達式
}
複製代碼
- 變量提高: var a ; undefined,並不知道是一個函數
- 函數提高: 把函數聲明提早
fn('zhangsan')
function fn(name){
//函數
console.log(this)
console.log(arguments)
age = 20
console.log(name,age)
var age
bar(100)
function bar(num){
console.log(num)
}
}
複製代碼
call
、apply
、bind
var a = {
name : 'A',
fn:function(){
console.log(this.name)
}
}
a.fn() //this === a
a.fn.call({name:'B'}) //this === {name:'B'}
var fn1 = a.fn
fn1() //this === window
複製代碼
this要在執行的時候才能確認值chrome
沒有塊級做用域
if(true){
var name = 'zhangsan'
}
console.log(name)
複製代碼
函數做用域和全局做用域
var a = 100
function fn(){
var a = 200
console.log('fn',a)
}
console.log('global',a)
fn()
複製代碼
如何理解做用域:
var a = 100
function fn(){
var b = 200
//當前做用域沒有定義的變量,即「自由變量」
console.log(a)
console.log(b)
}
fn()
複製代碼
自由變量做用域鏈,一直往父級做用域找,一直找到全局做用域
var a = 100
function F1(){
var b = 200
function F2(){
var c = 300
console.log(a) //a是自由變量
console.log(b) //b是自由變量
console.log(c)
}
F2()
}
F1()
複製代碼
做用域是定義時的做用域,而不是執行時的做用域
閉包的使用場景:
函數做爲返回值
function F1(){
var a = 100
//返回一個函數(函數做爲返回值)
return function(){
console.log(a)
}
}
var f1 = F1()
var a = 200
f1()
複製代碼
函數做爲參數傳遞
function F1(){
var a = 100
return function(){
console.log(a) //自由變量,父做用域尋找
}
}
var f1 = F1()
function F2(fn){
var a = 200
fn()
}
F2(f1)
複製代碼
在某一做用域中,聲明變量的語句會默認解析爲在該做用域的最開始就已經聲明瞭
< a>
標籤,點擊的時候彈出對應的序號錯誤寫法
var i,a
for(i = 0;i<10;i++){
a = document.createElement('a')
a.innerHTMl = i + '<br>'
a.addEventListener('click',function(e){
e.preentDefault()
alert(i)
})
document.body.appendChild(a)
}
複製代碼
正確寫法
var i,a
for(i = 0;i < 10;i++){
(function(i){
var a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click',function(e){
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
})(i)
}
複製代碼
//閉包實際應用中主要用於封裝變量,收斂權限
function isFirstLoad(){
var _list = [];
return function(id){
if(_list.indexOf(id) >= 0){
return false;
}else{
_list.push(id);
return true;
}
}}
var firstLoad = isFirstLoad();
firstLoad(10);
複製代碼
題目:
- 同步和異步的區別是什麼?分別舉一個同步和異步的例子
- 一個關於
setTimeout
的筆試題- 前端使用異步的場景有哪些
知識點:
- 什麼是異步(對比同步)
- 前端使用異步的場景
- 異步和單線程
是否阻塞程序的運行
在可能發生等待的狀況
setTimeout
,setTimeInterval
ajax
請求,動態<img>
加載等待過程當中不能像alert
同樣阻塞程序運行
所以全部的「等待的狀況」都須要異步
console.log(100)
setTimeout(function(){
console.log(200)
},1000)
console.log(300)
複製代碼
同步會阻塞代碼執行,而異步不會
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)
setTimeout(function(){
console.log(4)
},1000)
console.log(5)
複製代碼
須要等待,由於js是單線程語言
題目
- 獲取
2017-06-10
格式的日期- 獲取隨機數,要求是長度一直的字符串格式
- 寫一個能遍歷對象和數組的通用forEach函數
Date.now() //獲取當前時間毫秒數
var dt = new Date()
dt.getTime() //獲取毫秒數
dt.getFullYear() //年
dt.getMonth() //月(0-11)
dt.getDate() //日(0-31)
dt.getHours() //小時(0-23)
dt.getMinutes() //分鐘(0-59)
dt.getSeconds() //秒(0-59)
複製代碼
Math.random()
:能夠用來清除緩存
forEach
遍歷全部數據every
判斷全部元素是否都符合條件some
判斷是否有至少一個元素符合條件sort
排序map
對元素從新組裝,生成新數組>- 過濾符合條件的元素array.forEach
arr.forEach( function(item,index){
console.log(index,item);
});
複製代碼
array.every
var arr = [1,2,3,4,5];
var result = arr.every(function(index,item){
//用來判斷全部的數組元素,都知足一個條件
if(item<6)
return true
});
console.log(result);
複製代碼
array.some
var result = arr.some(function(index,item){
if(item<5)
return true;
});
console.log(result);
複製代碼
arry.sort
var arr2 = arr.sort(function(a,b){
//從小到大排序 return a-b;
//從大到小排序
//return b-a;
})
複製代碼
array.map
arr.map(function(item,index){
return '<br>'+index+':'+item+'<br>'
})
複製代碼
array.filter
var arr2 = arr.filter(function (item,index){
//經過某一個條件過濾數組
if(item >= 2)
return true
})
複製代碼
var obj = {
x:100,
y:200,
z:300
}
var key
for(key in obj){
if(obj.hasOwnProperty(key)){
console.log(key,obj[key])
}
}
複製代碼
function formatDate(dt){
if(!dt){
dt = new Date()
}
var year = dt.getFullYear()
var month = dt.getMonth() + 1
var date = dt.getDate()
if(month < 10){
//強制類型轉換
month = '0' + month
}
if(date < 10){
//強制類型轉換
date = '0' + date
}
//強制類型轉換
return year + '-' + month + '-' + date
}
var dt = new Date()
var formatDate = formatDate(dt)
console.log(formatDate)
複製代碼
var random = Math.random() + '0000000000';
var random = random.slice(0,10);
複製代碼
function forEach(obj,fn){
var key
if(obj instanceof Array){
//準備判斷是否是數組
obj.forEach(function(item,index){
fn(index,item)
})
}else{
//不是數組就是對象
for(key in obj){
fn(key,obj[k])
}
}
}
複製代碼
知識點:
- js基礎知識:ECMA262標準
- JS-Web-API:W3C標準
W3C標準中關於JS的規定有:
- DOM操做
- BOM操做
- 事件綁定
- ajax請求(包括http協議)
- 存儲
DOM的本質
Document
、Object
、Model
瀏覽器把拿到的html代碼,結構化一個瀏覽器可以識別而且js可操做的一個模型而已
DOM的節點操做
- 獲取DOM節點
- Attribute 和 properity
attribute
:是HTML標籤上的某個屬性,如id、class、value等以及自定義屬性,它的值只能是字符串,關於這個屬性一共有三個相關的方法,setAttribute、getAttribute、removeAttribute; 注意:在使用setAttribute的時候,該函數必定接收兩個參數,setAttribute(attributeName,value),不管value的值是什麼類型都會編譯爲字符串類型。在html標籤中添加屬性,本質上是跟在標籤裏面寫屬性時同樣的,因此屬性值最終都會編譯爲字符串類型。property
:是js獲取的DOM對象上的屬性值,好比a,你能夠將它看做爲一個基本的js對象。這個節點包括不少property,好比value,className以及一些方法onclik等方法。 一個js對象有不少property,該集合名字爲properties,properties裏面有其餘property以及attributies,attributies裏面有不少attribute。 而經常使用的attribute,id、class、name等通常都會做爲property附加到js對象上,能夠和property同樣取值、賦值DOM結構操做
樹
property
和Attribute
property只是一個JS對象的屬性的修改
Attribute是對html標籤屬性的修改
問題:
- 如何檢測瀏覽器的類型
- 拆解URL各部分
知識點
- navigator
- screen
- location
- history
//navigator
var ua = navigator.userAgent
var isChrome = ua.indexOf('chrome')
console.log(isChrome)
//screen
console.log(screen.width)
console.log(screen.height)
//location
console.log(location.href)
console.log(location.protocol)
console.log(location.pathname)
console.log(location.search) //?以後的參數
console.log(location.hash) //#號以後
//history
history.back()
history.forward()
複製代碼
題目:
- 編寫一個通用的事件監聽函數
- 描述時間冒泡流程
- 對於一個無限下拉加載圖片的頁面,如何給每一個圖片綁定事件
知識點:
- 通用事件綁定
- 事件冒泡
- 代理
var btn = document.getElementById('btn1')
btn.addEventListener('click', function(event) {
console.log('clicked')
})
function bindEvent(elem, type, fn) {
elem.addEventListener(type, fn)
}
var a = document.getElementById('link1')
bindEvent(a, 'click', function(e) {
e.preventDefault(); //阻止默認行爲
alert('clicked')
})
複製代碼
關於IE低版本的兼容性
attachEvent
綁定事件,和W3C標準不同e.stopPropatation()
//取消冒泡
<div id="div1">
<a href = "#">a1</a>
<a href = "#">a2</a>
<a href = "#">a3</a>
<a href = "#">a4</a>
<!--會隨時新增更多 a 標籤-->
</div>
var div1 = document.getElementById('div1')
div1.addEventListener('click',function(e){
var target = e.target
if(target.nodeName === 'A'){
alert(target.innerHTMl)
}
})
複製代碼
完整寫法
function bindEvent(elem, type, selector, fn) {
if (fn == null) {
fn = selector
selector = null
}
elem.addEventListener(type, function(e) {
var target
if (selector) {
target = e.target
if (target.matches(selector)) {
fn.call(target, e)
}
} else {
fn(e)
}
})
}
//使用代理
var div1 = document.getElementById('div1')
bindEvent(div1, 'click', 'a', function(e) {
console.log(this.innerHTML)
})
//不使用代理
var a = document.getElementById('a1')
bindEvent(div1, 'click', function(e) {
console.log(a.innerHTML)
})
複製代碼
題目:
- 手動寫一個
ajax
,不依賴第三方庫- 跨域的幾種實現(原理)
知識點:
- xmlHttpRequest
- 狀態碼說明
- 跨域
var xhr = new XMLHttpRequest()
xhr.open("GET","/api",false)
xhr.onreadystatechange = function(){
//這裏的函數異步執行,可參考以前JS基礎中的異步模塊
if(xhr.readyState == 4){
if(xhr.status == 200){
alert(xhr.responseText)
}
}
}
xhr.send(null)
複製代碼
IE兼容性問題
.
狀態碼說明
send()
方法send()
方法,正在發送請求send()
方法執行完成,已經接收到所有相應內容.
status說明
- 2XX - 表示成功處理請求。如200
- 3XX - 須要重定向,瀏覽器直接跳轉
- 4XX - 客戶端請求錯誤,如404
- 5XX - 服務器端錯誤
什麼是跨域
ajax
訪問其餘域的接口
能夠跨域的三個標籤
<img src=''>
<script src=''>
<link href=''>
三個標籤的場景
<img>
用於打點統計,統計網站多是其餘域(並且沒有任何兼容性問題)<link>
<script>
可使用CDN,CDN也是其餘域<script>
能夠用於JSONP
跨越注意的問題
JSONP實現原理
<script src="http://coding.xxxxx.com/api.js">
//例如你的網站要跨域訪問xx網的一個接口
//給你一個地址 http://coding.xxxx.com/api.js
//返回內容格式 callback({x:100,y:200})
<script>
window.callback = function(data){
//這是咱們跨域獲得信息
console.log(data)
}
</script>
<script src="http://coding.m.xxxxx.com/api.js"></script>
複製代碼
服務器端設置http header
cookie
、sessionStorage
、localStorage
的區別
- 容量
- 是否會攜帶到ajax中
- API易用性
ios safari隱藏模式下,localStorage.getItem會報錯,建議統一用try-catch封裝
複製代碼
HTML+CSS 面試整理 --------------------------------> 點這裏
前端高級面試整理(三大框架等深刻知識) --------------------------------> 點這裏
javascript性能優化 --------------------------------> 點這裏
javascript設計模式 --------------------------------> 點這裏
HTTP相關面試 -------------------------------->點這裏