前端面試題套路--補(bǔ)充版

Javascript 基礎(chǔ):

1.js中數(shù)組常見(jiàn)的方法:

1.push()??末尾添加,返回長(zhǎng)度,改變?cè)瓟?shù)組

push()方法可以向數(shù)組后添加一個(gè)新的元素,并返回新數(shù)組的長(zhǎng)度。

? ? var a = [1,2,3];

? ? var b = a.push(4);

? ? console.log(a);//[1,2,3,4]

? ? console.log(b);//4

2.unshift() 首部添加,返回長(zhǎng)度,改變?cè)瓟?shù)組

unshift()可以向數(shù)組前添加一個(gè)或多個(gè)元素,并返回新的長(zhǎng)度。

var a = [2,3,4];

var b = a.unshift(0,1);

console.log(a);//[0,1,2,3,4]

console.log(b);//5

3.pop() 尾部刪除,返回被刪除的元素,改變?cè)瓟?shù)組

pop() 用于刪除并返回最后一個(gè)元素。

vara = [1,2,3]

varb = a.pop()

console.log(a)// [1,2]

console.log(b)// 3

4.shift()?刪除首部元素,返回被刪元素,改變?cè)瓟?shù)組

shift() 用于刪除并返回首個(gè)元素

var a = [1,2,3]

varb = a.shift()

console.log(a)// [2,3]

console.log(b)// 1

5.splice() 修改刪除。對(duì)數(shù)組進(jìn)行刪除修改,返回被刪除的元素組成的數(shù)組,改變?cè)瓟?shù)組

splice(index,length,增加的元素1,增加的元素2....,增加的元素N) 表示從index開(kāi)始刪除length個(gè)元素,并從index開(kāi)始新增元素1~N,放回被刪除的元素組成的數(shù)組

var a = [1,2,3]

var b = a.splice(1,1,3,[2,3,4],5)

console.log(a)? // [1,3,[2,3,4],5,3]

console.log(b)? // [2]

6.concat() 拼接合并兩個(gè)或多個(gè)數(shù)組,返回新數(shù)組,不會(huì)改變?cè)瓟?shù)組

concat() 方法用來(lái)合并兩個(gè)或多個(gè)數(shù)組

var a = [1,2,3]

var b = [4,5]

var c = a.concat(b)

console.log(a) // [1,2,3]

console.log(b) // [4,5]

console.log(c) // [1,2,3,4,5]

7.slice() 剪切?返回新數(shù)組,不改變?cè)瓟?shù)組

slice(startIndex,endIndex) ?返回從startIndex開(kāi)始(包括),到endIndex(不包括)之間的原屬組成的數(shù)組

var a = [1,2,3]

var b = a.slice(0,1)

// 不填參數(shù)則表示剪切整個(gè)數(shù)組?

var c = a.slice()

console.log(a) // [1,2,3]

console.log(b) // [1]

console.log(c) // [1,2,3]? ?

console.log(a===c)? // false // 注意 a !== c

// 負(fù)數(shù)表示從后往前數(shù)

var d = a.slice(-1,-2)?

console.log(d) // []? 從左向右截取,所以說(shuō)為[]

var e = a.slice(-1)?

console.log(e)? // [3]

8.join()不改變?cè)瓟?shù)組,返回轉(zhuǎn)換后的字符串

join() 方法用來(lái)將數(shù)組轉(zhuǎn)換為字符串

var a = [1,2,3,4,5]

console.log(a.join(','))// 1,2,3,4,5

console.log(a)// [1,2,3,4,5]

9.sort() 排序? 改變?cè)瓟?shù)組,返回排序后的數(shù)組

var a = ['a','b','d','c']

console.log(a.sort())? // ['a','b','c','d']

console.log(a)? // ['a','b','c','d']

10.reverse() 顛倒順序?返回的是顛倒后的數(shù)組,會(huì)改變?cè)瓟?shù)組。

reverse() 方法用于顛倒數(shù)組中元素的順序。

var a? = [1,3,2,7,6]

console.log(a.reverse())? // [6,7,2,3,1]

console.log(a)? // [6,7,2,3,1]

11.indexOf()和lastIndexOf()? 不會(huì)改變?cè)瓟?shù)組,返回找到的index,否則返回-1

