首页
关于
友链
留言
Search
1
安装Docker Desktop报错WSL 2 installation is incomplete
76 阅读
2
震惊!杭州应届生工作免费领2w元
31 阅读
3
我的世界紫禁之巅纯净生存服务器
25 阅读
4
python3网络爬虫开发实战pdf
23 阅读
5
火车头采集问题:Void Proc(System.Net.HttpWebRequest)
20 阅读
技术分享
日常学习
我的世界
Search
标签搜索
python
博客
javascript
ce
web
织梦
html
按键精灵
php
游戏
css
typescript
jquery
日常
数据库
vue
ubuntu
Datehoer
累计撰写
178
篇文章
累计收到
10
条评论
首页
栏目
技术分享
日常学习
我的世界
页面
关于
友链
留言
搜索到
178
篇与
Datehoer
的结果
2021-01-22
typescript 泛型在类和接口上面的应用
今天继续接着前一篇文章typescript泛型generic来说。我们创建一个队列类,队列中有两个方法,分别是push进入和pop离开,队列大家应该都明白,先进先出。所以我们使用了push和shift两个方法。、然后我们设置一下item的类型,这样的话我们下面的值就要进行修改了。解释一下为什么要设置类型,我们可以看到下面是先创建了queue这个变量,然后不断的将数据存放进去,我们可以储存不同类型的变量,但是我们如果调用的话,只能调用该类型的方法,如果说我们前面不设置类型的话,那么下面再执行第二局tofixed的时候就会发生错了。但是假如我们在前面设置了类型,则会变得非常麻烦。我们需要的是一种方法,设置了类型后,我们只能让同类型的数据加入。这样我们就可以在类中使用泛型了。之前在函数中我们用的是尖括号,这里也同样。这里我们就直接将代码贴出来了,可以看到,我们通过泛型的话,直接在最后使用的时候设置类型就可以了,然后看下面的报错,很容易就知道我们不能将字符串类型的数据加入队列了。 接口也是可以使用泛型,然后变得更加灵活。我们不知道要传入的是什么类型,那么就可以用泛型来进行动态传入了。这就是泛型在接口的应用了。接口搭配泛型,可以灵活的返回类型了。好了,typescript中泛型我们就介绍到这里了,如果有什么疑问可以在评论区留言,我会在看到的第一时间进行回复的。
2021年01月22日
2 阅读
0 评论
0 点赞
2021-01-21
typescript 泛型generics
今天我们来介绍一下typescript中的难点--泛型。首先简单看一下下面的图片。Adding simple type annotations 给变量增加一些简单的类型前面可以看到滑梯平滑度过,但是以到 generics ,滑梯的坡度就会变成理论上无法使用的滑梯了。这也说明我们的泛型 generics ,是非常难的,不过也说明,我们只要掌握了泛型 generics 也就掌握了 typescript 中最难的一点。 简单来讲一下泛型。假设我们有一个函数,然后这个函数只做一件事,就是我们传入一个参数,然后函数返回这个参数。我们可以看到出现了一个问题,我们传入的参数是数字类型,但是返回的值却是 any 类型的。这并不是我们想要的结果,因为这会使结果丧失了它的类型。然后简单修改一下,设置一下类型。但是这么写是非常麻烦的,因为我们如果想要传一个别的类型的参数,需要进行修改。既然如此麻烦,那么我们将类型设置为any类型呢?但是假如说我们修改成any类型的话,问题就回到起点了。并且这其实还会出现一个 bug ,我可以直接修改 result 的类型下面来写一下泛型吧。泛型其实就是再函数的名字后面加 <> 然后将这个泛型的名字加在 <> 内,当然,其实这个名字是无所谓的,就跟我们的变量名,函数名一样,是随便起的。这个名字其实就是一个占位符,一个神秘的占位符。然后接下来呢,我们的参数和返回值定义的类型就是我们的名字了,也就是我们的占位符。我们要先创建一个 str 类型的变量,然后将它传入函数,假如说我们还是传 123 的话,结果是什么样的呢?请各位自己试一下吧,哈哈。假如说我们还是要设置 result 的类型,能成功么?答案是不行的。 true 并非 string 类型。接下来我们对泛型进行其他的操作,比如说数组。其实这个也就是简单的一一对应,我们前面设置的 t 后面就要跟上 t ,将他们进行对应。然后我们就可以对相应的项进行相应类型的操作了。泛型就像是一个占位符,一个变量,在使用的时候我们可以将定义好的类型像参数一样传入,之后他会原封不动的输出。 假如说我们要使用 .length 的话,在函数内部使用是会报错的,因为我们没有定义参数的类型。就算我们使用前面所说的泛型也是没用的,因为这里我们要引入一个新的概念,叫做泛型的约束,顾名思义,就是将泛型的类型进行约束。因为我们的泛型是可以传入任意类型的,而我们如果想要在函数内使用特定的属性方法的话,就要将类型给他约束一下。我们先简单看一下泛型怎么设置传入数据的类型。我们将 T 设置为数组,其实也就是将 T 后面加上 [] ,这样就是数组了。但是虽然这么看已经有了好转,但实际上这个方法并没有什么卵用。因为除了数组以外还有别的类型也有 length 属性,但是我们这样设置的话,只能传入数组。接下来步入正题,通过上面的例子,我们就能很清楚的知道固定类型的麻烦之处了,如何解决呢?通过泛型的约束,我们将类型约束为能使用 length 属性的类型就可以了。这里我们先上代码给大家看一下吧,首先是定义了一个接口,然后通过 extends 来让 T 继承 IWithLength ,这样我们就可以传入可以使用 length 的类型了。这其实就是 duck 了,只要你有这个 length 属性,你就符合我们的约束,那么你就是 duck 了,不管你实际上是什么类型。我们如果传入一个不符合的类型,当然是会报错的。关于泛型的介绍,第一部分就到这里了,其余的等下一篇文章进行介绍。如果有什么疑问可以在评论区留言我会在看到的第一时间进行回复的。
2021年01月21日
2 阅读
0 评论
0 点赞
2021-01-20
python 爬取小说进阶
这一篇是上一篇关于python xpath爬取小说的进阶版,不过其实说是进阶,还是那些东西,只不过加了一个范围获取,指前只能是输入网址,而且必须是小说的正页内容才行,现在加了一个只需要列表页就能获取该列表的所有小说了。而且通过python,实现了只需要输入列表页的长度,就能获取所有的文章。importrequests_html defmakestr(b): num=str(b) returnnum session=requests_html.HTMLSession() url="https" biaoti_xpath='/html/body/div[1]/div/div[1]/main/article/div/header/h1/text()' wenben_xpath='/html/body/div[1]/div/div[1]/main/article/div/div/p/text()' lianjiexpath_list=[] lianjie_list=[] links=[] urllist=["https"] foriinrange(2,4): new_url=url+'/page/'+str(i) urllist.append(new_url) print(urllist) foriinrange(len(urllist)): lianjie=urllist.pop() r=session.get(lianjie) forbinrange(1,13): num=makestr(b) lianjie_xpath='/html/body/div[1]/div/div[1]/main/article['+num+']/div/header/h2/a/@href' #lianjiexpath_list.append(lianjie_xpath) links.append(r.html.xpath(lianjie_xpath)) ####### #foriinrange(len(lianjiexpath_list)):#将链接储存在一个列表里 #lianjie_xpath=lianjiexpath_list.pop() ##print(r.html.xpath(lianjie_xpath).pop()) # #lianjie_list.append(r.html.xpath(lianjie_xpath)) #print(lianjie_list) ####### delb forlinknuminrange(len(links)): link=links.pop() link=link.pop() r=session.get(link) res_bt=r.html.xpath(biaoti_xpath) res=r.html.xpath(wenben_xpath) forainrange(len(res)): zifu_str=res.pop(0) ifa==0: bt=res_bt.pop() wenjian_name=bt+'.txt' zifu_str=bt+'\n'+zifu_str withopen(wenjian_name,'a',encoding='utf-8')asfile_object: file_object.write(zifu_str+'\n')比较难的其实是那个,一开始获取链接错了,我把链接储存起来然后pop出来的是xpath。。。。然后后面是一个很蠢的问题。。'str' object is not callable一直报错这个,然后我改了一堆一堆的,发现都没问题,随便一看发现我后面的文件写入,变量名为str。。。。。在接下来就毫无难度了不过我这个是只能爬取那些短篇小说的爬虫,而非那种好多章的,不过只要在一个列表页就行了,但是由于一些特殊原因,所以不准备把小说网址放出来,其实明白的人都懂,哈哈。
2021年01月20日
8 阅读
0 评论
0 点赞
2021-01-19
python xpath爬取小说
最近对学习有点怠慢了,所以其实没什么好的内容发,只能捡一下以前的内容了。简单发一篇python通过xpath爬取小说的文章吧。不过其实记录的是我当时的思路以及过程,可能不是很容易懂。简单记录一下当时的思路,首先小说是通过xpath来获取,但是我发现它的相对定位的方法是要通过id来进行获取的,而每一篇文章的id是不同的,所以这里我想到了使用绝对定位。当然实际上不叫决定定位相对定位,但是这么说比较方便。首先先把代码复制出来,然后通过筛选进行层级的获取。/body/div/div/div/main/article/div/div/pimportrequests_html session=requests_html.HTMLSession() url="https:/z" xpath1='//*[@id="post-56013"]/div/header/h2/a' xpath2='//*[@id="post-55998"]/div/header/h2/a' xpath3='//*[@id="post-55980"]/div/header/h2/a' nei_xpath='//*[@id="post-56013"]/div/div/p[3]' zong_xpath='//*[@id="primary"]' r=session.get("https:/") #print(r.html.xpath(zong_xpath,first=True).links) url2='https://x r=session.get(url2) xpath000='/body' res=r.html.xpath('/body/div/div/div/main/article/div/div/p',first=True) print(res)然而没想到获取到的结果为none,这个其实我之前也遇到过,当时是使用beautifulsoup解决的,这一次呢?再查看一下路径通过f12来进行查看Body div div div main article div divp 最后通过通过这个来获取路径的。这一个发现其实应该是我的关系找错了,也可能不是尝试一下。。res = r.html.xpath('/html/body/div[1]/div/div[1]/main/article/div/div/p/text()')res = r.html.xpath('/body/div/div/div/main/article/div/div/p/text()')好吧,应该是因为选择的问题,应该是前面的div里的[1]没有选择上,所以才会出现问题。简单尝试一下看看res = r.html.xpath('/body/div[1]/div/div[1]/main/article/div/div/p/text()')发现还是有问题啊。。。但是换成前面的就没问题了,所以应该是根节点出现的问题。应该是要加上/html就好了简单说明一下,其实有的时候获取的xpath是绝对路径,但是可能有的页面的内容是一段一段的,比如说我现在爬的这个网站,一句话是一个p标签。这样其实用路径来写比较容易,因为毕竟是免费的站,很多广告之类的,非常的烦。不过其实还是用绝对路径比较方便,不过可能不好想。importrequests_html session=requests_html.HTMLSession() url="https:" xpath1='//*[@id="post-56013"]/div/header/h2/a' xpath2='//*[@id="post-55998"]/div/header/h2/a' xpath3='//*[@id="post-55980"]/div/header/h2/a' nei_xpath='//*[@id="post-56013"]/div/div/p[3]' zong_xpath='//*[@id="primary"]' r=session.get("httpsz") #print(r.html.xpath(zong_xpath,first=True).links) url2='htt' r=session.get(url2) xpath000='/body' res=r.html.xpath('/html/body/div[1]/div/div[1]/main/article/div/div/p/text()') print(res) foriinrange(len(res)): str=res.pop() withopen("yanxuan.txt",'a',encoding='utf-8')asfile_object: file_object.write(str+' ') 这就是最终代码了,将获取到的列表通过pop来导出来储存到一个text中,不过我想挑战一下难度,获取个标题。哈哈。继续还是通过xpath。/html/body/div[1]/div/div[1]/main/article/div/header/h1/text() 不过其实说真的,获取到xpath后还是要在后面添加上/text()才行要不获取到的就是标签了。 importrequests_html session=requests_html.HTMLSession() url="https:/" xpath1='//*[@id="post-56013"]/div/header/h2/a' xpath2='//*[@id="post-55998"]/div/header/h2/a' xpath3='//*[@id="post-55980"]/div/header/h2/a' nei_xpath='//*[@id="post-56013"]/div/div/p[3]' zong_xpath='//*[@id="primary"]' bt_xpath='/html/body/div[1]/div/div[1]/main/article/div/header/h1/text()' r=session.get("https://") #print(r.html.xpath(zong_xpath,first=True).links) url2='https:///' r=session.get(url2) xpath000='/html/body/div[1]/div/div[1]/main/article/div/div/p/text()' res_bt=r.html.xpath(bt_xpath) res=r.html.xpath(xpath000) #print(res) foriinrange(len(res)): str=res.pop(0) ifi==0: bt=res_bt.pop() str=bt+' '+str withopen("yanxuan.txt",'a',encoding='utf-8')asfile_object: file_object.write(str+' ')最终代码。其中需要记录的是,通过pop()函数获取列表值的话如果不加加参数0,那么就会从后向前输出,所以要让他从头开始!不过其实这就是一个简单的页面而已,接下来要获取一个列表页的所有链接,然后获取内容,然后再就是获取所有列表(指定)然后获取内容。进行尝试,测试其余页面发现大概应该所有的页面都是可以的不管有没有广告,所以接下来只需要获取链接然后进行修改即可。目前的思路是获取的链接放在列表里然后通过pop来提取,之后储存,貌似可以所有链接都这样干。但是其实这个通过多线程来做比较简单。所以这个目前就到这里吧,等学习一段时间再进行补充。关于python通过xpath爬取小说的思路简单介绍到这里,如果有什么疑问可以在评论区留言,我会在看到的第一时间进行回复的。
2021年01月19日
3 阅读
0 评论
0 点赞
2021-01-18
typescript 枚举
enums,枚举enums对于我们前端开发工程师来说也是一个全新的概念,不过其实枚举还是非常好理解的。在任何项目中我们都会遇到常量这种情况,它是在执行的程序中不会被改变的值,在typescript中我们一般会用const来声明一个常量,但是呢,有些取值是在一定范围内的一系列常量,比如说我们一周内的七天从周一到周日,红黄蓝三原色,上下左右,南北东西等等,这些值就可以用枚举来表示。1.数字枚举我们用enum来进行定义。enum Direction { up, down, right, left,}枚举成员会被赋值,从0开始,自动递增。我们简单举例来看一下这个值,console.log(Direction.up)我们其实也可以将枚举当作一个数组,然后其中的值可以当作字符串来取出。console.log(Direction[0])我们也可以给其中的成员手动赋值,比如说我给up赋值10。而未手动赋值的枚举项会根据手动赋值的枚举项的值来自动递增enum Direction { up = 10, down, right, left,}我们将typescript文件进行编译,来看一下通过js是怎么实现的。首先我们是创建了一个函数,封装了一个作用域。我们可以看到其中Direction["up"]=0是用于自我解释,它会将Direction这个对象的成员up的值设置为0,注意JavaScript中的赋值运算符返回的是被赋予的这个值。所以这个例子中我们返回的就是0了。2.字符串枚举其实字符串枚举应该就很好理解了,将每一项设置为字符串,这样我们的值就会更容易处理和调试,因为他们都是提供有意义和可调式的字符串。enum Direction { up = "Up", down = "Down", right = "Right", left = "Left",}当然,在使用字符串枚举的时候要注意,这个是不能自动递增的,所以要给下面每一项都赋上字符串的值。我们可以通过上面的例子来进行一个简单的字符串比较,比如说我们服务器返回的一个是up,我们将它和枚举进行比较。const vaule = "Up"这里我们通过if来进行比较enum Direction { up = "Up", down = "Down", right = "Right", left = "Left",}const vaule = "Up"if (vaule === Direction.up){ console.log("go up!")}简单来看一下结果。3.常量枚举我们使用常量枚举可以提升性能,我们只需要在enum前面加上const关键字,这样它就可以被称为是常量枚举了。const enum Direction { up = "Up", down = "Down", right = "Right", left = "Left",}我们如果对常量枚举进行编译,会发生什么呢?js文件会变得非常的简便,逻辑非常通顺。我们如果调用一个枚举的值,js文件会直接翻译成结果,使用常量枚举就是这样来提升性能。他会内联枚举的任何用法,并且不会编译成JavaScript中的用法。不过要注意,只有常量值可以进行常量枚举!好了,有关typescript的枚举就介绍到这里了,如果有什么疑问可以在评论区留言,我会在看到的第一时间进行回复的。
2021年01月18日
2 阅读
0 评论
0 点赞
2021-01-17
typescript 类和接口
继续我之前所说的typescript的类,接下来我们说一下typescript中接口和类的关系吧。接口对类的一部分的行为进行抽象。继承的困境我们在面对对象中,一个类只能继承自另外的一个类,有的时候不同的类有共同的特性,用字类继承父类的方法很难来完成。类可以使用implements来实现接口所以我们可以将特性提取出来做成接口然后用一个称之为implements的关键字来实现,这样就大大提高了面向对象的灵活性。 创建一个名字叫car的类,他有一个方法的名字叫switchradio,然后我们又有一个新的类出现了一个名字叫cellphone 的类,他也有一个方法的名字叫做switchradio。这时候我们发现这两个类有一个相同的方法,我们考虑将它提取出来,如果用弗雷德形式,需要找到一个符合的父类,但是可以看出,cellphone 和 car大概是没有符合的父类了。这时候我们就可以把这个方法抽取出来,当成一个interface ,然后让这两个类都去实现它。我们创建一个 radio的interface ,然后创建一个switchradio的方法。创建方法的写法和类有些类似,但是后面可以看到是冒号而非大括号。然后我们设置它的返回值位void这个关键字,意思是它啥都不返回。然后我们在类的后面使用implements来让类实现这个接口。这样,就完成了接口的工作,接下来interface 实现了一个契约功能,我们的类必须要又这个switchradio方法才可以,如果我们删除了是会报错的。现在我们新增一个方法,称之为检查电池的容量,这个方cellphone有而 car没有,所以我们要新创建一个接口。接下来我们的cellphone 要实现多个接口,我们需要在接口名字后面加逗号。通过上面的例子,可以体会到接口的灵活程度了吧,接下来接口还可以有继承的关系,注意这是接口的继承而非 class的继承,但是虽然这么说,实际上接口的继承也跟class的继承类似,我们新建一个接口叫 RadioWithBattery 。它继承radio 。这样子就将下面的双接口替换成单接口就可以了。现在我想大家应该能明白一些interface的精髓了,它就想是某种契约来约定class的样子,只要我们走路像鸭子,叫起来像鸭子我就不管它是什么东西,都叫做鸭子我们可以通过interface来约束一些毫不相关的东西。
2021年01月17日
5 阅读
0 评论
0 点赞
2021-01-16
typescript class(类)
如果有关注我们的读者可以看到前面是有写关于typescript的内容的,今天我们来简单介绍一下typescript中的class(类)。 类:定义了一切事物的抽象特点 对象:类的实例 面对对象三大特性:封装、继承、多态 封装:将数据操作的细节隐藏起来,只暴漏对外的接口,外界不知道细节,只能通过接口访问。 继承:子类继承父类,子类除了拥有父类的特征外还有一些具体的特性 多态:由继承产生了相关的不同的类,对不同的方法有不同的响应。针对某个实例,可以直接调用某个方法而不用管是哪个类 我们简单来看一下实例,通过实例的讲解,可能会有关于typescript类的更好的收获。 面对对象给人一种上帝的感觉,首先是绘制蓝图,创建一个类叫animal,这是一个基本类,我们的蓝图是这么样绘制的,可以看到类中有一个构造函数,这是一个实例化然后执行的逻辑,然后我们有一个方法 run() ,里面只是简单的输出一行话,然后我们创建一条蛇,名字叫lily,然后我们让他使用 run() 这个方法,看下结果。我们创建一个新的类,继承了 animal 这个类,然后我们除了有 run 这个方法外,还添加了一个 bark 使用 extends 继承继承以后呢,我们自然就会拥有上面父类所拥有的属性和方法了。 然后我们创建一只狗,名字叫 xiaobao ,之后调用它的 run 以及 bark 方法。然后简单说一下多态,可以看到我们对 constructor 重写,注意,我们要重写函数的话,需要使用这个 super 方法才行,可以看到我们添加了一个 console.log 然后又把 run 重写了一下。可以看一下 run 这个方法,我们如果要调用父类的方法的话,需要使用 super 这个关键字才行。 以上皆为类的实例,实例上的属性,实例上的方法。那么我们类是否有可以直接访问的属性和方法呢?这里就要用到前面的 static 了,简单定义一下 static categories = ["mammal"] ,我们创建了一个静态属性。 我们在后面添加一个 console.log(Cat.categories) 直接调用一下,看一下结果。可以看到定义的mammal出现了,这说明我们可以直接访问静态的属性,为什么要用这样的静态属性或者方法呢?是因为我们定义的和这个实例的状态没有太大的关系。 前面是简单介绍了一下class(类),接下来我们回归typescript的正题。 typescript提供了三种修饰符。public:修饰的属性或方法是共有的。 可以在任何地方被调用到,我们的默认属性或者方法就是public。private:修饰的属性或方法是私有的。 不能在声明它的类的外部调用。protected:修饰的属性或方法是受保护的。 和private类似,但是还是有不同的地方,我们简单看一下例子。 这里我们将上面的代码换成 ts ,我们如果不想让 run 方法被其他人调用的话,可以直接添加 private 到 run 方法前面,之后我们可以看到下面的 snake 调用 run 方法的时候报错了。告诉我们不允许访问或者修改这个 run 方法,因为 private 定义了我们只能在类的内部进行修改。那我们应该怎么样让子类访问父类的属性和方法呢?这时候就要用到前面的 protected 。如果我们将前面的 private 修改位 protected 的话,可以看到我们的子类可以调用父类的 run 了,这个就比较像是继承了,只有我和我的子女可以访问这个方法或者属性,外部人员一概无法访问。但是我们有时候会有一些特殊的需求,比如说属性只能读不能写,该怎么实现呢?typescript 还给我们提供了一个特殊的修饰符号,来告诉我们这个属性只能读不能写。 这个修饰符号就是 readonly 了如果我们修改一下 name 这个属性获得到什么样的答案呢? 答案是自然不能修改的。好了,今天关于typescript class(类)的内容就介绍到这里了,如果有什么疑问可以在评论区留言,我会在看到的第一时间进行回复的。
2021年01月16日
6 阅读
0 评论
0 点赞
2021-01-15
我的世界 怎么进服务器
简单做一下新手教程!我的世界如何进入服务器,以及怎么修改等等一系列的教程吧。首先先在群里下载一下安装包,当然其实也是无所谓的,毕竟是纯净服,不需要特定的mod。然后将下载的压缩包解压。主要就是通过hmcl.exe这个文件进入游戏,当然下面的那个pcl 启动游戏.exe也可以,道理都是相同的,我觉得应该没人不会吧,我们以hmcl为例,双击打开。会看到下图这样的界面,当然,一开始进入的时候不是这样的,会出现一个让你输入用户名的地方。 我们选择离线模式的登陆,然后用户名推荐使用纯英文,当然英文+数字也可以,最好不要带符号,当然也不要有中文。当然,也有人会问我添加完账户怎么返回?可以看图,然后点一下那个小房子就行了。然后如果游戏卡的话,可以修改一下配置,修改成合适大小的内存即可。之后回到最开始的界面点击启动游戏。启动过程中可能会伴随着风扇转动以及稍微的卡顿,不要惊慌,稍等即可。单人游戏就是自己一个人玩耍的地方,我们主要讲怎么进入服务器所以只说多人游戏。我们简单说一下如何修改和添加,其实添加非常简单,点下面的添加即可,而编辑则是选中服务器然后点编辑。然后就会看到下图这个界面之后把ip复制到下面就可以了,ctrl+v。然后点击完成,会回到上面那张图的位置,之后双击进入。然后大多数的服务器其实都是注册登录的,而且大多都是通过/reg来进行注册的,不过具体还是要看提示。我的世界一般都是回车打开输入框,所以我们回车/reg空格密码空格密码,/reg 11223344 11223344然后回车进行注册,之后再次进入游戏的话需要登录,/l 11223344,不过我们服务器是你短时间内退出的话,不需要重新登录就可以回到游戏。然后我们回车是输入东西,指令都要带/,然后应该就没有别的问题了,如果有什么问题欢迎加群询问。
2021年01月15日
9 阅读
0 评论
0 点赞
2021-01-14
typescript 数组和元组
在typescript中,使用数组的方法和JavaScript中是一样的。第一的方法是一样的,并且使用的效果也是一样的。const arr: (string | number | boolean)[] = [1, '2', true];type People = { name: string, age: number, sex: string };const peopleArr: People[] = [{ name: 'Tom', age: 23, sex: 'men' }];而typescript中的元组呢?其实类似于python中的元组,就是一个存放数据的地方。const peopleInfo = ['Dylan', 'male', 23];const peopleArr: [string, string, number] = ['Dylan', 'male', 23];let tupple:[string,number]=["sss",123]赋值必须要跟前面的定义是一种类型其实之所以会有元组的出现,是因为我们一般在数组中储存的数据都是同类型的数据,只有any类型是可以储存不同的类型的数据。而我们假如说像储存不同类型的数据,就可以使用元组。元组的使用方法其实跟数组类似,都可以通过下标值来进行数据的选取。var tuple = [10,"Date"];// 创建元组console.log(tuple[0])console.log(tuple[1])元组可以利用pop()和push()来进行数据的删除和添加。var tuple = [10,"Hello","World","typeScript"];console.log("添加前元素个数:"+tuple.length) // 返回元组的大小mytuple.push(12) // 添加到元组中console.log("添加后元素个数:"+tuple.length)console.log("删除前元素个数:"+tuple.length)console.log(tuple.pop()+" 元素从元组中删除") // 删除并返回删除的元素console.log("删除后元素个数:"+tuple.length)然后我们也可以将元组进行解构。var a =[10,"Date"]var [b,c] = aconsole.log( b )console.log( c )
2021年01月14日
4 阅读
0 评论
0 点赞
2021-01-13
JavaScript promise对象
昨天说了,听课并没有听懂promise到底讲的是什么。不过后来看文档发现其实还是懂一些了。所以发一篇文章记录一下JavaScript promise对象。首先Promise是ECMAScript 6原生提供的对象,Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。说promise之前,先说一下昨天说的语法糖吧。其实后来写完那篇关于业务逻辑和语法糖的文章后,仔细想了一下,发现其实好多都可以算作是语法糖吧,比如说函数,其实也是为了提高效率而出现的,毕竟其实如果不用函数的话,我们可以把要用到的代码一直复制呗,还有类,等等这些大概其实都可以归到语法糖这一类中。好了,回归正题。promise首先最重要的一个特性就是状态不受外界的改变而改变。解释这个之前,我们先要介绍一下promise的三个状态,分别是peding:初始状态。fulfilled:成功状态。rejected:失败状态。分别是这三个状态,首先进入peding状态进行初始化,然后根据条件来决定是成功还是失败,之后修改状态,然后这个状态就不会发生改变了,不会发生成功状态变成了失败,反之亦然。promise的汉语意思是承诺,代表着只要做出了承诺,就不会改变。然后另一个特性就是状态改变后,任何时候都可以得到这个状态。简单解释一下,就是我们从peding状态改到成功状态后,状态就会发生固定,然后就会一直保持这个状态,我们再对promise进行请求的话,也会立刻得到这个状态。然后在es6中,我们通过promise构建函数的话,需要传入一个函数,promise接受两个函数参数,执行完第一个参数之后,就会改变当前的状态为已完成,如果执行的是第二个参数,则是以失败状态。var promise = new Promise(function(resolve, reject) { // 异步处理 // 处理结束后、调用resolve 或 reject });我们简单的看一下promise的创建,通过new Promise来构建函数。之后传入参数,最后在函数中进行参数的调用,如果是第一个则promise改为完成状态,如果是第二个则是失败状态。然后我们如果调用的话,可以通过.then来进行promise的调用。我们对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。通过上面的总结,我们应该可以比较明确的知道promise的基础部分。不过其实可能对catch不太明白。其实catch跟then类似,都是获取promise的内容,但是then是一个顺序问题,而catch则是获取错误,我们写代码不可避免的会出现各类错误,有的是我们编写的时候就出现的,有的是用户使用的时候出现的,我们可以通过catch来捕获错误,然后进行相应的处理。.then(function(posts) { // some code }) .catch(function(error) { // 处理前一个回调函数运行时发生的错误 console.log('发生错误!', error); });当然,其实promise对象的错误具有一种很好的特性,那就是冒泡性,如果没有catch捕获错误的话,那么就会一直向后传递,直到出现catch捕获错误为止,比如说我们第一行就出现了错误,但是没有catch,那么就会一直向后传递,直到捕获到这个错误才会停止传递,这就是promise对象的一个比较鲜明的特性。promise对象简单介绍到这里,如果有什么疑问的话,可以在评论区留言,我会在看到的第一时间回复的。当然比较学术性的其实我可能也不会,所以推荐几个网址给大家,当然,这是关于JavaScript promise对象的。参考链接: https://wohugb.gitbooks.io/ecmascript-6/content/docs/promise.html https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise http://qingtong234.github.io/2016/01/14/javascript%E4%B8%AD%E7%9A%84promise%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B-1/
2021年01月13日
2 阅读
0 评论
0 点赞
2021-01-12
业务逻辑、语法糖是什么意思?
其实今天收获不是明白了业务逻辑、语法糖是什么意思?今天主要学习了一下js中的promise,发现好难,所以准备钻研一下,主要还是因为听课感觉老师讲的比较简单了,但是却还是什么都听不懂,其实也不是完全听不懂,就是不明白具体实要干什么罢了,所以准备钻研一下了。今天简单讲一下什么是业务逻辑,以及什么是语法糖。其实我接触语法糖比较早了,很早以前看一篇文章还是什么的时候作者说了一句语法糖,然后今天学习的时候听到了业务逻辑,说实在的,这些确实没有了解过到底是什么意思 业务逻辑,我的理解其实就是实现这个功能所要编写的代码就是业务逻辑。之所以有这个理解还是因为老师说,这两个代码虽然写的不同,但是业务逻辑还是相似的,当时主要是讲了异步的写法,虽然两个写法不同,但是都实现了异步处理这个操作,所以他们的业务逻辑其实应该都是为了实现异步处理这个操作。我们简单看一下比较权威的说法吧。业务指的是一个实体单元向另一个实体单元提供服务。逻辑指的是指根据已有的信息推出合理的结论规律。业务逻辑是指一个实体单元为了向另一个实体单元提供服务,应该具备的规则与流程。举个立体点的例子,就像在家里有一些从小就交给你的规矩一样,比如说“吃饭前要洗手”“有客人来要起立”“睡觉前要熄灯”等等,这其实就是业务逻辑的生活化实例。业务逻辑其实也牵扯到了业务逻辑层,这个东西,关注点主要是在业务规则的制定等层面上。然后再说一下什么是语法糖,这个就非常好理解了。这个词汇是一个英国科学家彼得·约翰·兰达发明的词语。主要作用就是在代码中增加一些东西,一些规范之类的,虽然对编程语言没有影响,但是对阅读以及编写有很大的帮助,减少出错。语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。举个例子:在C语言中使用a[i]表示*(a+i),而用a[i][j]表示*(*(a+i)+j),由此可见语法糖不是“现代语言”独有,这种写法简洁明了,容易被人理解。语法糖并非是一个贬义词,它会为我们带来便捷的效果,是一种便捷的写法,并且不用担心使用问题,因为编译器会为我们进行转化,并且使用语法糖会为我们的编程提供高效的编写速率,在性能上也不会有什么损失,何乐而不为呢?
2021年01月12日
4 阅读
0 评论
0 点赞
2021-01-11
连接mysql错误1130 - Host XXX is not allowed to connect to this M
在测试连接的时候,发现出现了问题,1130 - Host XXX is not allowed to connect to this MySQL serverd但是我已经修改mysql的文件了啊,将bind改成了0.0.0.0为什么不好使呢?这是因为mysql的权限是非常严谨的,我们虽然设置了可以非本地ip连接mysql,但是mysql默认的话,是不允许非本地ip连接mysql,所以其实只修改 bind是不管用的。虽然我们可以用外部ip连接,但是mysql只会接受本地的连接请求,所以我们要修改一下权限问题。我看的教程是进入mysql然后输入两端sql指令就行了,GRANT ALL PRIVILEGES ON *.* TO ""@"%" identified BY "123456" WITHGRANT OPTION;flush privileges;但是呢,我用这个的时候出现了新的错误access denied for user root@ip这该怎么办呢?我的办法是新建一个mysql的用户,然后从本机连接的话,使用新建的用户,这样子就没有问题了。create user 'datehoer' @ '%' identified by '123123' ; grant all on *.* to 'datehoer' @ '%' ; flush privileges;之后我们在本机使用这个用户登录的时候,发现可以正常连接了。然后就可以使用本机来操作虚拟机的mysql了,如果有什么不会的可以在评论区留言,我会在看到的第一时间进行回复的。
2021年01月11日
5 阅读
0 评论
0 点赞
1
...
4
5
6
...
15