javascript 中的类型
javascript 中的类型
js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误?
我一般有三个选择:
- null
- ''
- error
- {}
第一个选择 null 如果结果是空,倒底是什么意思,是正确还是错误,你在写代码时会很疑惑.
第二个选择 '' 空字符串,结果更糟,因为1. 可能弄混了返回值的类型,2. 想提供一些有用的信息也带不回来。
第三个选择 error ,可以,但是你需要去判断类型
第四个选择 {} 空对象,跟1. 2 没有什么区别
都不是一个很好的选择,因为 js 没有像 c 中的连合类型: union。
随着 es6 的普级,对像的解构语法,给了我很大的启发,用他来进行一个复合类型的表达是可行的。
我的类的设计是如下:
class Result {
constructor(error,data) {
this.error = error;
this.result = data;
}
isFaulted() {
return !!this.error;
}
getResult() {
return this.result;
}
getError() {
return this.error;
}
map(fn) {
if (this.isFaulted()) {
return Result.ofError(this.getError());
} else {
return Result.ofResult(fn && fn(this.getResult()));
}
}
asCallback(cb) {
return cb && cb(this.getError(), this.getResult());
}
asAsync() {
if (this.isFaulted()) {
return new Promise.reject(this.getError());
} else {
return new Promise.resolve(this.getResult());
}
}
static ofResult (data) {
return new Result(null, data);
}
static ofError(err) {
return new Result(err, null);
}
static of(data, error) {
return new Result(error, data);
}
}
设计的特点:
- 分成两个部分,一个部分是结果数据,另一个部分是错误,这样就可以分开判断,而不用去判断数据的类型
- 结合对像的解构语法,
let {result, error} = result,就能很快知道是否是错误,语意更清晰。 - 结合函数式的思想,能进行链式调用如 map。
- 也整合了 promise 能进行异步的处理,对 async/await 也很合适
最重要的是减轻思想负担,不用去管返回结果什么情况下是对的,什么情况下的错的,这跟 golang 风格很像。
唯一会有问题的地方就是会传染,多了一些代码的调用, 不过写多了业务代码,我觉得这些都是小问题。
在万不得以的情况下,最外面再使用 try - catch 更好。
javascript 中的类型的更多相关文章
- 小结 javascript中的类型检测
先吐槽一下博客园的编辑器,太不好用了,一旦粘贴个表格进来就会卡死,每次都要用html编辑器写,不爽! 关于javascript的类型检测,早在实习的时候就应该总结,一直拖到现在,当时因为这个问题还出了 ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JavaScript中Float类型保留两位小数
JavaScript中Float类型保留两位小数 核心方法: num:要操作的数字 size:要保留的位数 parseFloat(num).toFixed(size); 实现代码如下:var ...
- javaScript中其他类型的值转换为Boolean类型
将javaScript中其他任意类型的值转换为对应Boolean类型的值. 一 将number类型的值转换为Boolean类型 数值为0: var myBoolean = new Boolean(0 ...
- 对JavaScript中变量类型的重新理解
<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- javascript中boolean类型和其他类型的转换
在javascript中,if语句括号中的表达式返回值可以是任何类型,即:if(a)中的a可以是boolean.number.string.object.function.undefined中的任何类 ...
- 编程笔记:JavaScript 中的类型检查
在Badoo的时候我们写了大量的JS脚本,光是在我们的移动web客户端上面就有大概60000行,可想而知,维护这么多JS可是相当具有挑战性的.在写如上规模js脚本客户端应用的时候我们必须对一件事保持警 ...
随机推荐
- Django 2.0 学习(04):Django数据库
数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...
- IIS支持PHP文件解析
打开IIS程序映射 添加模块映射 请求路径为:*.php 模块为:FastCgiModule 可执行路径选择 php-cgi.exe 名称随意写
- 【django之博客系统开发】
一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...
- Android 零散知识点整理
Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...
- git使用.gitignore设置不生效或不起作用的问题
偶然遇到的问题,记录如下: 通常我们在push项目时,会有些配置文件或本地文件不想上传到服务器上 这时候我们会通过设置.gitignore 文件 一般设置成这样: # 20170418 by 51a ...
- 归并排序及优化(Java实现)
普通归并排序 public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid 本次归并的中间位 ...
- angularjs常用事件
1. 视图模板加载完毕 $scope.$on('$viewContentLoaded', function() { alert('view template loaded'); });
- 关于Mysql DATE_FORMAT() 日期格式
定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的输出 ...
- 一次精疲力尽的改bug经历
一.介绍 最近一直在做有关JavaScriptCore的技术需求,上周发现一个问题,当在JavaScriptCore在垃圾回收时,项目会有一定几率发生崩溃.崩溃发生时调用堆栈如下: 图1 调用堆栈 先 ...
- Redis一次数据丢失(转)
一台Redis服务器,4核,16G内存且没有任何硬件上的问题.持续高压运行了大约3个月,保存了大约14G的数据,设置了比较完备的Save参数.而就是这台主机,在一次重起之后,丢失了大量的数据,14G的 ...