indexOf(某元素,startIndex) 從startIndex開(kāi)始,查找某元素在數(shù)組中的位置,若存在,則返回第一個(gè)位置的下標(biāo),否則返回-1

lastIndexOf(某元素,startIndex) 和indexOf()相同,區(qū)別在于從尾部向首部查詢

若不使用下標(biāo),則一般通過(guò)includes()方法代替indexOf()

var a = [1,2,4,3,4,5]

console.log(a.indexOf(4))? // 2

console.log(a.indexOf(4,3)) // 4

12.filter() 過(guò)濾??filter() 方法返回?cái)?shù)組中滿足條件的元素組成的新數(shù)組,原數(shù)組不變

filter()的參數(shù)是一個(gè)方法

var a = [1,2,3,4,11]

// 第一個(gè)參數(shù)為一個(gè)方法,有三個(gè)參數(shù),current:當(dāng)前值 index:當(dāng)前值下標(biāo) array:這個(gè)數(shù)組對(duì)象

var b = a.filter(function(current,index,array){

? ? return current < 10

})

console.log(b) // [1,2,3,4]

console.log(a) // [1,2,3,4,11]

13.map() 格式化數(shù)組? ?map() 方法來(lái)根據(jù)需求格式化原數(shù)組,返回格式化后的數(shù)組。原數(shù)組不變

var a = [1,2,3,4,5]

// 參數(shù)同filter方法

var b = a.map(function(current,index,array){

? ? return current + 1

})

console.log(b) // [2,3,4,5,6]

console.log(a) // [1,2,3,4,5]

14.every()?對(duì)數(shù)組的每一項(xiàng)都運(yùn)行給定的函數(shù),若每一項(xiàng)都返回 ture,則返回 true

var a = [1,2,3,4,5]

var b = a.every(function(current,index,array){

? ? ? return current < 6

})

var c = a.every(function(current,index,array){

? ? ? return current < 3

})

console.log(b)? // true

console.log(c)? // false

15.some()?對(duì)數(shù)組的每一項(xiàng)都運(yùn)行給定的函數(shù),若存在一項(xiàng)或多項(xiàng)返回 ture,則返回 true

var a = [1,2,3,4,5]

var b = a.some(function(current,index,array){

? ? ? return current > 4

})

var c = a.some(function(current,index,array){

? ? ? return current > 5

})

console.log(b)? // true

console.log(c)? // false

16.forEach() ?數(shù)組遍歷?遍歷整個(gè)數(shù)組,中途不能中斷

var arr = ['a','b','c']

var copy = []

arr.forEach(function(item){

? ? copy.push(item)?

})

console.log(copy)

ES6新增數(shù)組方法:

1. find() ?

找到數(shù)組中第一次滿足條件的元素,并返回,若找不到則返回undefined。不改變?cè)瓟?shù)組。

和filter()方法的區(qū)別在于:filter返回值是所有滿足條件的元素組成的數(shù)組,

一般在需要使用找到的元素時(shí),用find()方法

var a = [1,2,3,4]

// b在下面需要使用,則一般用find

var b = a.find(function(ele,index,array){

? ? return ele == 1

})

var c = 3

var d = b + c

console.log(a) // [1,2,3,4]

console.log(b) // 1

console.log(d) // 4

// 若只需判斷元素是否存在

// 若果是簡(jiǎn)單數(shù)組(非對(duì)象數(shù)組),則一般使用Array.includes(value)方法

// 如果為對(duì)象數(shù)組,則可以使用Array.some()方法

var a = [1,2,3]

console.log(a.includes(1))? // true

var a = [{"name": "xiaoming" },{"name": "xiaohong"}]

console.log(a.some(function(ele){

? ? return ele.name == 'xiaoming'

}))? ? ?// true

2.findIndex()方法

findIndex()的作用同indexOf(),返回第一個(gè)滿足條件的下標(biāo),并停止尋找。

區(qū)別是findIndex() 的參數(shù)為一個(gè)回調(diào)函數(shù),且一般用于對(duì)象數(shù)組

var a = [1,2,3,4]

var b = a.findIndex(function(ele,index,array){

? ? return ele === 2

})

var c = a.indexOf(2)?

console.log(a)? // [1,2,3,4]

console.log(b)? // 1

