JavaScript 變量與運算符全面解析:從基礎到高級應用

????????昨天學長說可以放緩一下學習進度,剛好最近期末復習也不是很緊張,所以來重新復習一下js的一些知識點。


一:變量

(1)變量聲明

來簡單看一下變量的一些知識點。首先是變量聲明:變量聲明盡量使用數組字母下劃線 來舉幾個例子:

//聲明變量盡量使用 字母數字下劃線
const web ='1',name='2';
const qianduan =houduan = quanhzan='money'
console.log(qianduan);
console.log(houduan);
console.log(quanhzan);
//js是弱數據類型語言 
// typeof 可以查看變量的類型
console.log(typeof web);

我們可以連續聲明多個變量 也可以使用typeof來檢查變量的數據類型,來看看輸出結果

?(2)變量提升

變量提升的問題出現在使用var關鍵詞聲明的變量,來看個例子

//通過var聲明的變量會變量提升
console.log(web)//在運行代碼,會執行一個解析,會將var聲明的變量做一個提前 但是提前的只是聲明
var web='houdunren'

運行之后我們發現結果沒有報錯 也是undefined 這說明var造成的變量提升 只是提升了聲明過程,但是忽略了賦值過程。那么下面我將展示一段錯誤代碼:

function hd(){if(false){var web='111'}console.log(web)
}
hd()

來運行一下看看??

發現結果是undefined 本質上就是變量提升造成的問題,在執行代碼之前var就將代碼的聲明提前到最上方 所以函數直接就將未賦值的web打印出來了。所以現在的前端代碼為了避免變量提升造成的困擾,建議使用let或const來聲明變量或常數。

(3)let與const聲明變量與TDZ時間死區

鑒于var聲明所帶來的缺陷 現在使用let與const 這類具有臨時性死區(tdz)的關鍵詞避免變量提升的問題。(知道就行 不過還是建議了解一下時間死區)時間死區:是指變量從進入作用域到被實際聲明的一段時間,在這段時間里面 訪問該變量會導致錯誤從而不被提前使用。簡單來說就是變量提升被一個錯誤(ReferenceError)阻斷了。這里我就不舉實例了。

(4)全局污染

我們先來看一個例子:

function  show() {web='houdunren'
}
show()
console.log(web);

來看看運行結果:

神奇的發現我們并未實際聲明web這個變量 但是web變量確實被輸出了 并且輸出的作用域是全局作用域 這就是全局污染。那么這就會造成一些問題 比如 我們在編寫代碼之前已經提前引入了第三方庫或者其他js文件 這些文件中如果存在同名的變量就會被污染

所以js中所有的變量一定要先聲明后使用。

(5) 變量凍結

繼續先看一個例子:


const HOST={url:'https://www.houdunren.com/api',port:443
};
// 對象凍結 凍結之后代碼不再可以修改
Object.freeze(HOST);
HOST.port=80; 
console.log(HOST);

聲明了一個HOST對象變量 使用了Object.freeze方法之后對象里面的數據就不可被修改了

(6)傳值與傳址

對于簡單的數據類型 在傳遞值的時候是直接把數值傳遞過去的;但是對于復雜數據類型(對象,數組等),在傳遞值的時候是將自身數據的內存地址賦值過去的 問題就是當其中一個值發生變動的時候 同地址的另一個變量的值也會變化

//這里是傳值 因為簡單數據類型占用空間小 所以會直接開辟一塊空間
let a=1;
let b=a;
//這里是傳址 因為對象等復雜數據類型占用空間很大 所以會賦值前者的地址給后者 
// 造成的問題是兩者之間有一個人出現改動 后者的值也會被改動 
// 解決方法是使用深淺拷貝來避免 
let e={};
let f=e;

解決辦法也很好解決 就是使用深淺拷貝。對于深淺拷貝另見我的對象那篇文章(附圖)

(7)null與undefined

