js有哪幾種傳參方式?

大家好,我是IT修真院深圳分院第01期學(xué)員,一枚正直善良的web程序員。

今天給大家分享一下,修真院官網(wǎng) JS任務(wù)中可能會(huì)使用到的知識(shí)點(diǎn):

js有哪幾種傳參方式?


1.背景介紹

所有函數(shù)的參數(shù)都是按值傳遞的,也就是說把函數(shù)外部的值賦值給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量賦值到另一個(gè)變量一樣。

————《js高級(jí)程序設(shè)計(jì)》

有的人可能會(huì)把這里的js傳參方式,理解成js函數(shù)中的參數(shù)傳遞,但是呢,我們所要講的是頁面之間的數(shù)據(jù)傳遞。

傳統(tǒng)的前端開發(fā)中,頁面之間是少有參數(shù)交互的,甚至沒有,而在如今的前端環(huán)境下, 一個(gè)稍微正式點(diǎn)的項(xiàng)目都不可能少了頁面間傳參,頁面的跨越、服務(wù)器后臺(tái)進(jìn)行數(shù)據(jù)請(qǐng)求等,都需要一個(gè)或多個(gè)傳參的方法。 那么參數(shù)在不同的頁面間進(jìn)行傳遞,一個(gè)頁面的參數(shù)被另一頁面使用,如何才能做到不同頁面間進(jìn)行參數(shù)傳遞?

在JS中有多種頁面?zhèn)鬟f參數(shù)的方法:

一、URL

把參數(shù)值附在url后面?zhèn)鬟f到其他頁面

二、H5 web storage

localStroage 和 sessionStorage

三、Cookie

使用瀏覽器Cookie傳遞參數(shù)

四、Form 表單

Form表單通過URL傳遞參數(shù)



2.知識(shí)剖析

2.1、URL

A. URL地址傳遞參數(shù)

把參數(shù)值附在url后面?zhèn)鬟f到其他頁面

如:http://xxx.com/login.html?user=lol&pwd=66666

其中“user=lol”和“pwd=66666”就是我們傳遞的參數(shù)名稱和值。

url和參數(shù)之間用"?"隔開,多個(gè)參數(shù)之間用"&"符號(hào)連接。

URL地址傳遞參數(shù)的幾個(gè)特點(diǎn):

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

1、 URL地址法簡潔易用,可同時(shí)傳遞多個(gè)字符型參數(shù);

2、 URL地址法可以很方便的在頁面之間切換并傳遞參數(shù),無需額外的處理,基于正常情況比較不會(huì)性能損失;

不足:

3、 URL傳遞參數(shù)長度受限,最大為2K;

4、 URL只能傳遞字符型參數(shù),傳遞中文時(shí),由于發(fā)送頁面和接收頁面的字符編碼方式不一樣而導(dǎo)致參數(shù)解析處理錯(cuò)誤,參數(shù)包含中文時(shí)可能出現(xiàn)亂碼或者參數(shù)接收錯(cuò)誤;

5、 信息泄露:URL地址在客戶端可見,所以涉及隱私的參數(shù)需進(jìn)行加密后才能進(jìn)行傳遞,不加密傳輸會(huì)導(dǎo)致信息泄露,產(chǎn)生安全隱患。

2.2、H5 WEB STORAGE

1、sessionStorage用于本地存儲(chǔ)一個(gè)會(huì)話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會(huì)話中的頁面才能訪問并且當(dāng)會(huì)話結(jié)束后數(shù)據(jù)也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲(chǔ),僅僅是會(huì)話級(jí)別的存儲(chǔ)。

例子:菜鳥教程

2、localStorage HTML5本地存儲(chǔ)web storage特性的API之一,用于將大量數(shù)據(jù)(最大5M)保存在瀏覽器中

.?保存后數(shù)據(jù)永遠(yuǎn)存在不會(huì)失效過期,除非手動(dòng)清除。

.?不參與網(wǎng)絡(luò)傳輸。

.?一般用于性能優(yōu)化,可以保存圖片、js、css、html 模板、大量數(shù)據(jù)。

3、數(shù)據(jù)以 鍵/值 (key/value)對(duì)存在, web網(wǎng)頁的數(shù)據(jù)只允許該域訪問使用

4、不管是 localStorage,還是 sessionStorage,可使用的API都相同,常用的有如下幾個(gè)(以localStorage為例):

保存數(shù)據(jù):localStorage.setItem(key,value);

讀取數(shù)據(jù):localStorage.getItem(key);

刪除單個(gè)數(shù)據(jù):localStorage.removeItem(key);

刪除所有數(shù)據(jù):localStorage.clear();

得到某個(gè)索引的key:localStorage.key(index);

5、數(shù)據(jù)儲(chǔ)存:

在有多組數(shù)據(jù)需要儲(chǔ)存時(shí),一般:

.建立一個(gè)新的對(duì)象,然后將多組數(shù)據(jù)儲(chǔ)存在對(duì)象中,

.使用 JSON.stringify() 來將對(duì)象轉(zhuǎn)換為字符串,

.使用localStorage.setItem(key,value);保存數(shù)據(jù)。

6、數(shù)據(jù)提取:

.使用localStorage.getItem(key)讀取數(shù)據(jù)

. 使用 JSON.parse 方法將字符串轉(zhuǎn)換為 JSON 對(duì)象。

. 直接引用對(duì)象的各個(gè)值。

例子:菜鳥教程

2.3、COOKIE

Cookie是什么