console.log(c)? // 1

3.includes()?

includes()方法,返回一個(gè)布爾值。 參數(shù)是一個(gè)value,一般用于簡(jiǎn)單數(shù)組。

對(duì)于復(fù)雜數(shù)組,則可以使用some()方法替代includes()方法

var a = [1,2,3]

console.log(a.includes(1))? // true

4.Array.isArray()方法

用來(lái)判斷一個(gè)元素是否為數(shù)組

Array.isArray([])// true

Array.isArray({})// false

2.js中字符串常見(jiàn)的方法:

1.charAt 返回指定索引出的字符

var str='abcd';

var a=str.charAt(0);

console.log(a); //'a'

console.log(str); //'abcd'

2.charCodeAt?返回指定索引出的unicode字符

 str.charCodeAt(0); ? //97

3.indexof ?判斷一個(gè)字符第一次出現(xiàn)在某個(gè)字符串的索引,如果包含返回它的索引,如果不包含返回-1.

str.indexOf('a'); ? ? //0

str.indexOf('e'); ? ? //-1

4.lastIndexOf?判斷一個(gè)字符最后一次出現(xiàn)在某個(gè)字符串的索引,如果包含返回它的索引,如果不包含返回-1.

str.lastIndexOf('b'); ? //1

str.lastIndexOf('e'); ? //-1

5.concat拼接2個(gè)字符串,返回一個(gè)新字符串,對(duì)原有字符串沒(méi)有任何改變。

var str='qwe';

var str1='abc';

var str2=str.concat(str1);

? ? console.log(str2);//"qweabc"

6.substr(n,m) 從索引n開(kāi)始,截取m個(gè)字符,將截取的字符返回,對(duì)原字符串沒(méi)有任何改變。

var b=s.substr(1,1)

console.log(b); ?//'w'

7.substring(n,m) ? 從索引n開(kāi)始,截取到索引m,不包括m.將截取的字符返回,對(duì)原字符串沒(méi)有任何改變.

var ee=str.substring(1,3);

console.log(ee); ?//"bc"

8.slice(n,m) ? 從索引n開(kāi)始,截取到索引m,不包括m.將截取的字符返回,對(duì)原字符串沒(méi)有任何改變.

var aa=str.slice(0,3);

console.log(aa);//'abc'

9.split ?用指定字符分割字符串,返回一個(gè)數(shù)組.對(duì)原字符串沒(méi)有任何改變。

var a=str.split('');

console.log(a); ?//["a", "b", "c", "d"]

10.replace('a',1);? 替換指定字符,返回替換后新的字符串,對(duì)原有字符串有改變。(第一個(gè)參數(shù)可以是正則表達(dá)式)?只能替換一次?,配合正則模式修飾符g使用

var str='aaaaee';

var reg=/a/g;

str.replace(reg,1); ? //"1111ee"

11.match()?可在字符串內(nèi)檢索指定的值,或找到一個(gè)或多個(gè)正則表達(dá)式的匹配。把找到的字符放在數(shù)組里,返回一個(gè)數(shù)組。

var str='aaaa3ed33';

var reg=/a/g;

str.match(reg); ?//["a", "a", "a", "a"]

12.search()?方法用于檢索字符串中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符串。

ES6新增字符串方法:

1.includes():返回布爾值,表示是否找到了參數(shù)字符串。這三個(gè)方法都支持第二個(gè)參數(shù),表示開(kāi)始搜索的位置。

2.startsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的頭部。這三個(gè)方法都支持第二個(gè)參數(shù),表示開(kāi)始搜索的位置。

3.endsWith():返回布爾值,表示參數(shù)字符串是否在源字符串的尾部。這三個(gè)方法都支持第二個(gè)參數(shù),表示開(kāi)始搜索的位置。

vars='Hello world!';

s.startsWith('world',6) // true

s.endsWith('Hello',5) // true

s.includes('Hello',6)// false

4.repeat() ?方法返回一個(gè)新字符串,表示將原字符串重復(fù)n次。

'x'.repeat(3)// "xxx"

'hello'.repeat(2)// "hellohello"

'na'.repeat(0)// ""

3.js數(shù)組與字符串的相互轉(zhuǎn)換方法

一、數(shù)組轉(zhuǎn)字符串

