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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • Python異步IO編程的進程/線程通信實現

    這篇文章再講3種方式,同時講4中進程間通信的方式一、 Python 中線程間通信的實現方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 信通院:小米、華為等11家應用商店基本完成APP簽名及驗簽工作

    中國信通院表示,目前,小米、華為、OPPO、vivo、360手機助手、百度手機助手、應用寶、豌豆莢和努比亞等9家應用商店,以及抖音和快手2家新型應用分發平
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • 與兆芯合作 聯想推出全新旗艦版筆記本電腦開天N7系列

    聯想與兆芯合作推出全新聯想旗艦版筆記本電腦開天 N7系列。這個系列采用兆芯KX-6640MA處理器平臺,KX-6640MA 處理器是采用了陸家嘴架構,16nm 工藝,4 核 4 線
Top