Cookie是當(dāng)你瀏覽某網(wǎng)站時(shí),網(wǎng)站存儲(chǔ)在你機(jī)器上的一個(gè)小文本文件, 它記錄了你的用戶ID,密碼、瀏覽過的網(wǎng)頁、停留的時(shí)間等信息,當(dāng)你再次來到該網(wǎng)站時(shí), 網(wǎng)站通過讀取Cookie,得知你的相關(guān)信息,就可以做出相應(yīng)的動(dòng)作,如在頁面顯示歡迎你的標(biāo)語, 或者讓你不用輸入ID、密碼就直接登錄等等

Cookie一般有兩個(gè)作用。

第一個(gè)作用是識(shí)別用戶身份。

比如用戶 A 用瀏覽器訪問了 http://a.com,那么 http://a.com 的服務(wù)器就會(huì)立刻給 A 返回一段數(shù)據(jù)「uid=1」(這就是Cookie)。當(dāng) A 再次訪問 http://a.com 的其他頁面時(shí),就會(huì)附帶上「uid=1」這段數(shù)據(jù)。

同理,用戶 B 用瀏覽器訪問 http://a.com 時(shí),http://a.com 發(fā)現(xiàn) B 沒有附帶 uid 數(shù)據(jù),就給 B 分配了一個(gè)新的 uid,為2,然后返回給 B 一段數(shù)據(jù)「uid=2」。B 之后訪問 http://a.com 的時(shí)候,就會(huì)一直帶上「uid=2」這段數(shù)據(jù)。

借此,http://a.com 的服務(wù)器就能區(qū)分 A 和 B 兩個(gè)用戶了。

第二個(gè)作用是記錄歷史。

假設(shè) http://a.com 是一個(gè)購物網(wǎng)站,當(dāng) A 在上面將商品 A1 、A2 加入購物車時(shí),JS 可以改寫 Cookie,改為「uid=1; cart=A1,A2」,表示購物車?yán)镉?A1 和 A2 兩樣商品了。

這樣一來,當(dāng)用戶關(guān)閉網(wǎng)頁,過三天再打開網(wǎng)頁的時(shí)候,依然可以看到 A1、A2 躺在購物車?yán)铮驗(yàn)闉g覽器并不會(huì)無緣無故地刪除這個(gè)Cookie。

借此,就達(dá)到里記錄用戶操作歷史的目的了。

Cookie的一些特點(diǎn)。

1.Cookie可以使用 js 在瀏覽器直接設(shè)置(用于記錄不敏感信息,如用戶名), 也可以在服務(wù)端通使用 HTTP 協(xié)議規(guī)定的set-cookie來讓瀏覽器種下Cookie,這是最常見的做法。

2.每次網(wǎng)絡(luò)請(qǐng)求 Request headers 中都會(huì)帶上Cookie。所以如果Cookie太多太大對(duì)傳輸效率會(huì)有影響。

3.一般瀏覽器存儲(chǔ)Cookie最大容量為4k,所以大量數(shù)據(jù)不要存到Cookie。

2.4、FORM 表單

Form表單傳值也是通過URL傳遞參數(shù)

通常使用的表單的提交方式主要是:

post和get兩種。

兩者的區(qū)別在于:post方式是把數(shù)據(jù)內(nèi)容放在請(qǐng)求的數(shù)據(jù)正文部分,沒有長度的限制;

get方式則是把數(shù)據(jù)內(nèi)容直接跟在請(qǐng)求的頭部的URL后面,有長度的限制。

而一般在表單的數(shù)據(jù)提交中,都會(huì)選擇POST方式,

因?yàn)槭褂肎ET方法數(shù)據(jù)是通過URL傳遞的,在地址欄中會(huì)直接看到傳遞的數(shù)據(jù),這樣就缺少安全性。

而使用POST傳遞時(shí),是把提交的數(shù)據(jù)放置在HTTP包的包體中,地址欄不會(huì)看到數(shù)據(jù)。



3.常見問題

既然有如此多種頁面?zhèn)鲄⒌姆绞健D敲磫栴}來就來了,在什么情況下,適合使用以上介紹的傳遞方式呢?



4.解決方案

在傳遞少量不涉及隱私的參數(shù)時(shí)可以使用直接url或者Form的GET方式傳遞,大量數(shù)據(jù)可以用POST傳遞

會(huì)話信息等可以用cookie和localStorage,臨時(shí)數(shù)據(jù)可用sessionStorage



5.編碼實(shí)戰(zhàn)


URL傳參


H5 web storage傳參


Cookie傳參


6.擴(kuò)展思考

傳參方式的優(yōu)缺點(diǎn)

6.1、URL傳參:

優(yōu)點(diǎn):取值方便,可以跨域。

缺點(diǎn):值長度有限制。

6.2、H5 Web storage:

優(yōu)點(diǎn):使用起來非常簡單、方便。

缺點(diǎn):兼容性有點(diǎn)小問題。兼容性: 現(xiàn)代瀏覽器(firefox safari chrome opera)都支持,IE8以下(不包括IE8)不支持。

6.3、Cookie傳參:

優(yōu)點(diǎn):兼容性最好,可以在同源內(nèi)的任意網(wǎng)頁內(nèi)訪問,生命期可以設(shè)置。

缺點(diǎn):值長度有限制(存儲(chǔ)的容量小),還得注意請(qǐng)求接口時(shí)別帶到http head。



7.參考文獻(xiàn)

參考一:(轉(zhuǎn))菜鳥教程

參考二:(轉(zhuǎn))知乎專欄



8.更多討論

一、為啥需要頁面之間傳參?

二、除了上述的頁面?zhèn)鲄⒎椒ㄍ猓€有哪些方法可以傳參?

三、有了頁面?zhèn)鲄ⅲ覀兊捻?xiàng)目還可以有哪種操作?

詳見視頻:


JS有哪幾種傳參方式_騰訊視頻

PPT戳這里


感謝大家觀看!

今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容