## Java泛型和变长参数
最近在写毕设使用到`Arrays.asList(T... a)`的情况,发现不能用在Long[]上,却可以用在String[]上。经过查询这里涉及到两方面的内容:
1. 泛型。只有非基本类型才能被泛化,故此接口不能接受基本类型。
2. 变长参数。变长参数可以传入一个数组,并且其实现原理、使用方法上和数组类似。
具体内容可见:
> [java数组转list](https://www.cnblogs.com/zheyangsan/p/6910476.html)
> [Java数组传递及可变参数](https://blog.csdn.net/lxxiang1/article/details/82312799)
## Java泛型中占位符?和T的区别
简而言之,?可以指多种类,不对类进行单一的限制
而T限制了只能定义泛型为一种。
具体见:
> [泛型<?>和<T>的区别](https://www.jianshu.com/p/ec59ae2ed473)
## Vue.js + TypeScript使用
最近做毕设用到新的`TypeScript`。
网上查阅资料找到一个很有用的文章,无论是从技术方面还是从架构方面都很值得学习。
> [Vue + TypeScript + Element 项目实践(简洁时尚博客网站)及踩坑记](https://segmentfault.com/a/1190000018720570)
## Vue.js + TypeScript 自定义Prototype所要做的额外工作
在Vue.js里,在main.js中定义Vue.prototype.*可以让全局Vue实例使用自定义变量。
但在结合了ts之后,ts无法解析自定义prototype。
此时需要用到ts的`模块补充 (module augmentation)`。
参考文档:
> [增强类型以配合插件使用](https://cn.vuejs.org/v2/guide/typescript.html#%E5%A2%9E%E5%BC%BA%E7%B1%BB%E5%9E%8B%E4%BB%A5%E9%85%8D%E5%90%88%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8)
其中my-property.d.ts貌似可以放在任意位置。
2020年4月28日补充:发现在上面的项目实践最后的踩坑记录中有提到。
## TypeScript用法学习
基础用法可参考菜鸟教程:
> [TypeScript 入门教程](https://www.runoob.com/typescript/ts-tutorial.html)
其中,`default`在`export`中的用法指的是默认导出模块的对象,在其他模块中`import`时直接引入该对象。
如果不使用`default`,在其他模块中`import`时,必须要指定引入对象。
## JavaScript中await/async
### 个人理解
今晚看了一些文章,从await/async一直到Promise,并且和吴大佬进行了一下交流,总结了以下几点主要内容:
1. Promise是一个优化异步计算、解决回调地狱的链式调用组件,可携带计算后的结果。从携带结果的角度上来看,有点类似于Java的FutureTask
2. await/async是一种优化Promise写法的语法,将Promise写法进一步简化为类同步写法。
而吴大佬补充道:
> Promise并不是用于异步计算的,而是用于异步事件的。毕竟在常规的js概念上,js是一个基于消息队列的单线程模型,promise所做的就是把事件回调挂到队列里。
### 参考文章
Promise:
> [Javascript 中的神器——Promise](https://www.jianshu.com/p/063f7e490e9a)
> [promise](https://www.jianshu.com/p/1b63a13c2701)
await/async:
> [理解 JavaScript 的 async/await](https://segmentfault.com/a/1190000007535316)
### Promise
Promise是什么?
> 以下摘自:[Javascript 中的神器——Promise](https://www.jianshu.com/p/063f7e490e9a)
所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
Promise有以下两个特点:
1. 对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。
2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
---
Promise的一般写法如下:
```javascript
var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value); // 改变Promise状态为成功resolve/fulFilled
} else {
reject(error); // 改变Promise状态为失败reject
}
});
promise.then(function(value) { // then回调处理事件
// success
}, function(value) {
// failure
});
```
其中,在then中可以嵌套返回新的Promise。具体用法在上面的参考文章`promise`中有提到。
======2020年7月24日 更新======
着重注意上述文章中提到的then()返回的问题:
> **假如在.then()的函数里面不返回新的promise,会怎样?**
.then()
1、接收两个函数作为参数,分别代表fulfilled(成功)和rejected(失败)
2、.then()返回一个新的Promise实例,所以它可以链式调用
3、当前面的Promise状态改变时,.then()根据其最终状态,选择特定的状态响应函数执行
4、状态响应函数可以返回新的promise,或其他值,不返回值也可以我们可以认为它返回了一个null;
5、如果返回新的promise,那么下一级.then()会在新的promise状态改变之后执行
6、如果返回其他任何值,则会立即执行下一级.then()
### await/async
大部分概念已在上面的参考文章中解释的非常详尽了。
这里单独拿出一点来说,就是上面参考文章中提到的await/async的优势:[async/await 的优势在于处理 then 链](https://segmentfault.com/a/1190000007535316#item-2-5)
这使得处理多条Promise调用看起来像同步方法一样,并且传递变量也变得比较简单。
## JavaScript中的this
参考:
> [普通函数跟箭头函数中this的指向问题](cnblogs.com/qdlhj/p/9877881.html)
其中开头总结得很好:
**箭头函数和普通函数的区别如下:**
+ 普通函数:根据调用我的人(谁调用我,我的this就指向谁)
+ 箭头函数:根据所在的环境(我在哪个环境中,this就指向谁)
其中由于箭头函数类似于匿名函数,一般作为参数传入到其他方法中。同时**箭头函数没有自己的this,它的this是继承而来的**,默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象
## JavaScript中for...of和for...in的区别
参考:
> [for of 和 for in 的区别](https://blog.csdn.net/shangyanaf/article/details/80415236)
个人总结如下:
+ for...in:用于遍历对象的所有可枚举属性。可枚举属性指的是包括有效载荷在内的被遍历对象的所有内部存储的属性。其中可能还包括从原型中继承的属性、用于管理的属性等。**for...in输出的顺序是不固定的**
+ for...of:在可迭代对象中创建一个迭代循环(类似于Java的迭代器),迭代有效载荷。
【笔记】2020年4月 开发笔记