前端開發過程中經常遇到的問題以及對應解決方法 (持續更新)

我的朋友已經工作了 3?年,他過去一直擔任前端工程師。

不幸的是,他被老板批評了,因為他在工作中犯了一個錯誤,這是一個非常簡單但容易忽視的問題,我想也是很多朋友容易忽視的一個問題。

今天我把它分享出來,希望能夠幫助到你,也希望大家遇到這個情況時,不要再放這個錯誤。

錯誤的描述

問題可能是這樣的,Lily在公司負責一個重大項目,其中一個模塊是顯示一條與數字相關的信息,這是后端工程師界面返回的信息(僅舉例)

@RestController
@RequestMapping("/getInfo")
public class YupiTestController {@GetMappingpublic Long getNum() {return 123456789123456789L;}   
}

各位小伙伴,我們調用getInfo接口會返回什么信息呢?會是 123456789123456789 嗎?

通過chrome瀏覽器的調試工具可以看到,似乎一切都和我們想象的一樣,結果是123456789123456789。

但是,頁面顯示的結果是123456789123456780,最后一位是0而不是9。

這到底是怎么回事?這太奇怪了,是不是有點崩潰。

分析出現問題的原因

現在,我們一起來分析一下原因。

我嘗試分析返回的數字,發現只有當數字超過16位時才會出現最后幾位不一致的問題。

是不是因為數字太大,出現了精度損失?

Java語言中的Long類型是64位的,JavaScript語言中的Long類型是小于64位的嗎?

天哪,JavaScript 似乎沒有 Long 類型的數據!

實際上,在 JavaScript 中,我們使用 Number 來表示類型 number 的值。

Number 類型的總長度為 64 位。64位大致就是這樣分配的,其中53位代表小數位,10位代表指數位,1位代表符號位。因此,Number 整數的表示范圍為 -2^53 ~ 2^53。

讓我們嘗試在控制臺上輸出 JavaScript 中的最大值和最小值。

在其他語言中,例如 Java,Long 類型占用 64 個二進制位,最大值為 9223372036854774807 (2?3 — 1),長度約為 19 位。

在 JavaScript 中,由于 Number 類型的值也包含小數,所以最大值為 9007199254740993 (2^53 - 1),長度約為 16 位。

所以當Java向JSON返回16位以上的Long類型字段時,前端JavaScript獲取的數據會因為溢出而失去精度。

如何解決這個問題呢?

也許我們可以嘗試在前端解決這個問題,但我認為我們應該尋求后端工程師的幫助。

我們應該將可能超出范圍的數字類型(Long)變量轉換為字符串類型(String)。這個是我的個人處理方法。

遇到的問題

但隨后沒過多久,手機報警短信就飛來了。報警的服務器并不是剛剛的 Node 集群,而是『時序數據庫』InfluxDB。

觀察了下機器的內存與 CPU 開銷走勢,可以發現:應用接入后幾小時內,機器的內存持續在上漲,最終造成 OOM,服務不可用。并且在管理后臺上觸發的一條 SQL 查詢,幾乎會耗盡整臺數據庫機器的 CPU 資源。

當時答主內心想的是:“完了,開發了幾個月的產品, 上線后,盡然是這樣的,年終獎沒了不要說,明年回來,肯定要重新找工作了,我不僅坑了自己,還坑了我的主管” ,當時的內心可謂極度惶恐。

解決問題的方式

經歷過一番內心掙扎后,覺得這樣惶恐下去,解決不了問題,然后就冷靜下來,盡可能地去查找時序數據庫 InfluxDB 相關的分享文章,希望能從中找到一些性能瓶頸相關的資料。幸運的是,在餓了么團隊的一次分享中,我找到一點引起問題的線索,然后開始從數據庫表結構設計、計算查詢優化等方面著手,逐步地進行了優化。

你有哪些好的處理方法呢,歡迎在留言分享。

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

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

相關文章

Linux三劍客(grep、awk和sed)操作及與管道結合使用

1. 總覽 grep、sed和awk被稱為Linux三劍客,是因為它們在文本處理和數據操作方面極其強大且常用。 Linux三劍客在文件處理中的作用: grep(數據查找定位):文本搜索工具,在文件中搜索符合正則表達式的文本內容…

Redis原理-數據結構

Redis原理篇 1、原理篇-Redis數據結構 1.1 Redis數據結構-動態字符串 我們都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可見字符串是Redis中最常用的一種數據結構。 不過Redis沒有直接使用C語言中的字符串,因為C語言字符串存…

【大模型LLM面試合集】大語言模型架構_attention

1.attention 1.Attention 1.1 講講對Attention的理解? Attention機制是一種在處理時序相關問題的時候常用的技術,主要用于處理序列數據。 核心思想是在處理序列數據時,網絡應該更關注輸入中的重要部分,而忽略不重要的部分&…

BJT的結構(晶體管電壓/電流+β+晶體管特性曲線/截止與飽和+直流負載線(Q點))+單片機數碼管基礎

2024-7-8,星期一,20:23,天氣:晴,心情:晴。今天沒有什么特殊的事情發生,周末休息了兩天,周一回來繼續學習啦,加油加油!!! 今日完成模電…

視頻號矩陣管理系統:短視頻內容營銷的智能助手