需要將數(shù)組元素用某個(gè)字符連接成字符串,示例代碼如下:

var?a, b;

a = new?Array(0,1,2,3,4);

b = a.join("-");

二、字符串轉(zhuǎn)數(shù)組

實(shí)現(xiàn)方法為將字符串按某個(gè)字符切割成若干個(gè)字符串,并以數(shù)組形式返回,示例代碼如下:

var?s = "abc,abcd,aaa";

ss = s.split(",");// 在每個(gè)逗號(hào)(,)處進(jìn)行分解。

4.用css實(shí)現(xiàn)一個(gè)三角形,廢話不說(shuō),上代碼!

<body>

<style>

? ? .triangle {

? ? ? ? width: 0;

? ? ? ? height: 0;

? ? ? ? border-style: solid;

? ? ? ? border-width: 0 0 100px 100px;

? ? ? ? border-color: transparent transparent blue transparent;

? ? }

</style>

<div class="triangle"></div>

</body>

css實(shí)現(xiàn)三角形

5.H5新增標(biāo)簽

video表示一段視頻并提供播放的用戶界面

audio表示音頻

canvas表示位圖區(qū)域

source為video和audio提供數(shù)據(jù)源

track為video和audio指定字母

svg定義矢量圖

code代碼段

figure和文檔有關(guān)的圖例

figcaption圖例的說(shuō)明

main

time日期和時(shí)間值

mark高亮的引用文字

datalist提供給其他控件的預(yù)定義選項(xiàng)

keygen秘鑰對(duì)生成器控件

output計(jì)算值

progress進(jìn)度條

menu菜單

embed嵌入的外部資源

menuitem用戶可點(diǎn)擊的菜單項(xiàng)

menu菜單

template

section

nav

aside

article

footer

header

6.css3新增標(biāo)簽

背景和邊框

border-radius、box-shadow、border-image、

background-size:規(guī)定背景圖片的尺寸

background-origin:規(guī)定背景圖片的定位區(qū)域

background-clip:規(guī)定背景的繪制區(qū)域

文本效果(常用)

text-shadow:設(shè)置文字陰影

word-wrap:強(qiáng)制換行

word-break

css3提出@font-face規(guī)則,規(guī)則中定義了font-family、font-weight、font-style、font-stretch、src、unicode-range

7.css3新增偽類(lèi)選擇器

:nth-child()?

:nth-last-child()?

:only-child?

:last-child?

:nth-of-type()?

:only-of-type()?

:empty?

:target 這個(gè)偽類(lèi)允許我們選擇基于URL的元素,如果這個(gè)元素有一個(gè)識(shí)別器(比如跟著一個(gè)#),那么:target會(huì)對(duì)使用這個(gè)ID識(shí)別器的元素增加樣式。?

:enabled?

:disabled?

:checked?

:not

8.CSS3邊框:

border-radius:CSS3圓角邊框。

box-shadow:CSS3邊框陰影。在 CSS3 中,box-shadow 用于向方框添加陰影。box-shadow:10px 10px 5px #888888;

border-image:CSS3邊框圖片。通過(guò) CSS3 的 border-image 屬性,您可以使用圖片來(lái)創(chuàng)建邊框。border-image:url(border.png) 30 30 round;

9.CSS3背景:

background-size: 屬性規(guī)定背景圖片的尺寸。在 在 CSS3 中,可以規(guī)定背景圖片的尺寸,這就允許我們?cè)诓煌沫h(huán)境中重復(fù)使用背景圖片。您能夠以像素或百分比規(guī)定尺寸。如果以百分比規(guī)定尺寸,那么尺寸相對(duì)于父元素的寬度和高度。

background-origin :屬性規(guī)定背景圖片的定位區(qū)域。背景圖片可以放置于 content-box、padding-box 或 border-box 區(qū)域。

10.CSS3文字效果:

text-shadow:在 CSS3 中,text-shadow 可向文本應(yīng)用陰影。text-shadow:5px 5px 5px #FFFFFF;

word-wrap :單詞太長(zhǎng)的話就可能無(wú)法超出某個(gè)區(qū)域,允許對(duì)長(zhǎng)單詞進(jìn)行拆分,并換行到下一行:p{word-wrap:break-word;}

