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

當(dāng)前位置:首頁 > 科技  > 軟件

JavaScript如何優(yōu)雅地告別Cannot read properties of undefined,Optional類體驗

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

相信很多開發(fā)者在開發(fā)中經(jīng)常遇到的一個報錯:67q28資訊網(wǎng)——每日最新資訊28at.com

Uncaught TypeError: Cannot read properties of undefined.67q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片67q28資訊網(wǎng)——每日最新資訊28at.com

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

要想避免,我們需要做下判斷。67q28資訊網(wǎng)——每日最新資訊28at.com

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

或者你使用 try catch 結(jié)構(gòu)來捕獲異常。67q28資訊網(wǎng)——每日最新資訊28at.com

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

當(dāng)然,我們還有很多其他的選擇,這里就不一一列舉了。67q28資訊網(wǎng)——每日最新資訊28at.com

接下來我介紹一種我最新學(xué)到的方案——Java 的 Optional 類。67q28資訊網(wǎng)——每日最新資訊28at.com

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

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

但是使用 Optional 就優(yōu)雅的多了。67q28資訊網(wǎng)——每日最新資訊28at.com

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

生成 Optional 類還有 of 方法,不同的是不能為 null,否則調(diào)用 ifPresent 依然會報錯 NullPointerException。67q28資訊網(wǎng)——每日最新資訊28at.com

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

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

orElseGet:如果存在就返回它,否則執(zhí)行后面的表達式。67q28資訊網(wǎng)——每日最新資訊28at.com

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

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

需要注意的是,因為 Optional 是一個容器類,它的方法返回的仍然是 Optional 對象,所以你可以繼續(xù)對返回的 Optional 對象進行鏈?zhǔn)秸{(diào)用。例如:67q28資訊網(wǎng)——每日最新資訊28at.com

import java.util.Optional;public class Person {    // something}public class Main {    public static void main(String[] args) {        // 創(chuàng)建一個可能為 null 的 Person 對象        Person person = new Person("John Doe", 30);        // 使用 Optional 對象進行鏈?zhǔn)秸{(diào)用        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)));        // 輸出結(jié)果        optionalPerson.ifPresent(p -> System.out.println("Name: " + p.getName() + ", Age: " + p.getAge()));    }}

更多信息可以看下面這張截圖:67q28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片67q28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

這看起來妙極了!!!67q28資訊網(wǎng)——每日最新資訊28at.com

那么這種方案是怎么實現(xiàn)的呢?關(guān)鍵是函數(shù)返回值依然是個 Optional 對象。下面我們簡單的實現(xiàn)一下這個過程。67q28資訊網(wǎng)——每日最新資訊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

你覺得這個方案可以嗎?相信大家讀到這里心中已經(jīng)有答案了吧?67q28資訊網(wǎng)——每日最新資訊28at.com

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

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

上一篇: 面試官:你的系統(tǒng),是如何建模的?

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

標(biāo)簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 琼结县| 清镇市| 宿州市| 定安县| 南靖县| 周宁县| 永胜县| 富顺县| 南江县| 萍乡市| 昭通市| 绵竹市| 察哈| 巴彦淖尔市| 卢龙县| 长垣县| 通海县| 南陵县| 铅山县| 濮阳县| 兴隆县| 富宁县| 开阳县| 洛浦县| 阳西县| 昔阳县| 麻栗坡县| 鄂伦春自治旗| 辉南县| 嘉善县| 丰城市| 阿坝| 嘉义市| 杭锦旗| 吉隆县| 弥渡县| 法库县| 广平县| 微山县| 高清| 偏关县|