《JavaScript高级程序设计》笔记(一)
语言基础变量var 关键字使用 var 声明变量需要注意其作用域和声明提升。函数中声明的变量会称为包含它的函数的局部变量
12345function test() { var message = 'hi' // 局部变量}test()console.log(message) // 报错
如果去除上述代码中的 var 关键字,message 变量将会变成全局变量
12345function test() { message = 'hi' // 全局变量}test()console.log(message) // hi
注意:不要省略操作符定义全局变量,在局部作用域中定义的全局变量很难维护,也会造成困惑。使用 var 关键字声明的变量会自动提升到函数作用域的顶部
12345function foo() { console.log(age) var age = 27}foo() // undefined
let 声明let 跟 var 作用相似,主要区别如下:
let 声明的范 ...
《JavaScript高级程序设计》笔记(二)
迭代器与生成器理解迭代
循环是迭代机制的基础,因为它可以指定迭代的次数,以及每次迭代要执行什么操作。
迭代会在一个有序集合上进行(“有序”可以理解为集合中所有项都可以按照既定的顺序被遍历到,特别是开始和结束项有明确的定义)
通过循环进行迭代:
必须事先知道如何使用数据结构
便利顺序不是数据结构固有的
为解决上述问题,实现开发者无须事先知道如何迭代就能进行迭代操作,出现了迭代器模式
迭代器模式迭代器模式是指可以把某些结构称为“可迭代对象”,它们实现了正式的 Iterable 接口,而且可以通过迭代器 Iterator 消费。迭代器是按需创建的一次性对象。每个迭代器都会关联一个可迭代对象,而迭代器会暴露其可迭代对象的 API。
可迭代协议实现 Iterable 接口要求同时具备两种能力:
支持迭代的自我识别能力
创建实现 Iterator 接口的对象的能力
在 ECMAScript 中,通过以 Symbol.iterator 作为键的属性,引用一个迭代器工厂函数。调用这个工厂函数必须返回一个新迭代器。实现 Iterator 接口的内置属性包括:
字符串
数组
映射
集合
arg ...
《JavaScript高级程序设计》笔记(三)
期约与异步函数异步编程
同步行为对应内存中顺序执行的处理器指令;异步行为类似于系统中断,即当前进程外部的实体可以触发代码执行
早期 JavaScript 中使用定义回调函数来表明异步操作完成。串联多个异步操作通常需要深度嵌套的回调函数(回调地狱)来解决
期约(Promise)期约基础ES6 新增的引用类型 Promise,可以通过 new 操作符来实例化并传入执行器(executor)函数作为参数。期约是一个有状态的对象,处于以下 3 种状态之一:
待定(pending)
兑现(fulfilled,也称“解决”,resolved)
拒绝(rejected)
待定是期约的最初始状态。在待定状态下,期约可以落定(settled)为代表成功的兑现状态或代表失败的拒绝状态。期约的状态是私有的,不能直接通过 JavaScript 检测到。期约主要有两大用途。首先是抽象地表示一个异步操作,通过期约的状态表示期约是否完成。其次,期约封装的异步操作会实际生成某个值,在程序期待期约状态改变时可以访问这个值,如果被拒绝则期待拿到拒绝的理由。为了支持上述用例,每个期约只要状态切换为兑现,就会有一个私有 ...
《JavaScript高级程序设计》笔记(四)
事件事件流事件流描述了页面接收时间的顺序。事件冒泡的事件被定义为从最具体的元素开始触发,然后向上传播到没那么具体的元素。现代浏览器中的事件会一直冒泡到 windows 对象。事件捕获的意思是最不具体的元素最先收到事件,最具体的节点最后收到事件。事件捕获是为了在事件到达最终目标前拦截事件。DOM 事件流规定事件流分为 3 个阶段:事件捕获、到达目标和事件冒泡。
事件处理程序为响应事件而调用的函数称为事件处理程序(或事件监听器)。JavaScript 中传统的事件处理程序是把一个函数赋值给元素的一个事件处理程序属性。例如:
1234let btn = document.getElementById('myBtn')btn.onClick = function () { console.log('Clicked')}
DOM2 Events 为事件处理程序的赋值和移除定义了两个方法:addEventListener 和 removeEventListener。方法接收 3 个参数:事件名、事件处理函数和一个布尔值(true 表示 ...
《学会学习》笔记
Video 1 - 学习的秘密什么是学习学 = 预习 + 听课 + 拓展学习习 = 练习 + 测试 + 笔记 + 创造
学习的真相学习本身是无聊和痛苦的,唯一要注意的是坚持为什么能看懂但是写不出来?模仿是“学”,创造是“习”,学习没有魔法只有多练推荐观看:《罗辑思维 183 怎样成为一个高手》:重复做自己不会做的事(脱离舒适区)
Video 2 - 拖延症为什么要战胜拖延症?三流的人+一流的执行力 > 一流的人+三流的执行力
拖延症的原因
干扰太多(手机,朋友…
借口太多,所谓追求完美
没有目标,计划没有可操作性
挑战拖延症的方法
学习过程中手机静音放包里
允许不完美,够用就行,让“借口”闭嘴
定计划,设 deadline,任务分解到半天(使用 todolist)
todolist 分为立即行动和待办事宜两个板块,待办事宜用于存放突发事件或临时起意的事件
计划定下了不能改变。如何应对紧急突发事件?留出机动时间
计划要足够详细(when?where?what?)
新的想法加入待办事宜,不要影响本周已有计划
做计划先做最重要的事情,不要用“不重要但是简单”的事情麻痹自己,假装很忙
...
《C#图解教程》中的异步操作
在阅读《C#图解教程》第五版21.9 其他异步编程模式时,按照示例代码使用 BeginInvoke函数发现出现了报错信息:
1Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
经过查询文档,从 .NET Framework 4 开始,任务并行库为异步和并行编程提供了新的模型,即基于任务的异步模式(TAP)。在最新的 .NET 平台上,BeginInvoke 函数和EndInvoke函数已经不再支持。参考:
Migrating Delegate.BeginInvoke Calls for .NET Core
WSL开发环境搭建
WSL 安装输入 wsl --install命令安装 WSL,详情可参考微软官方文档
Ubuntu 系统安装使用 wsl --list -o命令查看可选的 Linux 发行版本,使用 wsl --install -d Ubuntu-22.04安装最新的 LTS 版本 Ubuntu 系统。等待安装完成后点击主菜单中的 Ubuntu-22.04 配置用户名和密码,通过 Windows Terminal 就可以连接到 WSL 子系统。
替换 APT 源首先备份官方源文件
1sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
修改源文件为清华源
12345678910111213# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse# deb-src https://mirrors.tuna.tsinghua.edu.cn/ ...
Manjaro安装流程
在公司老台式机上使用了两个月Ubuntu之后,无比怀念从AUR仓库下载一切的快乐时光,决定将工作机器从Ubuntu再次换回Manjaro,同时写一篇记录和注意事项,方便万一系统挂了或者又要装新机器时参考。
制作启动盘首先从官网下载最新的系统镜像,有多个版本可以选择,如果对Linux并不是非常熟悉,建议选择KDE版本下载
Windos系统如果使用的是Windows系统,可以下载Rufus来创建启动盘
Linux系统如果使用的是Linux系统,则使用dd命令来进行创建,具体命令如下:
1234567891011121314151617# 查看盘符等信息sudo fdisk -l# 假设U盘对应的盘符为 /dev/sdc# 先卸载U盘# 加*是因为:U盘存在多个分区,比如sdc1, sdc2sudo umount /dev/sdc*# 格式U盘为FAT格式# 常见Linux的ISO文件没有超过的4G的,所以可以选择FAT格式。# -I:如果U盘存在多个分区,就需要这个参数强行抹除,不加这个参数会失败;sudo mkfs.vfat /dev/sdc -I# 直接写入镜像# 上一步使用了-I参数 ...
2021年终总结
今天是2021年的最后一天,正好也是这周的最后一个工作日,因为晚上还要去酒吧喝酒,就摸鱼做一下年度总结吧。
2021 ʕ º ᴥ ºʔ
2021年的新年,因为疫情的原因没有离开成都,也是我第一次没有跟父母一起过年。不过好在朋友正好有来成都旅游的计划,所以一块在日租房过了除夕。除了这一点点特殊之处,纵观全年下来,今年算得上是平凡的一年了。
工作相比较刚加入公司第一次做Hybrid开发时候的不适应,现在已经基本能够熟练的使用APICloud,需求上也没有什么技术性的难点。当然也不总是一帆风顺,由于自己的不小心和提交代码时没有认真检查,造成了一两次忘记修改调试时改的代码就打正式包发版本的小事故,还好最后都顺利解决了。经历过一次UI方面的大改版之后,往后的需求基本上都是缝缝补补,没有大动,总的说工作内容上基本没有什么挑战性,还是比较闲散的。
生活今年最困扰的事情依旧是成都购房计划。虽然已经成功的落户,应该是具有购房资格了,但是成都的房价实在是emm…如果跟北上广比的话其实是白菜价了,只不过对于普通家庭来说如果想要在通勤上少妥协一点,或者住在城南还是有很大压力。放低要求去看城北的房子,预算内倒是 ...
MySQL速查笔记
数据库操作基础1 - 数据库的操作1.1 显示数据库1show databases;
1.2 创建数据库1create database [if not exists] `数据库名` [字符编码];
注意:
如果创建的数据库已存在会报错,所以创建数据库时需要先判断是否存在;
如果数据库名是关键字和特殊字符会报错,需要在特殊字符、关键字行加上反引号;
1.3 删除数据库1drop database [if exists] 数据库名;
1.4 显示创建数据库的 SQL 语句1show create database 数据库名;
1.5 修改数据库修改数据库的字符编码:
1alter database 数据库名 charset=字符编码;
1.6 选择数据库1use 数据库名;
2 - 表的操作2.1 显示所有表1show tables;
2.2 创建表1234create table [if not exists] 表名( 字段名 数据类型 [null|not null] [auto_increment] [primary key] [comment] 字段名 数据类型 ...