11.CSS3 2D轉(zhuǎn)換:

  transform:通過(guò) CSS3 轉(zhuǎn)換,我們能夠?qū)υ剡M(jìn)行移動(dòng)、縮放、轉(zhuǎn)動(dòng)、拉長(zhǎng)或拉伸。

translate():元素從其當(dāng)前位置移動(dòng),根據(jù)給定的 left(x 坐標(biāo)) 和 top(y 坐標(biāo)) 位置參數(shù):transform:translate(50px,100px);值 translate(50px,100px) 把元素從左側(cè)移動(dòng) 50 像素,從頂端移動(dòng) 100 像素。

rotate():元素順時(shí)針旋轉(zhuǎn)給定的角度。允許負(fù)值,元素將逆時(shí)針旋轉(zhuǎn)。transform:rotate(30deg);值 rotate(30deg) 把元素順時(shí)針旋轉(zhuǎn) 30 度。

scale():元素的尺寸會(huì)增加或減少,根據(jù)給定的寬度(X 軸)和高度(Y 軸)參數(shù):transform:scale(2,4);值 scale(2,4) 把寬度轉(zhuǎn)換為原始尺寸的 2 倍,把高度轉(zhuǎn)換為原始高度的 4 倍。

skew():元素轉(zhuǎn)動(dòng)給定的角度,根據(jù)給定的水平線(X 軸)和垂直線(Y 軸)參數(shù):transform:skew(30deg,20deg);值 skew(30deg,20deg) 圍繞 X 軸把元素轉(zhuǎn)動(dòng) 30 度,圍繞 Y 軸轉(zhuǎn)動(dòng) 20 度。

matrix() :

matrix() 方法把所有 2D 轉(zhuǎn)換方法組合在一起。

matrix() 方法需要六個(gè)參數(shù),包含數(shù)學(xué)函數(shù),允許您:旋轉(zhuǎn)、縮放、移動(dòng)以及傾斜元素。

12.less,sass,scss是什么?

1、Less:

是一種動(dòng)態(tài)樣式語(yǔ)言. 對(duì)CSS賦予了動(dòng)態(tài)語(yǔ)言的特性,如變量、繼承、運(yùn)算、函數(shù)。

Less 既可以在客戶端上運(yùn)行 (支持IE 6+, Webkit, Firefox),也可在服務(wù)端運(yùn)行。

2、Sass:

是一種動(dòng)態(tài)樣式語(yǔ)言,Sass語(yǔ)法屬于縮排語(yǔ)法,

比css比多出好些功能(如變量、嵌套、運(yùn)算,混入(Mixin)、繼承、顏色處理,函數(shù)等),更容易閱讀。

3. less和sass的相同之處

Less和Sass在語(yǔ)法上有些共性,比如下面這些:

1、混入(Mixins)——class中的class;

2、參數(shù)混入——可以傳遞參數(shù)的class,就像函數(shù)一樣;

3、嵌套規(guī)則——Class中嵌套class,從而減少重復(fù)的代碼;

4、運(yùn)算——CSS中用上數(shù)學(xué);

5、顏色功能——可以編輯顏色;

6、名字空間(namespace)——分組樣式,從而可以被調(diào)用;

7、作用域——局部修改樣式;

8、JavaScript 賦值——在CSS中使用JavaScript表達(dá)式賦值。

4. less和sass的區(qū)別

Less和Sass的主要不同就是他們的實(shí)現(xiàn)方式。

Less是基于JavaScript,是在客戶端處理的。

Sass是基于Ruby的,是在服務(wù)器端處理的。

關(guān)于變量在Less和Sass中的唯一區(qū)別就是Less用@,Sass用$。

13.css左邊固定,右邊自適應(yīng),怎么布局?

html部分:

<div class="container">

? ? ? ? <span class="left"></span>?

? ? ? ? <div class="right"></div>? ?

</div>

css樣式:

/*第1種寫(xiě)法*/

? ? *{padding: 0;margin:0;}

? ? .left{width:100px;height:100px;float:left;background-color:yellow;}?

