当前位置:首页 > 科技  > 软件

JavaScript如何优雅地告别Cannot read properties of undefined,Optional类体验

来源: 责编: 时间:2024-05-16 09:10:08 79观看
导读相信很多开发者在开发中经常遇到的一个报错:Uncaught TypeError: Cannot read properties of undefined.图片作为一名熟练的前端攻城狮,你一眼就能这是由于读取一个对象属性时,对象为 undefined 时导致的。要想避免,我们

相信很多开发者在开发中经常遇到的一个报错:eDq28资讯网——每日最新资讯28at.com

Uncaught TypeError: Cannot read properties of undefined.eDq28资讯网——每日最新资讯28at.com

图片图片eDq28资讯网——每日最新资讯28at.com

作为一名熟练的前端攻城狮,你一眼就能这是由于读取一个对象属性时,对象为 undefined 时导致的。eDq28资讯网——每日最新资讯28at.com

要想避免,我们需要做下判断。eDq28资讯网——每日最新资讯28at.com

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

或者你使用 try catch 结构来捕获异常。eDq28资讯网——每日最新资讯28at.com

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

当然,我们还有很多其他的选择,这里就不一一列举了。eDq28资讯网——每日最新资讯28at.com

接下来我介绍一种我最新学到的方案——Java 的 Optional 类。eDq28资讯网——每日最新资讯28at.com

Optional 类是 Java 中解决空指针异常(NullPointerException)的一种方案。(它和 Cannot read properties of undefined 是一样的错误),我们看看没有 Optional 类的情况。eDq28资讯网——每日最新资讯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 就优雅的多了。eDq28资讯网——每日最新资讯28at.com

String str = null;// 生成Optional类,ofNullablebiao 生成可以为null的对象Optional<String> optional = Optional.ofNullable(name);

生成 Optional 类还有 of 方法,不同的是不能为 null,否则调用 ifPresent 依然会报错 NullPointerException。eDq28资讯网——每日最新资讯28at.com

ifPresent: 如果存在就打印它,否则不进行任何操作。eDq28资讯网——每日最新资讯28at.com

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

orElseGet:如果存在就返回它,否则执行后面的表达式。eDq28资讯网——每日最新资讯28at.com

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

除此之外还有很多有意思的接口,比如我们熟悉的:map、flatmap、filter 等。eDq28资讯网——每日最新资讯28at.com

需要注意的是,因为 Optional 是一个容器类,它的方法返回的仍然是 Optional 对象,所以你可以继续对返回的 Optional 对象进行链式调用。例如:eDq28资讯网——每日最新资讯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()));    }}

更多信息可以看下面这张截图:eDq28资讯网——每日最新资讯28at.com

图片图片eDq28资讯网——每日最新资讯28at.com

这些方法像极了 javascript 的数组方法,但是他们的区别是,在 Java 中,Optional 类主要用于包装单个对象,以表示一个可能存在或可能不存在的值。它并不直接支持包装数组。eDq28资讯网——每日最新资讯28at.com

让我们回到 javascript,这种方案似乎可以很好的解决前端的问题。好奇的搜索 GitHub,这种方案有很多 javascript 版本的实现。eDq28资讯网——每日最新资讯28at.com

例如:https://github.com/JasonStorey/Optional.jseDq28资讯网——每日最新资讯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);

这看起来妙极了!!!eDq28资讯网——每日最新资讯28at.com

那么这种方案是怎么实现的呢?关键是函数返回值依然是个 Optional 对象。下面我们简单的实现一下这个过程。eDq28资讯网——每日最新资讯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

你觉得这个方案可以吗?相信大家读到这里心中已经有答案了吧?eDq28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88388-0.htmlJavaScript如何优雅地告别Cannot read properties of undefined,Optional类体验

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

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

下一篇: Java EE更名Jakarta EE对程序开发影响,你知道吗?

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • Flowable工作流引擎的科普与实践

    Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top