1. split() join()的區(qū)別
- join():用于把
數(shù)組
中的所有元素
通過指定的分隔符
進(jìn)行分隔放入一個(gè)字符串
- split():用于把一個(gè)
字符串
通過指定的分隔符
進(jìn)行分隔成數(shù)組
2.JavaScript 的數(shù)據(jù)類型
String、Number肩杈、Boolean愚隧、Null铸史、Undefined 和 Object
-
ES6
新增了Symbol
類型 -
Object
是引用類型
独撇,其他的都是基本類型
(Primitive Type)澜沟。
3.如何判斷一個(gè)對(duì)象是否屬于某個(gè)類够坐?
instanceof
if (a instanceof Person) {
alert("yes");
}
4.new 操作符具體干了什么呢?
new 共經(jīng)過了 4 個(gè)階段
1). 創(chuàng)建一個(gè)空對(duì)象
2). 設(shè)置原型鏈
3). 讓 Func 中的 this 指向 obj托嚣,并執(zhí)行 Func 的函數(shù)體
4). 判斷 Func 的返回值類型:
function Test(){}
const test = new Test()
- 創(chuàng)建一個(gè)新對(duì)象:
const obj = {}
- 設(shè)置新對(duì)象的
constructor
屬性為構(gòu)造函數(shù)
的名稱损趋,設(shè)置新對(duì)象的proto
屬性指向構(gòu)造函數(shù)
的prototype
對(duì)象
obj.constructor = Test
obj.__proto__ = Test.prototype
- 使用新對(duì)象調(diào)用函數(shù)患久,函數(shù)中的 this 被指向新實(shí)例對(duì)象
Test.call(obj)
- 將初始化完畢的新對(duì)象地址,保存到等號(hào)左邊的變量中
5.call() 和 apply() 的含義和區(qū)別?
call
:調(diào)用一個(gè)對(duì)象
的一個(gè)方法墙杯,用另一個(gè)對(duì)象
替換當(dāng)前對(duì)象
apply
:調(diào)用一個(gè)對(duì)象
的一個(gè)方法配并,用另一個(gè)對(duì)象
替換當(dāng)前對(duì)象
call與 apply的相同點(diǎn):
方法的含義是一樣的,即方法功能是一樣的高镐;
第一個(gè)參數(shù)的作用是一樣的溉旋;
call與apply的不同點(diǎn):
兩者傳入的列表形式不一樣
call
可以傳入多個(gè)
參數(shù);apply
只能傳入兩個(gè)
參數(shù)嫉髓,所以其第二個(gè)參數(shù)往往是作為數(shù)組形式
傳入
6.sort 排序原理
冒泡排序法的原理:
比較
相鄰的元素
观腊。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)算行。對(duì)每一對(duì)
相鄰元素
做同樣的工作梧油,從開始第一對(duì)
到結(jié)尾的最后一對(duì)
。在這一點(diǎn)州邢,最后的元素應(yīng)該會(huì)是最大
的數(shù)儡陨。針對(duì)所有的元素重復(fù)以上的步驟,除了
最后一個(gè)
量淌。持續(xù)每次對(duì)越來越少的元素
重復(fù)
上面的步驟骗村,直到?jīng)]有任何一對(duì)數(shù)字
需要比較。
1.升序
var apple = [45, 42, 10, 147, 7, 65, -74];
// ①默認(rèn)法,缺點(diǎn):只根據(jù)首位排序
console.log(apple.sort());
// ②指定排序規(guī)則法,return可返回任何值
console.log(
apple.sort(function(a, b) {
return a - b; //若return返回值大于0(即a>b),則a,b交換位置
})
);
2.降序
var arr = [45, 42, 10, 111, 7, 65, -74];
console.log(
apple.sort(function(a, b) {
return b - a; //若return返回值大于零(即b>a),則a,b交換位置
})
);
7.如何判斷當(dāng)前腳本運(yùn)行在瀏覽器還是 node 環(huán)境中呀枢?
通過判斷Global
對(duì)象是否為window
胚股,如果不為window
,當(dāng)前腳本沒有運(yùn)行在瀏覽器
中
8.移動(dòng)端最小觸控區(qū)域是多大裙秋?
蘋果推薦是 44pt x 44pt
9.移動(dòng)端的點(diǎn)擊事件的有延遲琅拌,時(shí)間是多久,為什么會(huì)有摘刑? 怎么解決這個(gè)延時(shí)进宝?
300 毫秒
因?yàn)?code>瀏覽器捕獲第一次單擊后,會(huì)先等待一段時(shí)間泣侮,如果在這段時(shí)間區(qū)間里用戶未進(jìn)行下一次點(diǎn)擊即彪,則
瀏覽器
會(huì)做單擊事件
的處理。如果這段時(shí)間里用戶進(jìn)行了第二次單擊
操作活尊,則瀏覽器
會(huì)做雙擊事件
處理隶校。推薦
fastclick.js
10.解釋 JavaScript 中的作用域與變量聲明提升?
作用域
只會(huì)對(duì)某個(gè)范圍
產(chǎn)生作用蛹锰,而不會(huì)對(duì)外產(chǎn)生影響的封閉空間深胳。在這樣的一些空間里,外部
不能訪問內(nèi)部變量
铜犬,但內(nèi)部
可以訪問外部變量
所有申明都會(huì)被提升到作用域的
最頂
上同一個(gè)
變量申明
只進(jìn)行一次
舞终,并且因此其他申明都會(huì)被忽略函數(shù)聲明的
優(yōu)先級(jí)
優(yōu)于變量申明
轻庆,且函數(shù)聲明會(huì)連帶定義
一起被提升
11.Node.js 的適用場景?
RESTFUL API
敛劝、實(shí)時(shí)聊天
余爆、客戶端邏輯強(qiáng)大的單頁 APP
,
本地化的在線音樂應(yīng)用
夸盟,本地化的在線搜索應(yīng)用
蛾方,本地化的在線 APP
等。
12.bind上陕、call桩砰、apply 的區(qū)別
call
和 apply
其實(shí)是一樣的,區(qū)別就在于傳參
時(shí)參數(shù)是一個(gè)一個(gè)傳或者是以一個(gè)數(shù)組
的方式來傳释簿。
call
和apply
都是在調(diào)用時(shí)
生效亚隅,改變調(diào)用者的 this 指向
let name = 'Jack'
const obj = {name: 'Tom'}
function sayHi() {console.log('Hi! ' + this.name)}
sayHi() // Hi! Jack
sayHi.call(obj) // Hi! Tom
-
bind
也是改變this 指向
,不過不是在調(diào)用時(shí)生效庶溶,而是返回一個(gè)新函數(shù)
const newFunc = sayHi.bind(obj)
newFunc() // Hi! Tom
13.使用構(gòu)造函數(shù)的注意點(diǎn)
一般情況下構(gòu)造函數(shù)
的首字母需要大寫煮纵,因?yàn)槲覀冊诳吹揭粋€(gè)函數(shù)首字母大寫的情況,就認(rèn)定這是一個(gè)構(gòu)造函數(shù)
渐尿,需要跟new
關(guān)鍵字進(jìn)行搭配使用醉途,創(chuàng)建一個(gè)新的實(shí)例(對(duì)象)
構(gòu)造函數(shù)
在被調(diào)用的時(shí)候需要跟new關(guān)鍵字搭配使用。在
構(gòu)造函數(shù)
內(nèi)部通過this+屬性名
的形式為實(shí)例添加一些屬性和方法砖茸。構(gòu)造函數(shù)
一般不需要返回值,如果有返回值如果返回值是一個(gè)基本
數(shù)據(jù)類型
殴穴,那么調(diào)用構(gòu)造函數(shù)
凉夯,返回值仍舊是那么創(chuàng)建出來的對(duì)象。如果返回值是一個(gè)
復(fù)雜數(shù)據(jù)類型
采幌,那么調(diào)用構(gòu)造函數(shù)
的時(shí)候劲够,返回值就是這個(gè)return
之后的那個(gè)復(fù)雜數(shù)據(jù)類型
14.如何獲取瀏覽器版本信息
window.navigator.userAgent
15.數(shù)組的常用方法
Array.map()
- 將數(shù)組中的每個(gè)元素調(diào)用一個(gè)提供的函數(shù),結(jié)果作為一個(gè)新的數(shù)組返回休傍,并沒有改變原來的數(shù)組
let arr = [1, 2, 3, 4, 5];
let newArr = arr.map(x =? x * 2);
//arr= [1, 2, 3, 4, 5] 原數(shù)組保持不變
//newArr = [2, 4, 6, 8, 10] 返回新數(shù)組
Array.forEach()
- 將數(shù)組中的每個(gè)元素執(zhí)行傳進(jìn)提供的函數(shù)征绎,沒有返回值,直接改變原數(shù)組磨取,注意和 map 方法區(qū)分
let arr = [1, 2, 3, 4, 5];
num.forEach(x =? x * 2);
// arr = [2, 4, 6, 8, 10] 數(shù)組改變,注意和map區(qū)分
Array.filter()
- 將所有元素進(jìn)行判斷人柿,將滿足條件的元素作為一個(gè)新的數(shù)組返回
let arr = [1, 2, 3, 4, 5]
const isBigEnough =? value =? value ?= 3
let newArr = arr.filter(isBigEnough )
//newNum = [3, 4, 5] 滿足條件的元素返回為一個(gè)新的數(shù)組
Array.every()
- 將所有元素進(jìn)行判斷返回一個(gè)布爾值,如果所有元素都滿足判斷條件忙厌,則返回 true凫岖,否則為 false:
let arr = [1, 2, 3, 4, 5]
const isLessThan4 =? value =? value ? 4
const isLessThan6 =? value =? value ? 6
arr.every(isLessThan4 ) //false
arr.every(isLessThan6 ) //true
Array.some()
- 將所有元素進(jìn)行判斷返回一個(gè)布爾值,如果存在元素都滿足判斷條件逢净,則返回 true哥放,若所有元素都不滿足判斷條件歼指,則返回 false:
let arr= [1, 2, 3, 4, 5]
const isLessThan4 =? value =? value ? 4
const isLessThan6 =? value =? value ? 6
arr.some(isLessThan4 ) //true
arr.some(isLessThan6 ) //false
Array.reduce()
- 所有元素調(diào)用返回函數(shù),返回值為最后結(jié)果,傳入的值必須是函數(shù)類型:
let arr = [1, 2, 3, 4, 5];
const add = (a, b) =? a + b;
let sum = arr.reduce(add);
//sum = 15 相當(dāng)于累加的效果與之相對(duì)應(yīng)的還有一個(gè) ####Array.reduceRight() 方法甥雕,區(qū)別是這個(gè)是從右向左操作的
Array.push()
- 在數(shù)組的后面添加新加元素踩身,此方法改變了數(shù)組的長度:
Array.pop()
- 在數(shù)組后面刪除最后一個(gè)元素,并返回?cái)?shù)組社露,此方法改變了數(shù)組的長度:
let arr = [1, 2, 3, 4, 5];
arr.pop();
console.log(arr); //[1, 2, 3, 4]
console.log(arr.length); //4
Array.shift()
- 在數(shù)組后面刪除第一個(gè)元素惰赋,并返回?cái)?shù)組,此方法改變了數(shù)組的長度:
let arr = [1, 2, 3, 4, 5];
arr.shift();
console.log(arr); //[2, 3, 4, 5]
console.log(arr.length); //4
Array.unshift()
- 將一個(gè)或多個(gè)元素添加到數(shù)組的開頭呵哨,并返回新數(shù)組的長度:
let arr = [1, 2, 3, 4, 5];
arr.unshift(6, 7);
console.log(arr); //[6, 7, 2, 3, 4, 5]
console.log(arr.length); //7
Array.isArray()
- 判斷一個(gè)對(duì)象是不是數(shù)組赁濒,返回的是布爾值
Array.concat()
- 將多個(gè)數(shù)組拼接成一個(gè)數(shù)組:
let arr1 = [1, 2, 3]
arr2 = [4, 5]
let arr = arr1.concat(arr2)
console.log(arr)//[1, 2, 3, 4, 5]
Array.toString()
- 將數(shù)組轉(zhuǎn)化為字符串:
let arr = [1, 2, 3, 4, 5];
let str = arr.toString()
console.log(str)// 1,2,3,4,5
Array.join()
- 將數(shù)組轉(zhuǎn)化為字符串:
let arr = [1, 2, 3, 4, 5];
let str1 = arr.toString()
let str2 = arr.toString(',')
let str3 = arr.toString('##')
console.log(str1)// 12345
console.log(str2)// 1,2,3,4,5
console.log(str3)// 1##2##3##4##5
Array.splice(開始位置, 刪除的個(gè)數(shù)孟害,元素)
- 萬能方法拒炎,可以實(shí)現(xiàn)增刪改:
let arr = [1, 2, 3, 4, 5];
let arr1 = arr.splice(2, 0 'haha')
let arr2 = arr.splice(2, 3)
let arr1 = arr.splice(2, 1 'haha')
console.log(arr1) //[1, 2, 'haha', 3, 4, 5]新增一個(gè)元素
console.log(arr2) //[1, 2] 刪除三個(gè)元素
console.log(arr3) //[1, 2, 'haha', 4, 5] 替換一個(gè)元素
16.字符串常用操作
charAt(index)
:返回指定索引處的字符串charCodeAt(index)
:返回指定索引處的字符的Unicode
的值concat(str1,str2,...)
:連接多個(gè)字符串,返回連接后的字符串的副本fromCharCode()
:將 Unicode 值轉(zhuǎn)換成實(shí)際的字符串indexOf(str)
:返回str
在父串中第一次出現(xiàn)的位置挨务,若沒有則返回-1
lastIndexOf(str)
:返回 str 在父串中最后一次出現(xiàn)的位置击你,若沒有則返回-1
match(regex)
:搜索字符串,并返回正則表達(dá)式的所有匹配
replace(str1,str2)
:str1
也可以為正則表達(dá)式谎柄,用str2
替換str1
search(regex)
:基于正則表達(dá)式搜索字符串丁侄,并返回第一個(gè)匹配的位置slice(start,end)
:返回字符索引在start
和end
(不含)之間的子串split(sep,limit)
:將字符串分割為字符數(shù)組朝巫,limit
為從頭開始執(zhí)行分割的最大數(shù)量substr(start鸿摇,length)
:從字符索引start
的位置開始,返回長度為length
的子串substring(from,to)
:返回字符索引在from
和to
(不含)之間的子串toLowerCase()
:將字符串轉(zhuǎn)換為小寫toUpperCase()
:將字符串轉(zhuǎn)換為大寫valueOf()
:返回原始字符串值
17.作用域的概念及作用
作用域 :
起作用
的一塊區(qū)域
作用域的概念: 對(duì)
變量
起保護(hù)作用
的一塊區(qū)域作用:
作用域外部
無法獲取到作用域內(nèi)部
聲明的變量劈猿,作用域內(nèi)部
能夠獲取到作用域外界
聲明的變量拙吉。
18.作用域的分類
塊作用域、詞法作用域揪荣、動(dòng)態(tài)作用域
1). 塊作用域
- 花括號(hào) {}
2). 詞法作用域
- 作用域只跟在
何處被創(chuàng)建
有關(guān)系筷黔,跟在何處被調(diào)用
沒有關(guān)系
3). 動(dòng)態(tài)作用域
- 作用域只跟在
何處被調(diào)
用有關(guān)系,跟在何處被創(chuàng)建
沒有關(guān)系
19.js 屬于哪種作用域
詞法作用域(函數(shù)作用域)
塊作用域
{
var num =123;
}
console.log(num);
如果
js
屬于塊作用域仗颈,那么在花括號(hào)外部就無法訪問到花括號(hào)內(nèi)部的聲明的num變量
佛舱。如果
js
不屬于塊級(jí)作用域,那么花括號(hào)外部就能夠訪問到花括號(hào)內(nèi)部聲明的num變量
能夠輸出
num變量
挨决,也就說明js
不屬于塊級(jí)作用请祖。在
ES6
之前的版本js
是不存在塊級(jí)作用域的。js
屬于詞法作用域還是動(dòng)態(tài)作用域js
中函數(shù)可以幫我們?nèi)バ纬梢粋€(gè)作用域
function fn(){
var num =123;
}
fn();
//在函數(shù)外界能否訪問到num這樣一個(gè)變量
console.log(num)
//Uncaught ReferenceError: num is not defined
如果
函數(shù)
能夠生成一個(gè)作用域
凰棉,那么在函數(shù)
外界就無法訪問到函數(shù)
內(nèi)部聲明的變量损拢。js中的
函數(shù)
能夠生成一個(gè)函數(shù)作用域
。
詞法作用域
- 作用的外界只跟
作用域
在何處創(chuàng)建有關(guān)系撒犀,跟作用域
在何處被調(diào)用沒有關(guān)系
var num = 123;
function f1() {
console.log(num); //
}
function f2() {
var num = 456;
f1(); //f1在f2被調(diào)用的時(shí)候會(huì)被執(zhí)行 福压。
}
f2();
如果
js
是詞法作用域
掏秩,那么就會(huì)輸出f1被創(chuàng)建
的時(shí)候外部
的num變量 123如果
js
是動(dòng)態(tài)作用域
,那么f1執(zhí)行的時(shí)候就會(huì)輸出f1被調(diào)用時(shí)外部
環(huán)境中的num 456
20.自執(zhí)行函數(shù)?用于什么場景荆姆?好處?
自執(zhí)行函數(shù):
1). 聲明一個(gè)匿名函數(shù)
2). 馬上調(diào)用這個(gè)匿名函數(shù)蒙幻。
作用:創(chuàng)建一個(gè)
獨(dú)立
的作用域。好處:防止變量彌散
到全局胆筒,以免各種 js 庫沖突邮破。隔離作用域避免污染,或者截?cái)嘧饔糜蜴溒途龋苊忾]包造成引用變量無法釋放
抒和。利用立即執(zhí)行
特性,返回需要的業(yè)務(wù)函數(shù)
或對(duì)象
彤蔽,避免每次通過條件
判斷來處理場景:一般用于框架
摧莽、插件
等場景
21.多個(gè)頁面之間如何進(jìn)行通信
- 有如下幾個(gè)方式:
cookie
web worker
localeStorage
sessionStorage
22.css 動(dòng)畫和 js 動(dòng)畫的差異
代碼復(fù)雜度,
js
動(dòng)畫代碼相對(duì)復(fù)雜一些動(dòng)畫運(yùn)行時(shí)顿痪,對(duì)動(dòng)畫的控制程度上镊辕,
js
能夠讓動(dòng)畫暫停
,取消
蚁袭,終止
征懈,css
動(dòng)畫不能添加事件動(dòng)畫性能看,
js
動(dòng)畫多了一個(gè)js
解析的過程揩悄,性能不如css
動(dòng)畫好
23.數(shù)組方法 pop() push() unshift() shift()
arr.pop()
從后面刪除
元素卖哎,只能是一個(gè)
,返回值是刪除的元素arr.push()
從后面添加
元素虏束,返回值為添加完后的數(shù)組的長度arr.unshift()
從前面添加
元素, 返回值是添加完后的數(shù)組的長度arr.shift()
從前面刪除
元素棉饶,只能刪除一個(gè)
返回值是刪除的元素
24.事件綁定與普通事件有什么區(qū)別
用
普通事件
添加相同事件,下面會(huì)覆蓋上面的镇匀,而事件綁定
不會(huì)普通事件
是針對(duì)非 dom
元素,事件綁定
是針對(duì)dom元素
的事件
25.IE 和標(biāo)準(zhǔn)下有哪些兼容性的寫法
var ev = ev || window.event;
document.documentElement.clientWidth || document.body.clientWidth;
var target = ev.srcElement || ev.target;
26.js 中 this 閉包 作用域
-
this
:指向調(diào)用上下文
- 閉包:定義一個(gè)函數(shù)就開辟了一個(gè)
局部作用域
袜啃,整個(gè)js
執(zhí)行環(huán)境有一個(gè)全局作用域
- 作用域:
一個(gè)函數(shù)
可以訪問其他函數(shù)中
的變量(閉包是一個(gè)受保護(hù)的變量空間)
var f = (function fn() {
var name = 1;
return function () {
name++;
console.log(name)
}
})()
==?undefined
27.javascript 的本地對(duì)象汗侵,內(nèi)置對(duì)象和宿主對(duì)象
本地對(duì)象
ECMA-262
把本地對(duì)象(native object)定義為“獨(dú)立于宿主環(huán)境的ECMAScript
實(shí)現(xiàn)提供的對(duì)象",簡單來說,本地對(duì)象
就是ECMA-262
定義的類(引用類型)
- 包括:
Object
群发、Function
晰韵、Array
、String
熟妓、Boolean
雪猪、Number
、Date
起愈、RegExp
只恨、Error
译仗、EvalError
、RangeError
官觅、ReferenceError
纵菌、SyntaxError
、TypeError
休涤、URIError
內(nèi)置對(duì)象
JS
中內(nèi)置了17
個(gè)對(duì)象咱圆,常用的是Array對(duì)象
、Date對(duì)象
功氨、正則表達(dá)式對(duì)象
序苏、string對(duì)象
、Global對(duì)象
宿主對(duì)象
由ECMAScript
實(shí)現(xiàn)的宿主環(huán)境提供的對(duì)象捷凄,可以理解為:瀏覽器提供的對(duì)象
,所有的BOM
和DOM
都是宿主對(duì)象忱详。
28.javascript 的同源策略
一段腳本只能讀取來自于同一來源
的窗口和文檔的屬性解析:同源策略
:限制從一個(gè)源加載
的文檔或腳本如何與來自另一個(gè)源
的資源進(jìn)行交互。這是一個(gè)用于隔離潛在惡意文件
的關(guān)鍵的安全機(jī)制
纵势。(來自 MDN 官方的解釋)簡單來說就是:一段腳本只能讀取來自于同一來源的窗口
和文檔
的屬性踱阿,這里的同一來源指的是主機(jī)名
、協(xié)議
和端口號(hào)
的組合
具體解釋:
1). 源包括三個(gè)部分:協(xié)議
钦铁、域名
软舌、端口
(http 協(xié)議的默認(rèn)端口是 80)。如果有任何一個(gè)部分不同牛曹,則源不同佛点,那就是跨域了
2). 限制:這個(gè)源的文檔沒有權(quán)利
去操作另一個(gè)源的文檔。這個(gè)限制體現(xiàn)在:
-
Cookie
黎比、LocalStorage
和IndexDB
無法獲取超营。 - 無法獲取和操作
DOM
- 不能發(fā)送
ajax
請(qǐng)求(ajax 在不同域名下的請(qǐng)求無法實(shí)現(xiàn),需要進(jìn)行跨域操作)
29.事件冒泡與事件捕獲
- 事件冒泡:由
最具體
的元素(目標(biāo)元素)向外傳播到最不具體
的元素 - 事件捕獲:由
最不確定
的元素到目標(biāo)元素
30.復(fù)雜數(shù)據(jù)類型如何轉(zhuǎn)變?yōu)樽址?/h2>
首先阅虫,會(huì)調(diào)用 valueOf
方法演闭,如果方法的返回值是一個(gè)基本數(shù)據(jù)類型
,就返回這個(gè)值
如果調(diào)用 valueOf
方法之后的返回值仍舊是一個(gè)復(fù)雜數(shù)據(jù)類型
颓帝,就會(huì)調(diào)用該對(duì)象的 toString
方法
如果 toString
方法調(diào)用之后的返回值是一個(gè)基本數(shù)據(jù)類型
米碰,就返回這個(gè)值,
如果 toString
方法調(diào)用之后的返回值是一個(gè)復(fù)雜數(shù)據(jù)類型
购城,就報(bào)一個(gè)錯(cuò)誤