? ? .right{margin-left:100px;height:100px;background-color:#666;}

? ? /*第2種寫(xiě)法*/

? ? *{padding: 0;margin:0;}

? ? .left{position: absolute; top:0; left:0; width:200px; background: #ff0;height: 100px;}

? ? .right input{width: 100%;? ? box-sizing: border-box;}

? ? .right{height:100px;background-color:#666;margin-left: 200px;}


css實(shí)現(xiàn)左邊固定,右邊自適應(yīng)

14. ajax

什么是ajax?

AJAX全稱(chēng)為“Asynchronous JavaScript and XML”(異步JavaScript和XML),是一種創(chuàng)建交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。它使用:

使用XHTML+CSS來(lái)標(biāo)準(zhǔn)化呈現(xiàn);

使用XML和XSLT進(jìn)行數(shù)據(jù)交換及相關(guān)操作;

使用XMLHttpRequest對(duì)象與Web服務(wù)器進(jìn)行異步數(shù)據(jù)通信;?

使用Javascript操作Document Object Model進(jìn)行動(dòng)態(tài)顯示及交互;?

使用JavaScript綁定和處理所有數(shù)據(jù)。

AJAX的工作原理:

? ? ? ? Ajax的工作原理相當(dāng)于在用戶和服 務(wù)器之間加了—個(gè)中間層(AJAX引擎),使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請(qǐng)求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給 Ajax引擎自己來(lái)做, 只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求。

ajax的核心:

? ? ? Ajax其核心有 JavaScript、XMLHTTPRequest、DOM對(duì)象組成,通過(guò)XmlHttpRequest對(duì)象來(lái)向服務(wù)器發(fā)異步請(qǐng)求,從服務(wù)器獲得數(shù)據(jù), 然后用JavaScript來(lái)操作DOM而更新頁(yè)面。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)。

ajax請(qǐng)求的五個(gè)流程

1.建立xmlHttpRequest對(duì)象

2.設(shè)置回調(diào)函數(shù)

3.使用OPEN方法與服務(wù)器建立連接??xmlHttp.open("get","ajax?name="+ name,true)

4.向服務(wù)器端發(fā)送數(shù)據(jù)

5.在回調(diào)函數(shù)中針對(duì)不同的響應(yīng)狀態(tài)進(jìn)行處理

AJAX的優(yōu)點(diǎn):

<1>.無(wú)刷新更新數(shù)據(jù)。

AJAX最大優(yōu)點(diǎn)就是能在不刷新整個(gè)頁(yè)面的前提下與服務(wù)器通信維護(hù)數(shù)據(jù)。這使得Web應(yīng)用程序更為迅捷地響應(yīng)用戶交互,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒(méi)有改變的信息,減少用戶等待時(shí)間,帶來(lái)非常好的用戶體驗(yàn)。

<2>.異步與服務(wù)器通信。

AJAX使用異步方式與服務(wù)器通信,不需要打斷用戶的操作,具有更加迅速的響應(yīng)能力。優(yōu)化了Browser和Server之間的溝通,減少不必要的數(shù)據(jù)傳輸、時(shí)間及降低網(wǎng)絡(luò)上數(shù)據(jù)流量。

<3>.前端和后端負(fù)載平衡。

AJAX可以把以前一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端,利用客戶端閑置的能力來(lái)處理,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本。并且減輕服務(wù)器的負(fù)擔(dān),AJAX的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請(qǐng)求和響應(yīng)對(duì)服務(wù)器造成的負(fù)擔(dān),提升站點(diǎn)性能。

<4>.基于標(biāo)準(zhǔn)被廣泛支持。

AJAX 基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載瀏覽器插件或者小程序,但需要客戶允許JavaScript在瀏覽器上執(zhí)行。隨著Ajax的成熟,一些簡(jiǎn)化 Ajax使用方法的程序庫(kù)也相繼問(wèn)世。同樣,也出現(xiàn)了另一種輔助程序設(shè)計(jì)的技術(shù),為那些不支持JavaScript的用戶提供替代功能。

<5>.界面與應(yīng)用分離。

Ajax使WEB中的界面與應(yīng)用分離(也可以說(shuō)是數(shù)據(jù)與呈現(xiàn)分離),有利于分工合作、減少非技術(shù)人員對(duì)頁(yè)面的修改造成的WEB應(yīng)用程序錯(cuò)誤、提高效率、也更加適用于現(xiàn)在的發(fā)布系統(tǒng)。

AJAX的缺點(diǎn):

<1>.AJAX干掉了Back和History功能,即對(duì)瀏覽器機(jī)制的破壞。

在動(dòng)態(tài)更新頁(yè)面的情況下,用戶無(wú)法回到前一個(gè)頁(yè)面狀態(tài),因?yàn)闉g覽器僅能記憶歷史記錄中的靜態(tài)頁(yè)面。一個(gè)被完整讀入的頁(yè)面與一個(gè)已經(jīng)被動(dòng)態(tài)修改過(guò)的頁(yè)面之間的差別非常微妙;用戶通常會(huì)希望單擊后退按鈕能夠取消他們的前一次操作,但是在Ajax應(yīng)用程序中,這將無(wú)法實(shí)現(xiàn)。

后 退按鈕是一個(gè)標(biāo)準(zhǔn)的web站點(diǎn)的重要功能,但是它沒(méi)法和js進(jìn)行很好的合作。這是Ajax所帶來(lái)的一個(gè)比較嚴(yán)重的問(wèn)題,因?yàn)橛脩敉窍M軌蛲ㄟ^(guò)后退來(lái) 取消前一次操作的。那么對(duì)于這個(gè)問(wèn)題有沒(méi)有辦法?答案是肯定的,用過(guò)Gmail的知道,Gmail下面采用的Ajax技術(shù)解決了這個(gè)問(wèn)題,在Gmail下 面是可以后退的,但是,它也并不能改變Ajax的機(jī)制,它只是采用的一個(gè)比較笨但是有效的辦法,即用戶單擊后退按鈕訪問(wèn)歷史記錄時(shí),通過(guò)創(chuàng)建或使用一個(gè)隱 藏的IFRAME來(lái)重現(xiàn)頁(yè)面上的變更。(例如,當(dāng)用戶在Google Maps中單擊后退時(shí),它在一個(gè)隱藏的IFRAME中進(jìn)行搜索,然后將搜索結(jié)果反映到Ajax元素上,以便將應(yīng)用程序狀態(tài)恢復(fù)到當(dāng)時(shí)的狀態(tài)。)

