AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

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

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

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

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

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

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

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

Optional 類是 Java 中解決空指針異常(NullPointerException)的一種方案。(它和 Cannot read properties of undefined 是一樣的錯誤),我們看看沒有 Optional 類的情況。H2w28資訊網——每日最新資訊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 就優雅的多了。H2w28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

需要注意的是,因為 Optional 是一個容器類,它的方法返回的仍然是 Optional 對象,所以你可以繼續對返回的 Optional 對象進行鏈式調用。例如:H2w28資訊網——每日最新資訊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()));    }}

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

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

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

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

例如:https://github.com/JasonStorey/Optional.jsH2w28資訊網——每日最新資訊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);

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

那么這種方案是怎么實現的呢?關鍵是函數返回值依然是個 Optional 對象。下面我們簡單的實現一下這個過程。H2w28資訊網——每日最新資訊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

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

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

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

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

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

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 三言兩語說透設計模式的藝術-單例模式

    寫在前面單例模式是一種常用的軟件設計模式,它所創建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統中的其他對象共享,從而減少
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • AI藝術欣賞體驗會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術欣賞體驗會”在上海
  • 榮耀Magic4 至臻版 首創智慧隱私通話 強勁影音系統

    2022年第一季度臨近尾聲,在該季度內,許多品牌陸續發布自己的最新產品,讓大家從全新的角度來了解當今的手機技術。手機是電子設備中,更新迭代十分迅速的一款產品,基
Top