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脚本客户端应用的时候我们必须对一件事保持警 ...
随机推荐
- OAutho2 请求响应格式
1.OAuth2.PasswordGrant REQUEST: POST /token HTTP/1.1 Host: localhost: Content-Type: application/x-ww ...
- LeetCode之Easy篇 ——(1)Two Sum
1.Two Sum Given an array of integers, return indices of the two numbers such that they add up to a s ...
- CSS之盒子模型(深入理解)
CSS--盒子模型(Box Model) 简介: CSS盒子模型本质上是一个盒子,对网页中绝大部分的HTML元素进行包装定位(外边距,边框,内边距以及实际内容). 但是并不是所有的HTML元素都可以看 ...
- SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法
由于项目需要使用SpringCache来做一点缓存,但自己之前没有使用过(其实是没有听过)SpringCache,于是,必须先学习之. 在网上找到一篇文章,比较好,就先学习了,地址是: https:/ ...
- IntelliJ IDEA 源值1.5已过时,将在未来所有版本中删除
1. 修改Maven的Settings.xml文件添加如下内容 <profile> <id>jdk-1.8</id> <activation> < ...
- Angular开发实践(一):环境准备及框架搭建
引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架.前后端分离.前端工程化.SPA优化等等.因此想通过Angular开发实践这系 ...
- 理解 dispatch_get_specific
这篇文章原来在用 Github Pages 搭建的博客上,现在决定重新用回博客园,所以把文章搬回来. dispatch_queue_set_specific用于给一个队列设置相关的上下文数据,disp ...
- [SCOI2011] 糖果
luogu Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到 ...
- C# Int 类型线程不安全
之前统计报表算法做了一个优化,一个查询二十分钟导致客户端超时,优化到只需要5秒钟.后来发现for循环里数据合并的时候耗时,就用并行做优化.但是发现并行后丢居然数据(当然是因为List线程不安全). 前 ...
- Redis查询,设置超时时间
1.定义 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...