但是,雖然說(shuō)這個(gè)問(wèn)題是可以解決的,但是它所帶來(lái)的開(kāi)發(fā)成本是非常高的,并與Ajax框架所要求的快速開(kāi)發(fā)是相背離的。這是Ajax所帶來(lái)的一個(gè)非常嚴(yán)重的問(wèn)題。

一 個(gè)相關(guān)的觀點(diǎn)認(rèn)為,使用動(dòng)態(tài)頁(yè)面更新使得用戶難于將某個(gè)特定的狀態(tài)保存到收藏夾中。該問(wèn)題的解決方案也已出現(xiàn),大部分都使用URL片斷標(biāo)識(shí)符(通常被稱(chēng)為 錨點(diǎn),即URL中#后面的部分)來(lái)保持跟蹤,允許用戶回到指定的某個(gè)應(yīng)用程序狀態(tài)。(許多瀏覽器允許JavaScript動(dòng)態(tài)更新錨點(diǎn),這使得Ajax應(yīng) 用程序能夠在更新顯示內(nèi)容的同時(shí)更新錨點(diǎn)。)這些解決方案也同時(shí)解決了許多關(guān)于不支持后退按鈕的爭(zhēng)論。

<2>.AJAX的安全問(wèn)題。

AJAX 技術(shù)給用戶帶來(lái)很好的用戶體驗(yàn)的同時(shí)也對(duì)IT企業(yè)帶來(lái)了新的安全威脅,Ajax技術(shù)就如同對(duì)企業(yè)數(shù)據(jù)建立了一個(gè)直接通道。這使得開(kāi)發(fā)者在不經(jīng)意間會(huì)暴露比 以前更多的數(shù)據(jù)和服務(wù)器邏輯。Ajax的邏輯可以對(duì)客戶端的安全掃描技術(shù)隱藏起來(lái),允許黑客從遠(yuǎn)端服務(wù)器上建立新的攻擊。還有Ajax也難以避免一些已知 的安全弱點(diǎn),諸如跨站點(diǎn)腳步攻擊、SQL注入攻擊和基于Credentials的安全漏洞等等。

<3>.對(duì)搜索引擎支持較弱。

對(duì)搜索引擎的支持比較弱。如果使用不當(dāng),AJAX會(huì)增大網(wǎng)絡(luò)數(shù)據(jù)的流量,從而降低整個(gè)系統(tǒng)的性能。

<4>.破壞程序的異常處理機(jī)制。

至 少?gòu)哪壳翱磥?lái),像Ajax.dll,Ajaxpro.dll這些Ajax框架是會(huì)破壞程序的異常機(jī)制的。關(guān)于這個(gè)問(wèn)題,曾在開(kāi)發(fā)過(guò)程中遇到過(guò),但是查了一 下網(wǎng)上幾乎沒(méi)有相關(guān)的介紹。后來(lái)做了一次試驗(yàn),分別采用Ajax和傳統(tǒng)的form提交的模式來(lái)刪除一條數(shù)據(jù)……給我們的調(diào)試帶來(lái)了很大的困難。