隨著短視頻行業的蓬勃發展,視頻號矩陣管理系統應運而生,為內容創作者和品牌提供了一站式的短視頻管理和營銷解決方案。本文將深入探討視頻號矩陣管理系統的核心功能,以及它如何助力用戶在短視頻營銷領域取得成功。 視頻號矩陣管理系統概述 …

在PyTorch中使用TensorBoard

文章目錄 在PyTorch中使用TensorBoard1.安裝2.TensorBoard使用2.1創建SummaryWriter實例2.2利用add_scalar()記錄metrics2.3關閉Writer2.4啟動TensorBoard 3.本地連接服務器使用TensorBoard3.1方法一:使用SSH命令進行本地端口轉發3.2方法二:啟動TensorBo…

Python 全棧體系【三階】(二)

第一章 Django 五、模板 1. 概述 Django中的模板是指可以動態生成任何基于文本格式文件的技術(如HTML、CSS等)。 Django中內置了自己的模板系統,稱為DTL(Django Template Language), Django模板語言。 2. 配置 settings.py中關于模板的…

如何將資源前端通過 Docker 部署到遠程服務器

作為一個程序員,在開發過程中,經常會遇到項目部署的問題,在現在本就不穩定的大環境下,前端開發也需要掌握部署技能,來提高自己的生存力,今天就詳細說一下如何把一個前端資源放到遠程服務器上面通過docker部…

紫外線芯片殺菌燈問題

1.265nm深紫外光子能量是多少 504kj/mol 2.紫外光分解有害物質的原理是什么? 通過紫外光分子鍵打斷有害物質的分子鍵,使其分解成co2和H2o等無害物質 3.紫外光殺菌的原理是什么? 通過特定波長的紫外光照射,破壞和改變微生物的…

【網絡協議】PIM

PIM 1 基本概念 PIM(Protocol Independent Multicast)協議,即協議無關組播協議,是一種組播路由協議,其特點是不依賴于某一特定的單播路由協議,而是可以利用任意單播路由協議建立的單播路由表完成RPF&…

【Python】不小心卸載pip后(手動安裝pip的兩種方式)

文章目錄 方法一:使用get-pip.py腳本方法二:使用easy_install注意事項 不小心卸載pip后:手動安裝pip的兩種方式 在使用Python進行開發時,pip作為Python的包管理工具,是我們安裝和管理Python庫的重要工具。然而&#x…

產品經理技能揭秘:如何巧妙啟發需求,引領市場新潮流

文章目錄 引言一、需求啟發的定義二、需求啟發的藝術三、需求啟發的重要性四、需求啟發的流程五、需求啟發的問題與挑戰內部自身的問題與挑戰:挑戰一:知識的詛咒挑戰二:做與定義的不同挑戰三:溝通障礙挑戰四:需求變更頻…

solidity:構造函數和修飾器、事件

構造函數? 構造函數(constructor)是一種特殊的函數,每個合約可以定義一個,并在部署合約的時候自動運行一次。它可以用來初始化合約的一些參數,例如初始化合約的owner地址: address owner; // 定義owner變…

電腦找回徹底刪除文件?四個實測效果的方法【一鍵找回】

電腦數據刪除了還能恢復嗎?可以的,只要我們及時撤銷上一步刪除操作,還是有幾率找回徹底刪除文件。 當我們的電腦文件被徹底刪除后,盡管恢復的成功率可能受到多種因素的影響,但仍有幾種方法可以嘗試找回這些文件。本文整…

使用 docker buildx 構建跨平臺鏡像

buildx是Docker官方提供的一個構建工具,它可以幫助用戶快速、高效地構建Docker鏡像,并支持多種平臺的構建。使用buildx,用戶可以在單個命令中構建多種架構的鏡像,例如x86和arm架構,而無需手工操作多個構建命令。此外bu…

【React Hooks原理 - useCallback、useMemo】

介紹 在實際項目中,useCallback、useMemo這兩個Hooks想必會很常見,可能我們會處于性能考慮避免組件重復刷新而使用類似useCallback、useMemo來進行緩存。接下來我們會從源碼和使用的角度來聊聊這兩個hooks。【源碼地址】 為什么要有這兩個Hooks 在開始…

使用selenium定位input標簽下的下拉框

先來看一下頁面效果&#xff1a;是一個可輸入的下拉列表 再來看一下下拉框的實現方式&#xff1a; 是用<ul>和<li>方式來實現的下拉框&#xff0c;不是select類型的&#xff0c;所以不能用傳統的select定位方法。 在著手定位元素前一定一定要先弄清楚下拉列表…

前后端的學習框架

前后端的學習框架 視頻鏈接&#xff1a;零基礎AI全棧開發系列教程&#xff08;一&#xff09;_嗶哩嗶哩_bilibili

什么是后端?

1、什么是后端&#xff1f; 后端開發人員從事于構建Web應用程序背后的實際邏輯&#xff0c;負責通過API向前端或者其他系統提供其他需要的信息&#xff0c;如&#xff1a;數據。 實際上&#xff0c;開發web應用中對用戶不可見的部分&#xff0c;稱為web后端&#xff0c;也就是…

初學vue3與ts:獲取組件ref實例

/*** 獲取組件ref* param {VueComponentIns} 組件實例* returns 組件ref*/ // eslint-disable-next-line export function useCompRef<T extends abstract new (...args: any) > any>(_: T) {return ref<InstanceType<T>>(); }使用 <a-com ref"a…