對于簡單數據類型來說 聲明未賦值 輸出的就是undefined 說明值的沒有定義的;對于復雜數據(數組 對象)來說聲明之后沒有具體值 輸出之后就是null 可以理解成復雜數據類型就是一個書包 書包沒東西那肯定就是null了

二:運算符與邏輯控制

(1)短路邏輯

短路邏輯常備用來設定默認值 與簡單的條件執行語句 我們直接來看看例子吧

let a=0;
let b=1
if(a||b){console.log('nihao');
}

只有a或b同時為0 的時候才不會輸出。

let f=a||b;
console.log(f);

當a是0的時候 f 就被賦值成 b

function star(num){return '*'.repeat(num||1)//repaat(重復次數)
}
console.log(star(123));

如果沒有輸入參數的時候 函數只返回一個 *

(2)do while循環

do while循環是一定會執行一次循環體的 簡單來看幾個例子

打印三角形

let start=0;
do{let n=0;let line = "";  // 創建一個空字符串來存儲當前行的星號do{line += "*";  // 將星號添加到字符串中}while(++n<=start)console.log(line);  // 打印完整的行
}while(++start<=5)
// 但是以我個人主見 使用for循環來完成這個效果是更好的

?

(3)打印正三角型

for(let i=0;i<10;i++){for(let j=10-i;j>0;j--){process.stdout.write(' ')}for(let j=i*2-1;j>0;j--){process.stdout.write('*')}process.stdout.write('\n')}

?這里的?process.stdout.write()是在控制臺單行輸出不自動換行的一種方法 不過基本被棄用了

(4)label(類似于goto 但不同)

當函數運行到break outerLoop的時候 直接跳出指定的循環 直接看例子吧

