日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

JavaScript如何優雅地告別Cannot read properties of undefined,Optional類體驗

來源: 責編: 時間:2024-05-16 09:10:08 159觀看
導讀相信很多開發者在開發中經常遇到的一個報錯:Uncaught TypeError: Cannot read properties of undefined.圖片作為一名熟練的前端攻城獅,你一眼就能這是由于讀取一個對象屬性時,對象為 undefined 時導致的。要想避免,我們

相信很多開發者在開發中經常遇到的一個報錯:iB628資訊網——每日最新資訊28at.com

Uncaught TypeError: Cannot read properties of undefined.iB628資訊網——每日最新資訊28at.com

圖片圖片iB628資訊網——每日最新資訊28at.com

作為一名熟練的前端攻城獅,你一眼就能這是由于讀取一個對象屬性時,對象為 undefined 時導致的。iB628資訊網——每日最新資訊28at.com

要想避免,我們需要做下判斷。iB628資訊網——每日最新資訊28at.com

let a = fetch(url, params);a?.result?.map(console.log);

或者你使用 try catch 結構來捕獲異常。iB628資訊網——每日最新資訊28at.com

try {  let a = fetch(url, params);  a.result.map(console.log);} catch (err) {  console.log(err);}

當然,我們還有很多其他的選擇,這里就不一一列舉了。iB628資訊網——每日最新資訊28at.com

接下來我介紹一種我最新學到的方案——Java 的 Optional 類。iB628資訊網——每日最新資訊28at.com

Optional 類是 Java 中解決空指針異常(NullPointerException)的一種方案。(它和 Cannot read properties of undefined 是一樣的錯誤),我們看看沒有 Optional 類的情況。iB628資訊網——每日最新資訊28at.com

String str = null;// System.out.println(appendTest.toString());// 上面會觸發:NullPointerException,下面是常見的應對方法if (str !== null) {    System.out.println(str.toString());} else {    System.out.println("str is null!!!");}

但是使用 Optional 就優雅的多了。iB628資訊網——每日最新資訊28at.com

String str = null;// 生成Optional類,ofNullablebiao 生成可以為null的對象Optional<String> optional = Optional.ofNullable(name);

生成 Optional 類還有 of 方法,不同的是不能為 null,否則調用 ifPresent 依然會報錯 NullPointerException。iB628資訊網——每日最新資訊28at.com

ifPresent: 如果存在就打印它,否則不進行任何操作。iB628資訊網——每日最新資訊28at.com

optional.ifPresent(str -> System.out.println(str));// 等價于optional.ifPresent(System.out::println);

orElseGet:如果存在就返回它,否則執行后面的表達式。iB628資訊網——每日最新資訊28at.com

optional.orElseGet(() -> System.out.println("str is null!!"));

除此之外還有很多有意思的接口,比如我們熟悉的:map、flatmap、filter 等。iB628資訊網——每日最新資訊28at.com

需要注意的是,因為 Optional 是一個容器類,它的方法返回的仍然是 Optional 對象,所以你可以繼續對返回的 Optional 對象進行鏈式調用。例如:iB628資訊網——每日最新資訊28at.com

import java.util.Optional;public class Person {    // something}public class Main {    public static void main(String[] args) {        // 創建一個可能為 null 的 Person 對象        Person person = new Person("John Doe", 30);        // 使用 Optional 對象進行鏈式調用        Optional<Person> optionalPerson = Optional.ofNullable(person)                .filter(p -> p.getAge() >= 18)                .map(p -> new Person(p.getName().toUpperCase(), p.getAge())                .flatMap(p -> Optional.of(new Person(p.getName(), p.getAge() + 1)));        // 輸出結果        optionalPerson.ifPresent(p -> System.out.println("Name: " + p.getName() + ", Age: " + p.getAge()));    }}

更多信息可以看下面這張截圖:iB628資訊網——每日最新資訊28at.com

圖片圖片iB628資訊網——每日最新資訊28at.com

這些方法像極了 javascript 的數組方法,但是他們的區別是,在 Java 中,Optional 類主要用于包裝單個對象,以表示一個可能存在或可能不存在的值。它并不直接支持包裝數組。iB628資訊網——每日最新資訊28at.com

讓我們回到 javascript,這種方案似乎可以很好的解決前端的問題。好奇的搜索 GitHub,這種方案有很多 javascript 版本的實現。iB628資訊網——每日最新資訊28at.com

例如:https://github.com/JasonStorey/Optional.jsiB628資訊網——每日最新資訊28at.com

const Optional = require("optional-js");// Define some simple operationsconst getUserId = (username) => (username === "root" ? 1234 : 0);const verify = (userId) => userId === 1234;const login = (userId) => console.log("Logging in as : " + userId);// Declare a potentially undefined valueconst username = process.argv[2];// Wrap username in an Optional, and build a pipeline using our operationsOptional.ofNullable(username).map(getUserId).filter(verify).ifPresent(login);

這看起來妙極了!!!iB628資訊網——每日最新資訊28at.com

那么這種方案是怎么實現的呢?關鍵是函數返回值依然是個 Optional 對象。下面我們簡單的實現一下這個過程。iB628資訊網——每日最新資訊28at.com

class Optional {  constructor(value) {    this.value = value;  }  static of(value) {    return new Optional(value);  }  isPresent() {    return this.value !== undefined && this.value !== null;  }  map(mapper) {    if (this.isPresent()) {      const mappedValue = mapper(this.value);      return Optional.of(mappedValue);    }    return Optional.ofNullable(null);  }  flatMap(mapper) {    if (this.isPresent()) {      const mappedValue = mapper(this.value);      if (mappedValue instanceof Optional) {        return mappedValue;      }      return Optional.ofNullable(mappedValue);    }    return Optional.ofNullable(null);  }  orElse(defaultValue) {    return this.isPresent() ? this.value : defaultValue;  }  static ofNullable(value) {    return Optional.of(value);  }}function getNameLength(person) {  return Optional.ofNullable(person)    .map((p) => p.name)    .map((name) => name.length)    .orElse(0);}const person = { name: "John Doe" };console.log(getNameLength(person)); // 輸出:8const emptyPerson = null;console.log(getNameLength(emptyPerson)); // 輸出:0

你覺得這個方案可以嗎?相信大家讀到這里心中已經有答案了吧?iB628資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-88388-0.htmlJavaScript如何優雅地告別Cannot read properties of undefined,Optional類體驗

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 面試官:你的系統,是如何建模的?

下一篇: Java EE更名Jakarta EE對程序開發影響,你知道嗎?

標簽:
  • 熱門焦點
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • 7月4日見!iQOO 11S官宣:“雞血版”驍龍8 Gen2+200W快充加持

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
Top 主站蜘蛛池模板: 濮阳县| 刚察县| 淮滨县| 灵台县| 尤溪县| 化州市| 岳池县| 石渠县| 瑞安市| 平谷区| 镇巴县| 云霄县| 唐山市| 龙里县| 赞皇县| 荔浦县| 开鲁县| 宁化县| 潮州市| 宜川县| 嘉荫县| 高密市| 镇巴县| 武清区| 弋阳县| 东莞市| 四会市| 蒙阴县| 百色市| 邹平县| 文水县| 虎林市| 贵南县| 青川县| 灌阳县| 富锦市| 德令哈市| 广安市| 通化市| 潼关县| 洛阳市|