js的一些基礎概念總結

?1.變量聲明

? ? ? ? 首先js變量聲明有三種,var,const,let,這三種變量聲明中我們第一優先使用const,需要改變這個值的時候我們用ley,var是盡量不去使用。

? ? ? ? 那么我們現在來總結一下三種聲明變量的區別。首先是var let 都是定義變量。

????????

 {var a = 20}console.log(a);

? ? ? ?首先是var聲明變量這里我們輸出控制臺看到了20。因為我們var沒有塊級作用域,使用var定義的變量會直接作為全局變量。

????????

 {let b =20}console.log(b);

? ? ? ? 這里的輸出結果是會報錯, b是局部變量,只能在{}中使用。也就是說let聲明的變量有塊級作用域,而var沒有。那么作用域有什么用呢?

????????

   for (var i = 0; i < 5; i++) {console.log('循環內部', i);//能訪問到i}console.log('循環內部', i);

? ? ? ?這里還是拿到了i 因為var讓i變成了全局變量,這很明顯不符合常理,因為我們循環體中我們僅僅希望i去控制循環,并不希望去設置一個全局變量i。

????????

  for (let i = 0; i < 5; i++) {console.log('循環內部', i);//能訪問到i}console.log('循環內部', i);

? ? ? ? 使用let就只能在作用域里面訪問到i,在全局是訪問不到的。

? ? ? ? 我們在去嘗試下面的代碼。

????????

  if (true) {var b = 33}console.log(b);

? ? ? 控制臺輸出了33,很正常因為全局變量b=33.我們改一下。

????????

  if (true) {let b = 33}console.log(b);

? ? ? ?這里我們就無法訪問到b,因為只在{}這個塊級作用域里面才能訪問到b,我們在來看一種情況。

????????

  if (false) {/ var b = 33}console.log(b);

? ? ? ?這里沒有報錯,甚至輸出的是undefined,這里是因為var會引發 變量提升,就是當我們用var去聲明一個變量的時候,瀏覽器在解析代碼的時候,會優先把var聲明的變量在一開始就var聲明,所以盡管沒有賦值成功,也會默認聲明,這顯然非常不符合邏輯。所以我們開發時不去使用var。

????????

const obj = {name: '隨你'}
obj.age = 18
obj.name = "www"console.log(obj.name);console.log('obj.age', obj.age)

? ? ? ? 這里我們用const去定義一個obj對象,我們不可以直接去更改obj對象,// obj = { name: '猴子石' }不可以這樣直接對obj進行賦值,但是我們可以改變對象的內容,去添加新的對象或者覆蓋掉已經有的屬性。

? ? ? ? 總結1.var 沒有塊級作用域2.let 有塊級作用域3.const 和let類似 具有塊級作用域,但是只能賦值一次4.const 使用場景 1.對一些常量可以使用const 一般大寫字母 const PI = 3.15

????????5.對一些對象函數也可以使用const 可以避免對象和函數被意外修改 可以讓obj永遠指向后面的對象。

2.解構賦值

? ? ? ? 我們從數組里面獲取里面的元素的時候,我們最開始是用變量賦值的方式。

        let a, blet arr = ['w', 'n']a = arr[0]b = arr[1]console.log(a, b);

? ? ? ? 好像很簡單的邏輯就很麻煩寫起來。我們可以用解構賦值的語法去獲取。

         let a, blet arr = ['w', 'n'][a, b] = arr //解構賦值console.log(a, b);

? ? ? ? 這樣就非常簡便,我們甚至可以在解構賦值的時候去聲明變量。

const [a, b] = arr

? ? ? ? 這就是數組的解構賦值,但是如果有很多數組,我們希望去用數組解構的時候,就需要一一對應,或者用...b這種去讓b去接住后面所有的數組元素。

  const wrr = ['wwwww', '傻孩子', 'bailong', 'aaaa', 'ppp']// const [a, b, , c] = wrr// console.log(a, b, c);//多個解構就是一一對應,多余的就不顯示想跳過一個就,就可以// const [a, b, ...c] = wrr// console.log(a, b, c);//也可以直接...c(數組)去拿取后面所有的元素 而且這里的...c會接所有元素所以只能放最后

? ? 這就是數組的解構賦值現在我們來看對象的解構。

????????

const obj = {name: 'wwww',age: 12,gender: '難'}let a, b, c;({ name: a, age: b, gender: c } = obj) //這里用括號因為不()直接等號左邊{}不合理//要注意的是被賦值的變量在右邊,對象的屬性在左邊 比如第一個將name賦值被aconsole.log(a, b, c);//通常我們把變量名和對象的屬性名一致// const { name: name, gender: gender, age: age } = obj// console.log(name, gender, age);//然后對象可以簡寫因為左右一致,const { name, age, gender } = objconsole.log(name, age, gender);// 解構賦值還可以交換數組中變量的位置arr = [1, 2, 3]console.log(arr);[arr[1], arr[2]] = [arr[2], arr[1]]console.log(arr);// 這里把下標1,2換了位置

?和數組的解構賦值思路一樣,只不過對象需要用{}包裹,然后賦值的時候,左邊是我們對象里面的屬性,右邊是我們想要進行賦值的變量!!!,然后我們可以簡寫(往往解構的時候變量名和對象的屬性名一致),就可以直接。

????????

這樣去解構賦值,也可以用解構賦值來換取位置,方法如圖。

3.展開

????????

function fn(a, b, c) {return (a + b + c)}const arr = [1, 2, 3]//計算三個數字的和// let result = fn(arr[0], arr[1], arr[2])let result = fn(...arr)//...展開數組 ...可以展開數組console.log(result);const arr2 = [7, 8, ...arr, 4, 5, 6]//將arr淺復制給arr2console.log(arr2);//數組可以展開對象也可以const obj = {name: 'www',age: 12,gender: 'nan'}const obj2 = { gogog: 'www', ...obj, address: 'wopa', name: 'zzzz' } //把obj在新對象中展開相當于淺復制//對象是無序的如果重復了后來的覆蓋前面的console.log(obj2);

? ? ? ? ?首先我們在前面的數組結構用到了...a去表示一個數組變量,那么我們就可以用...arr去表示一個數組展開后的內容,也就是...展開數組。我們可以用...arr去傳參,相當于傳過去展開的數組,對象也可以這樣,相當于展開了對象。然后我們這里用...obj去給obj2這個對象賦值,展開之后,這里name重復后來的會覆蓋掉前面的。

4.箭頭函數

????????

const fn = function () {return 'hello'}const fn2 = a => aconsole.log(fn2(123));箭頭函數只有一個參數的函數,參數等于返回值如果沒有參數或者多個參數用()括起來()=>返回值 (a,b,c)=>{}const sum = (a, b, c) => a + b + cconst sum = (a, b, c) => ({ name: 'sun' })let result = sum(1, 2, 3)console.log(result);箭頭后面的叫做返回值  返回值必須是表達式?表達式(有返回值的語句)如果返回的是對象需要加()如果需要在箭頭函數定義邏輯,在箭頭后跟一個代碼塊代碼塊語法和普通函數一致const fn4 = (a, b) => {if (a === 10) {a += 5} else if (a === 20) {a += 10}return a + b}console.log('fn4', fn4(1, 2))

? ? ? ? ?箭頭函數是我們定義函數的另一種簡寫方式,當只有一個參數的時候,而且返回值等于參數的時候可以這樣去書寫,但是如果有多個參數的話,我們就需要給參數加一個()而且返回值必須是表達式,也就是必須要有值作為返回值,如果我們希望通過一個邏輯去返回值的話,我們就在箭頭后面跟一個代碼塊。這就是箭頭函數的使用方法。

5.箭頭函數和普通函數的區別

????????

        //箭頭函數是傳統函數表達式的簡寫方式,但是也有一些限制導致一些場景無法使用//沒有自己的this//沒有arguments//不能作為構造函數調用//無法通過call apply bind指定函數的thisfunction fn(a, b, ...args) {//用來保存函數實參arguments 類數組不能用操作數組的方法// console.log(arguments.length);//輸出的2// console.log(...arguments);//輸出的1,2console.log(...args);//用...args代替arguments更好用是真正的數組}fn(1, 2, 3, 4, 5)const fn2 = (...argus) => {// console.log(arguments);//報錯argument is undefinedconsole.log(...argus);}fn2(1, 2, 3)//箭頭函數沒有arguments(類數組)但是也可以用...argus去保存實參//箭頭函數沒有自己的thisconst fn3 = () => {console.log(this);//這里的this是window}fn3()//函數中的this是指向外層作用域(運行環境中的this)。這里fn3的作用域是全局 所以說windowconst obj = {fn4: () => {console.log(this);}}obj.fn4()//這里仍然是window因為箭頭函數沒有自己的this,它的this總是外層作用域的thisconst obj2 = {ss: function () {console.log(this);}}obj2.ss()//這里的this指向的就是obj2因為普通函數調用時看“誰點的它”(誰調用)誰調用就指向誰const obj3 = {ss: function () {const test = () => {console.log(this);}test()}}obj3.ss()//這里指向的是obj3,因為這個this就是外層作用域也就是普通函數的this,普通函數的this指向obj3所以這里指向obj3

? ? ? ? 首先箭頭函數雖然是傳統函數的簡寫方式,但是也是有一些場景無法使用的,比如沒有自己的this沒有argument保存實參,也不能作為構造函數調用,因為不能用this,也無法通過call,bind方法去指定this。如圖fn4箭頭函數中的this是外層作用域也就是obj的this,而obj是在全局中定義的,所有this指向的window。而ss這個普通函數obj2.ss輸出的this指向的obj2因為普通函數的this是說調用指向誰。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87103.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

防 XSS和CSRF 過濾器(Filter)

會話管理存在問題&#xff1a; 1.服務集群部署或者是分布式服務如何實現會話共享 2.會話的不同存儲地方的安全性問題 答&#xff1a; 會話共享 可以使用后端集中管理(redis)或者客戶端管理 &#xff08;jwt&#xff09;&#xff1b; 存儲安全性 這個還真的沒有太好的方式&…

鴻蒙容器組件 WaterFlow、FlowItem解析:動態瀑布流布局實踐

一、引言&#xff1a;不規則布局的智能化解決方案 在圖片社交、電商導購、資訊聚合等現代應用場景中&#xff0c;瀑布流布局以其靈活的空間利用率和自然的視覺流動感成為界面設計的重要選擇。鴻蒙提供的 WaterFlow 與 FlowItem 組件&#xff0c;通過智能布局算法與聲明式語法&…

概率密度基本概念

概率密度&#xff08;Probability Density&#xff09;是概率論中用于描述隨機變量分布的一種方式&#xff0c;特別適用于連續隨機變量。它并不是一個概率值&#xff0c;而是表示單位范圍內的概率大小或“濃度”。更具體地說&#xff0c;概率密度表示在某個特定值附近&#xff…

10-1 MySQL 索引優化與查詢優化

10-1 MySQL 索引優化與查詢優化 文章目錄 10-1 MySQL 索引優化與查詢優化1. 數據準備2. 索引失效案例2.1 索引字段&#xff1a;全值匹配最優2.2 索引字段&#xff1a;最佳左前綴法則2.3 主鍵插入順序2.4 索引字段進行了&#xff1a;計算、函數、類型轉換(自動或手動)導致索引失…

基于目標驅動的分布式敏捷開發

研究結論 風險對項目目標的影響 時間目標&#xff1a;需求管理不當&#xff08;如需求優先級不明確、多產品負責人需求沖突&#xff09;、架構變更導致的返工、跨站點協調問題&#xff08;如第三方依賴、通信基礎設施不足&#xff09;是影響項目時間的主要風險因素。質量目標&…

高通手機跑AI系列之——穿衣試裝算法

環境準備 手機 測試手機型號&#xff1a;Redmi K60 Pro 處理器&#xff1a;第二代驍龍8移動--8gen2 運行內存&#xff1a;8.0GB &#xff0c;LPDDR5X-8400&#xff0c;67.0 GB/s 攝像頭&#xff1a;前置16MP后置50MP8MP2MP AI算力&#xff1a;NPU 48Tops INT8 &&…

opencv入門(5)圖像像素的讀寫操作和算術運算

文章目錄 1 圖像遍歷與修改1.1 使用數組1.2 使用指針 2 圖像的算術運算2.1 一般算術操作2.2 算術API 1 圖像遍歷與修改 C中支持 數組遍歷 和 指針方式遍歷 1.1 使用數組 訪問使用 image.at(row,col) 進行訪問 如果是單通道灰度圖&#xff0c;就使用image.at進行讀取 如果是三…

Stable Diffusion入門-ControlNet 深入理解-第三課:結構類模型大揭秘——深度、分割與法線貼圖

大家好,歡迎回到Stable Diffusion入門-ControlNet 深入理解系列的第三課! 在上一課中,我們深入探討了 ControlNet 文件的命名規則,以及線條類 ControlNet模型的控制方法。如果你還沒有看過第二篇,趕緊點這里補課:Stable Diffusion入門-ControlNet 深入理解 第二課:Contr…

噴油嘴深凹槽內輪廓測量的方法探究 —— 激光頻率梳 3D 輪廓測量

引言 噴油嘴作為燃油噴射系統核心部件&#xff0c;其深凹槽內輪廓精度直接影響燃油霧化效果與發動機排放性能。噴油嘴深凹槽具有深徑比大&#xff08;可達 30:1&#xff09;、孔徑小&#xff08;φ0.5 - 2mm&#xff09;、表面質量要求高&#xff08;Ra≤0.2μm&#xff09;等…

上證ETF50期權交易規則一文詳解

50ETF期權&#xff0c;首先這是期權交易&#xff0c;所以50ETF期權有期權交易的所有特征&#xff0c;其次&#xff0c;50ETF期權的標的對象是上證50&#xff0c;所以50ETF&#xff08;認購看漲&#xff09;期權的走勢和上證50的走勢是一樣的。 行權時間&#xff1a; 在行權日當…

Oracle獲取執行計劃之10046 技術詳解

Oracle 的 10046 事件是性能調優中最常用的工具之一&#xff0c;通過跟蹤會話的 SQL 執行細節&#xff0c;生成包含執行計劃、等待事件、綁定變量等信息的跟蹤文件&#xff0c;幫助定位性能瓶頸。以下是技術詳解&#xff1a; 一、10046 事件基礎 10046 是 Oracle 內部事件&…

Linux 日志監控工具對比:從 syslog 到 ELK 實戰指南

更多云服務器知識&#xff0c;盡在hostol.com 你有沒有被 Linux 上滿屏飛滾的日志整崩潰過&#xff1f;看著 /var/log 目錄越來越肥&#xff0c;關鍵日志像大海撈針一樣藏在里面&#xff0c;每次出故障就像拆盲盒&#xff0c;賭你能不能第一眼看出問題。 日志系統&#xff0c…

本地服務器部署后外網怎么訪問不了?內網地址映射互聯網上無法連接問題的排查

我的網站部署搭建在本地服務器上的&#xff0c;在內網可以正常訪問&#xff0c;但是外網無法訪問&#xff0c;該怎么排查&#xff1f;局域網內部經過路由器的&#xff0c;有設置了虛擬服務器轉發規則&#xff0c;在互聯網公網上還是無法訪問服務器怎么辦&#xff1f;相信很多人…

如何免費正確安裝微軟的office全家桶

記錄一下如何正確安裝微軟的office全家桶 找到安裝包傻瓜式安裝 找到安裝包 安裝包在附件&#xff0c;大家可以自行進行下載 傻瓜式安裝 操作一目了然&#xff0c;點你需要的就行了

論文閱讀:BLIPv1 2022.2

文章目錄 一、研究背景與問題現有方法的局限性研究目標 二、核心方法與創新點多模態編碼器 - 解碼器混合架構&#xff08;MED&#xff09;標題生成與過濾&#xff08;CapFilt&#xff09;數據自舉方法 三、實驗與結果數據集與訓練配置關鍵實驗發現與 state-of-the-art 方法的對…

630,百度文心大模型4.5系列開源!真香

2025年被普遍認為是AI Agent商業化的關鍵之年&#xff0c;而大模型正是Agent能力的核心支撐。 當開發成本大幅降低&#xff0c;我們很可能看到各種垂直領域的Agent應用如雨后春筍般涌現。 技術普惠的現實意義對于廣大AI創業者和開發者來說&#xff0c;這無疑是個好消息。 之…

數據結構:遞歸:斐波那契數列(Fibonacci Sequence)

目錄 什么是斐波那契數列&#xff1f; 用遞歸推導Fibonacci 復雜度分析 用迭代推導Fibonacci 復雜度分析 遞歸優化&#xff1a;記憶化遞歸&#xff08;Memoized Recursion&#xff09; 復雜度分析 什么是斐波那契數列&#xff1f; 斐波那契數列&#xff08;Fibonacci Seq…

ArcGIS Pro利用擦除工具,矢量要素消除另一矢量部分區域

選擇“System Toolboxes”→“Analysis Tools.tbx”→“Overlay”→“Erase&#xff08;擦除&#xff09;”。 原始 擦除后

Linux: network: 性能 pause

最近看到一個問題,是關于網卡的throughput的性能問題,后來在ethtool-S里看到有pause的counter,這個也是網絡性能問題的一個分析方向。算是學到了新的知識點。 $ grep -i -e 2025- -e pause ethtool*ens2f1np1 | grep -v -e ": 0\$" | headtail 4====

目標檢測系列(五)已標注數據集(yolo格式)導入labelstudio繼續標注

目錄 1、labelstudio安裝 2、yolo(txt)轉json 3、COCO轉yolo(僅針對coco格式標注信息) 4、設置環境變量并啟動labelstudio 5、進入label studio創建工程并設置任務標簽 6、安裝http-server并啟動文件映射服務 7、進入label studio導入json文件即可 1、labelstudio安裝 …