// 標簽(label)配合break使用的例子
outerLoop: 
for(let i = 0; i < 3; i++) {innerLoop:for(let j = 0; j < 3; j++) {console.log(`i=${i}, j=${j}`);if(i === 1 && j === 1) {break outerLoop; // 直接跳出外層循環}}
}

?因為inner標簽來第一層循環里面 所以當運行到breakj outerloop的時候就直接跳出了第一層循環(被標記的循環)? ,來看看輸出結果

?(5)for in 與 for of

for in可以遍歷數組和對象 同樣的for of也可以遍歷數組 也可以遍歷字符串 如果使用for of來遍歷對象 必須先獲取鍵名或者值 可能說的很抽象 那直接來看例子

定義一個數組和對象

let obj={uname:'123',age:12,gender:'女'
}
const arr=[1,2,3,45,5,6]

1.使用for in 遍歷對象的屬性

// 遍歷對象屬性
for(let k in obj){console.log(obj[k]);
}

2.使用for in遍歷數組的值

// 遍歷數組 
for (const key in arr) {console.log(arr[key]); 
}  

3.推薦使用for of遍歷數組

for (const value of arr) {console.log(value); // 輸出: 1, 2, 3, 45, 5, 6
}

4.使用for of遍歷字符串

const str = "hello";
for (const char of str) {console.log(char); // 輸出: h, e, l, l, o
}

5.使用for of遍歷Map集合(鍵值對集合)

const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {console.log(key, value); // 輸出: a 1, b 2
}

6.for of遍歷對象的三種類型


// 6. 如果要遍歷對象,可以先獲取其鍵、值或條目
// 方法1: 遍歷對象的鍵
for (const key of Object.keys(obj)) {console.log(key, obj[key]);
}// 方法2: 遍歷對象的值
for (const value of Object.values(obj)) {console.log(value);
}// 方法3: 遍歷對象的鍵值對
for (const [key, value] of Object.entries(obj)) {console.log(key, value);
}

o而k之,感謝閱讀,拜拜

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

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

相關文章

移動語義對性能優化的具體示例

前言 本文章對比了&#xff1a;小中大字符串在普通傳值、傳值移動、傳左值引用、傳右值引用、模板完美轉發、內聯版本等多種測試&#xff0c;對比各個方式的性能優異&#xff1a; 測試代碼1 #include <iostream> #include <string> #include <chrono> #incl…

C/C++ 和 OpenCV 來制作一個能與人對弈的實體棋盤機器人

項目核心架構 整個系統可以分為四個主要模塊&#xff1a; 視覺感知模塊 (Vision Perception Module): 任務: 使用攝像頭“看懂”棋盤。工具: C, OpenCV。功能: 校準攝像頭、檢測棋盤邊界、進行透視變換、分割 64 個棋盤格、識別每個格子上的棋子、檢測人類玩家的走法。 決策模…

SpringBoot擴展——日志管理!

Spring Boot擴展 在Spring Boot中可以集成第三方的框架如MyBatis、MyBatis-Plus和RabbitMQ等統稱為擴展。每一個擴展會封裝成一個集成&#xff0c;即Spring Boot的starter&#xff08;依賴組件&#xff09;。starter是一種非常重要的機制&#xff0c;不需要煩瑣的配置&#xf…

【JSON-To-Video】AI智能體開發:為視頻圖片元素添加動效(滑入、旋轉、滑出),附代碼

各位朋友們&#xff0c;大家好&#xff01; 今天要教大家如何在 JSON - To - Video 中為視頻內圖片元素添加滑入、旋轉、滑出的動效。 如果您還不會封裝制作自己的【視頻工具插件】&#xff0c;歡迎查看之前的教程&#xff01; AI智能體平臺&#xff0c;如何封裝自定義短視頻…

Spring Boot(九十二):Spring Boot實現連接不上數據庫就重啟服務

場景: 在線上部署時,若服務器因斷電等原因意外重啟,項目及其依賴的數據庫服務通常需要配置為自動啟動。此時,如果數據庫服務啟動較慢或失敗,Spring Boot 項目會因無法建立數據庫連接而啟動失敗。 需求: 為確保項目啟動成功,需要讓 Spring Boot 項目等待數據庫服務完全就…

Debian配置Redis主從、哨兵

前言 Redis的下載安裝可參考Centos安裝配置Redis6.x&#xff0c;Centos和Debian的步驟基本類似&#xff0c;或自行在網上搜索相關資料 注意&#xff1a;遠程連接需放開相應端口 主從 搭建一個一主二從的主從模式 處理conf文件 #進入redis所在目錄 cd /tools/redis/redis6 …

虛實交融:數字孿生如何重塑交通與公路勘察設計的未來

當每一條道路、每一座橋梁、每一盞信號燈都在數字世界獲得“永生副本”&#xff0c;交通系統從被動響應邁入主動預演的紀元 一、數字孿生的核心定義&#xff1a;超越鏡像的動態認知引擎 數字孿生&#xff08;Digital Twin&#xff09;并非簡單的三維可視化模型&#xff0c;而是…

vector模擬實現中的迭代器失效問題

首先來看一組代碼&#xff1a; iterator insert(iterator pos, const T& x) {// 擴容if (_finish _end_of_storage){size_t len pos - _stare;reserve(capacity() 0 ? 4 : capacity() * 2);pos _stare len;}iterator end _finish - 1;while (end > pos){*(end…

java 設計模式_行為型_22模板模式

22.模板模式 模板方法&#xff08;Template Method&#xff09;作為Java的設計模式之一&#xff0c;一個詞概括其優勢特點那就是&#xff1a;抽象步驟 首先我們應該抽出共通的東西做一個父類&#xff08;Base類&#xff09;&#xff0c;其次具體的蛋糕制作由子類進一步實現&…

隨記:在springboot中websocket的使用

我現在有兩種方法 第一種&#xff1a;使用java封裝的這個包下的javax.websocket.* 先配置這個配置類 import com.alibaba.nacos.common.utils.CollectionUtils; import org.springframework.stereotype.Component;import javax.websocket.HandshakeResponse; import javax.w…

技術文章大綱:SpringBoot自動化部署實戰

技術文章大綱&#xff1a;SpringBoot自動化部署實戰 概述 自動化部署的背景與意義SpringBoot在現代化部署中的優勢常見自動化部署工具與方案概覽&#xff08;Jenkins、Docker、K8s等&#xff09; 環境準備 基礎工具要求&#xff1a;JDK、Maven/Gradle、Git服務器環境配置&a…

FastAdmin按鈕類功能全解析 class 屬性定義不同的交互行為

在 FastAdmin 中&#xff0c;超鏈接的 class 屬性用于定義不同的交互行為和樣式。以下是常見 class 配置的用途和區別&#xff1a; btn-dialog 用于觸發彈出對話框行為。點擊帶有此 class 的鏈接或按鈕時&#xff0c;FastAdmin 會自動加載指定的 URL 內容并在模態框中顯示。通…

python3字典對象實現解析

文章目錄 前言Raymond的方案字典結構字典創建字典插入插入空字典PyDictKeysObject的創建設置索引存儲entry 插入非空字典調整大小字典查找聯合字典插入 字典查詢字典刪除 前言 本來以為python字典的實現就是一個哈希表的普通實現&#xff0c;所以在學習基本類型時沒去仔細研究…

Word2Vec介紹

前言 當今的大語言模型非常智能&#xff0c;但是你有沒有想過這些事情&#xff1a; 機器是怎么理解“國王”和“王后”之間的關系&#xff1f; “貓”和“狗”是怎么在 AI 中“相似以及區分”的&#xff1f; 文本又是怎么變成模型能讀懂的數字&#xff1f; 這一切&#xf…

Rsync+sersync實現數據實時同步(小白的“升級打怪”成長之路)

目錄 一、rsync部署 push推數據 1、編寫rsync配置文件 2、備份測試 3、檢驗結果 二、rsyncsersync 實現數據實時同步 1、安裝sersync服務 2、檢驗結果 pull拉取數據 1、編寫rsync配置文件 2、檢驗結果 三、腳本編寫 1、客戶端腳本編寫 2、服務器腳本編寫 一、rsy…

用 python 開發一個可調用工具的 AI Agent,實現電腦配置專業評價

在人工智能時代&#xff0c;AI Agent憑借其強大的任務處理能力&#xff0c;逐漸成為開發人員手中的得力工具。今天&#xff0c;我們就來一起動手&#xff0c;用Python打造一個能夠調用工具的AI Agent&#xff0c;實現根據電腦信息對電腦配置進行專業評價的功能。 一、項目創建…

WSL 安裝使用和常用命令

參考官方使用說明&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/ 安裝wsl: wsl --install --no-distribution --no-distribution&#xff1a;安裝 WSL 時不要安裝分發版 更新 wsl: wsl --update 設置wsl 默認版本&#xff1a; wsl --set-default-version <…

720全景VR拍攝制作實戰教程

720全景VR拍攝制作實戰教程 720全景VR拍攝制作是近年來興起的一種沉浸式影像制作技術。它通過多角度拍攝&#xff0c;并將畫面拼接成一個全景視角&#xff0c;使觀眾獲得身臨其境的觀看體驗。本教程將帶你從準備階段到拍攝階段&#xff0c;再到后期處理階段&#xff0c;一步步…

什么真正的云原生開發?如何區別本地開發后部署到云端?

以下是關于云原生開發的深度解析&#xff0c;以及與本地開發后遷移上云的本質區別&#xff1a; 一、真正的云原生開發&#xff1a;從理念到實踐的全面革新 1. 定義與核心思想 云原生開發是一種以云計算能力為核心的架構設計和開發方法論&#xff0c;其本質是讓應用從誕生之初…

從代碼學習深度學習 - 詞的相似性和類比任務 PyTorch版

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言加載預訓練詞向量TokenEmbedding 類詳解預訓練詞向量簡介 (GloVe)具體含義總結建議應用預訓練詞向量詞相似度knn 函數get_similar_tokens 函數相似詞查找示例詞類比get_analogy 函數詞類比任務…