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脚本客户端应用的时候我们必须对一件事保持警 ...
随机推荐
- Spring整合Shiro并扩展使用EL表达式
Shiro是一个轻量级的权限控制框架,应用非常广泛.本文的重点是介绍Spring整合Shiro,并通过扩展使用Spring的EL表达式,使@RequiresRoles等支持动态的参数.对Shiro的介 ...
- python打造社工脚本
0x00前言: 大家都知道图片是有Exif信息的.里面包含着 你的GPS信息.还有拍摄时间等等的敏感信息. 0x01准备: exifread requests 0x02思路: 读取图片的Exif信息. ...
- libpqxx接口的在linux下的使用,解决psql:connections on Unix domain socket "/tmp/.s.PGSQL.5432"错误
在项目中使用postgresql数据库时要求在windows和linux双平台兼容.于是在windows下使用的接口在linux下爆出异常: psql:connections on Unix doma ...
- 序列化、反序列化(Serializable特性)
//需要被实例化的类 using System.Collections; using UnityEngine; [Serializable] public class SerializableClas ...
- business expressions(二)
1,to give someone a heads up = to inform someone about something important ("heads up") be ...
- 框架开发之——AngularJS+MVC+Routing开发步骤总结——5.14
1.延续MVC的观念:包括路由映射的编写,Controller的内容,具体View页面js的分离. 2.结合AngularJS做前端,后端使用Node.Js的写法,引入MVC框架,进行快速的开发. 步 ...
- 机器学习(1) - TensorflowSharp 简单使用与KNN识别MNIST流程
机器学习是时下非常流行的话题,而Tensorflow是机器学习中最有名的工具包.TensorflowSharp是Tensorflow的C#语言表述.本文会对TensorflowSharp的使用进行一个 ...
- 【Saltstack】Saltstack简单说明
[Saltstack] Saltstack是一个服务器集中管理中心平台,可以帮助管理员轻松的对若干台服务器进行统一操作.类似的工具还有Ansible,Puppet,func等等.相比于这些工具,sal ...
- 【Java】 重拾Java入门
[概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...
- jquery easyui+spring mnv 样式引不进,需要加载静态资源
前台用的EasyUI,页面中引入了easyUI的js与css(引入路径正确),但是无论如何都显示不出来, 如下图: EasyUI的样式没有,看控制台:警告,找不到 21:26:25,643 WARN ...