<5>.違背URL和資源定位的初衷。

例如,我給你一個(gè)URL地址,如果采用了Ajax技術(shù),也許你在該URL地址下面看到的和我在這個(gè)URL地址下看到的內(nèi)容是不同的。這個(gè)和資源定位的初衷是相背離的。

<6>.AJAX不能很好支持移動(dòng)設(shè)備。

一些手持設(shè)備(如手機(jī)、PDA等)現(xiàn)在還不能很好的支持Ajax,比如說(shuō)我們?cè)谑謾C(jī)的瀏覽器上打開(kāi)采用Ajax技術(shù)的網(wǎng)站時(shí),它目前是不支持的。

<7>.客戶端過(guò)肥,太多客戶端代碼造成開(kāi)發(fā)上的成本。

編寫(xiě)復(fù)雜、容易出錯(cuò) ;冗余代碼比較多(層層包含js文件是AJAX的通病,再加上以往的很多服務(wù)端代碼現(xiàn)在放到了客戶端);破壞了Web的原有標(biāo)準(zhǔn)。

AJAX注意點(diǎn)及適用和不適用場(chǎng)景:

(1).注意點(diǎn)

Ajax 開(kāi)發(fā)時(shí),網(wǎng)絡(luò)延遲——即用戶發(fā)出請(qǐng)求到服務(wù)器發(fā)出響應(yīng)之間的間隔——需要慎重考慮。不給予用戶明確的回應(yīng),沒(méi)有恰當(dāng)?shù)念A(yù)讀數(shù)據(jù),或者對(duì) XMLHttpRequest的不恰當(dāng)處理,都會(huì)使用戶感到延遲,這是用戶不希望看到的,也是他們無(wú)法理解的。通常的解決方案是,使用一個(gè)可視化的組件來(lái) 告訴用戶系統(tǒng)正在進(jìn)行后臺(tái)操作并且正在讀取數(shù)據(jù)和內(nèi)容。

(2).Ajax適用場(chǎng)景

<1>.表單驅(qū)動(dòng)的交互

<2>.深層次的樹(shù)的導(dǎo)航

<3>.快速的用戶與用戶間的交流響應(yīng)

<4>.類(lèi)似投票、yes/no等無(wú)關(guān)痛癢的場(chǎng)景

<5>.對(duì)數(shù)據(jù)進(jìn)行過(guò)濾和操縱相關(guān)數(shù)據(jù)的場(chǎng)景

<6>.普通的文本輸入提示和自動(dòng)完成的場(chǎng)景

(3).Ajax不適用場(chǎng)景

<1>.部分簡(jiǎn)單的表單

<2>.搜索

<3>.基本的導(dǎo)航

<4>.替換大量的文本

<5>.對(duì)呈現(xiàn)的操縱

15.peomise

Promise?異步編程的解決方案

Promise是ES6新增的異步編程的解決方案,它有三種狀態(tài)分別是pending進(jìn)行中、resolved已完成、rejected已失敗。

Promise可以鏈?zhǔn)秸{(diào)用,避免層層嵌套,異步操作更加容易方便,提升代碼可讀性。

Promise一旦創(chuàng)建就不可以取消,一旦在resolved與rejected中確立一種狀態(tài),就不可以再發(fā)生改變

本人的其他文章? ? ? ?前端面試題套路--終極版(Vue、JavaScript)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容