博客文章
这里收集了我在技术、读书和生活里的长期记录。现在一共整理了 55 篇文章,慢慢看,不着急。
- JavaScript
JavaScript ASI 机制
分号对于编程语言来说不是必须的,比如对JavaScript来说,分号你可写可不写,而对于C#来说,没有分号无法通过编译。
- JavaScript
你不知道的 JavaScript 中卷(1、类型)
最近在读《你不知道的 JavaScript 中卷》,不会像上卷那样通篇仔细阅读一章一章的写博客了,因为我没那么多精力了。我每天花一点时间去写一些简单且篇幅不长的博客,这样在地铁或在电梯里花一分钟就可以读完。
- JavaScript
垃圾回收
JavaScript 的垃圾回收是自动进行的,一般情况下,无需开发者去手动 GC。
- C#
C# 中的查询
本文将介绍C#一种非常重要的数据处理方式——查询。例如我想筛选产品中大于10美元的产品,那么C#不同版本都是如何完成查询的呢?
- C#
C# 中的排序
排序是开发中非常常见的场景,我们在不同的C#版本该如何实现排序呢?本文通过讲解C# 1到C# 3不同的实现方案来帮助大家清晰的了解 C# 进化的过程。
- JavaScript
尾调用
尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。
- JavaScript
webpack-dev-server 使用教程
webpack-dev-server是我们在开发nodejs必须要掌握的工具,它可以帮助我们快速搭建开发环境。官网介绍如下
- C#
C# 学习笔记(18)—— 异步编程
在平时的开发过程中,经常会遇到下载文件、加载资源一类的操作,它们都需要耗费一定的时间才能完成。如果这些程序的代码采用同步方式来实现,将严重影响程序的可操作性,因为在文件下载或资源加载的过程中,我们什么都不能做,只能傻傻地等待,也无法获悉执行进度。为了解决这样地问题,异步编程就孕育而生了
- C#
C# 学习笔记(19)—— 文件操作
无论要开发什么样的应用程序,我们都不可避免地要对文件进行操作,所以掌握相关知识就显得格外重要了。.Net Framework 对文件操作提供了很好的支持,它让我们的编程工作变得简单
- C#
C# 学习笔记(17)—— 多线程编程
当我们打开一个应用程序后,操作系统就会为该应用程序分配一个进程ID,例如打开Word时,你将在任务管理器虚的进程选项卡中看到WINWORD.EXE进程
- C#
C# 学习笔记(16)—— 动态类型
C# 是一门静态类型的语言,它在定义变量时要明确给出变量的类型。例如在int i = 5这样的代码中,int就是变量i的类型,如果定义变量时没有明确指定变量的类型,则这样的代码是通过不了编译的
- C#
C# 学习笔记(15)—— C# 4.0
可选参数和命名实参如同一对好基友,因为它们经常一起使用
- C#
C# 学习笔记(14)—— LINQ
LINQ 是 Lanuage Integrated Query 的缩写,即“语言集成查询”的意思。众所周知,做软件开发离不开数据的,你肯定听过SQL数据库、Oracle数据库或本地XML文档等。每种数据源都有自己的查询语言,例如SQL数据库有自己的SQL语言,。LINQ的提出就是为了提供一种跨越各种数据源的统一的查询
- C#
C# 学习笔记(13)—— 扩展方法
什么是扩展方法 扩展方法,首先是一种方法,它可以用来扩展已定义类型中的方法成员 在扩展方法诞生之前,如果想位一个已有类型自定义含有特殊逻辑的新方法时,你必须重新定义一个类型来继承已有类型,以这种方法来添加方法,如果基类有抽象方法,则还要重新实现这些抽象方法 这样,为了扩展一个方法,我们需要承受更多因继承而产的开销。如果继承来扩展现有类型总有些大材小用的感觉。并且值类型或密封累等也不能被继承,不能由此而获得扩展 于是,C# 3.0 提出了扩展方法,用它来为现有的类型添加方法,从未解决了使用继承进行扩展所带来的弊端 扩展方法的使用 定义扩展方法 public static class IEnumerableExtensions { public static bool IsEmpty<T>(this IEnumerable<T> ts) { return ts == null || ts.Count() == 0; } } 从以上代码中,IsEmpty 方法就是一个扩展方法,它的功能就是判断集合是否为空 并不是所有方法都可以作为扩展方法,如何分辨代码中定义的是扩展方法还是普通方法呢?我们需要考察它是否符合下列扩展方法的定义规则 * 扩展方法必须在一个非嵌套、非泛型的静态类中定义 * 至少要有一个参数 * 第一个参数必须加速this关键字作为前缀(第一个参数类型也称为扩展类型,即指方法对这个类型进行扩展) * 第一个参数不能使用任何其他的修饰符(如不能使用 ref、out 等修饰符) * 第一个参数的类型不能是指针类型 这些规则都是硬性规定,无论方法违反了哪一条,编译器都会报错,或认为它不是一个扩展方法 调用扩展方法 成功定义了一个扩展方法后,接下来就是该去调用它 class Program { static void Main(string[] args) { List<string> list = new List<string>(); Console.WriteLine(list.IsEmpty()); // true } } 从以上代码中,list.IsEmpty()调用了我们定义的扩展方法 编译器如何发现扩展方法 编译器会检查所有导入的命名空间和当前命名空间中的扩展方法,并将变量类型匹配到扩展类型,这里存在一个隐式转换的扩展方法 从编译器发现扩展方法的过程来看,方法调用的优先级顺序为: 1、类型的实例方法 2、当前命名空间下的扩展方法 3、导入命名空间的扩展方法 空引用也可调用扩展方法 在 C# 中,在空引用(即 null)上调用实例方法会引发 NullReferenceException 异常,但在空引用上却可以调用扩展方法 代码示例 using System; using System.Linq.Expressions; namespace Demo { class Program { static void Main(string[] args) { string str = null; Console.WriteLine(str.IsNull()); } } static class NullExtension { public static bool IsNull(this object obj) { return obj == null; } } } 以上代码在空引用上去调用扩展方法确实没有出现 NullReferenceException 异常 这段代码中扩展的定义是不规范的。代码扩展了 object 类型,所有继承于 object 的类型都将具有该扩展方法,这就对其他子类型产生了“污染”。之所以叫它污染,是因为我们定义的扩展方法本来只想扩展某个子类,却意外地造成了原本不想造成的后果。更好的实现方式如下: public static bool IsNull(this string str) { return str == null; } 所以当我们为一个类型定义扩展方法时,尽量扩展具体的类型,而不要扩展其基类 在空引用上调用扩展方法没有报错,是因为对于编译器而言,这个过程只是把空引用 “str” 当成参数传入静态方法而已
- C#
C# 学习笔记(12)—— Lambda 表达式
Lambda 表达式是 C# 3.0 中最重要的特性之一,另外一个同样重要的特性是 Linq
- C#
C# 学习笔记(11)—— C# 的春天
如果已经熟悉了 C# 1.0 和 C# 2.0 的核心特性,那么利用这些特性,可以实现任何想要实现的应用程序了。但是我们会常常抱怨;我的代码就不能再简洁点吗?微软正式听到这样的声音,才推出 C# 3.0 中的所有特性 C# 3.0 可谓颠覆了我们的代码编写风格,尤其是 Lambda 表达式和 Linq 这两个特性,相信你在习惯后,定会爱上 C# 3.0
- C#
C# 学习笔记(10)—— 可空类型、匿名方法、迭代器
泛型是 C# 2 众多特性的其中之一,C# 2 还提出了可空类型、匿名方法和迭代器三个重要特性
- C#
C# 学习笔记(9)—— 泛型
C# 2.0 提出的泛型特性使类型可以被参数化,从而不必再为不同的而类型提供特殊版本的方法实现。泛型提供了代码重用的另一种机制,它不同于面向对象中通过继承方式实现代码重用,更准确地说,泛型锁提供的代码重用是算法的重用,即某个方法实现不需要考虑所操作数据的类型
- C#
C# 学习笔记(8)—— 深入理解类型
C# 中的类型可以分为两种——值类型和引用类型,本文详细分析两种类型,并讨论它们之间的类型转换方法
- C#
C# 学习笔记(7)—— 事件
事件是基于委托之上的新特性,自然也是 C# 独有的概念。事件理解起来不难,意思就是他的字面意思,就是我们日常理解的事件
- C#
C# 学习笔记(6)—— 委托
委托是 C# 独有的概念,委托的诞生是为了解决将函数作为参数去传递
- C#
C# 学习笔记(5)—— 接口
接口可以理解为对一组方法声明进行统一的命名,这些方法没有提供任何实现。也就是说,把一组方法声明在一个接口中,然后继承于该接口的类都需要实现这些方法
- C#
C# 学习笔记(4)—— C# 中的面向对象编程
C# 是面向对象语言,所有面向对象语言都有三个特征
- C#
C# 学习笔记(3)—— 类和结构体
类代表一组具有公共属性和行为的对象。比如人,有眼睛、鼻子、嘴巴这些属性以及走路、说话等这些行为,这些属性和行为是公共的
- C#
C# 学习笔记(2)—— 语言基础
只要是语言,就会有标识符和关键字的概念
- C#
C# 学习笔记(1)—— 起步
C#是微软公司开发的一种面向对象语言且运行于.Net Framework之上的高级程序设计语言。因为基于.Net Framework,使得C#拥有丰富的类库和图形控件。当我们开发应用程序可以利用这些现有的控件快速开发。
- JavaScript
JavaScript插件化开发
这个是一个必然,因为我们要协作开发、代码重用
- C#
C#中数组、ArrayList和List的区别
在C#中,数组、ArrayList、List 能够存储一组对象,那么他们区别是什么呢?
- C#
C# 单例模式
单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
- 计算机技术
Socket为什么被翻译成"套接字"
第一次接触"套接字"这个词是在大学里《计算机网络技术》这门课程,英文是"Socket",中译就是:插座、插孔。我很难将Sokect和套接字联系到一起,我也不知道是谁翻译出来的,导致我当时一度难以理解什么是套接字。都怪我国最早那批计算机程序员都是电气工程师,套接是一个工程用词,一般来描述套结式管道
- 环境搭建
搭建npm私有仓库——verdaccio
Verdaccio 是一个简单的、零配置要求的本地私有 npm 注册表。无需整个数据库即可开始!Verdaccio 开箱即用,带有自己的小型数据库,并且能够代理其他注册表(例如 npmjs.org),并在此过程中缓存下载的模块。对于那些希望扩展其存储功能的人,Verdaccio 支持各种社区制作的插件,以连接到服务,例如 Amazon 的
- JavaScript
混合设计“类”
类 / 继承描述了一种代码的组织结构形式 ,一种在软件中对真实世界中问题领域的建模方法。
- JavaScript
对象
我们熟知的对象创建方式:声明形式和构造形式
- JavaScript
闭包
当函数可以记住并访问所在的词法作用域,就产生了闭包,即使函数是在当前词法作用域之外执行的。
- JavaScript
提升
到现在,我们已经明白作用域的概念了,以及根据声明的位置和方式将变量分配给作用域的相关原理。函数作用域和块作用域的行为是一样的,可以总结为:任何声明在某个作用域内的变量,都将附属于这个作用域。 但是,作用域同其中的变量声明出现的位置有某种微妙的联系,而这个细节正是我们将要讨论的内容。
- JavaScript
函数作用域和块作用域
正如上一章讨论,作用域包含了一系列的“气泡”,每一个都可以作为容器,其中包含了标识符(变量、函数)的定义,这些气泡互相嵌套并且整齐地排列成蜂窝型,排列的结构是在写代码时定义的。
- JavaScript
词法作用域
作用域共有两种主要的工作模式,第一种最为普遍,被大多数编语言所采用的词法作用域,另一种叫做动态作用域,仍有一些编程语言在使用(Bash脚本、Perl中的一些模式等) 大多数标准语言编译器的第一个工作阶段叫作词法化(也叫单词化),词法化的过程会对源代码中的字符进行检查。词
- JavaScript
作用域
几乎所有编程语言最基本的功能之一,就是能够存储变量当中的值,并且能在之后对这个值进行访问或修改。那么变量存储在哪里,程序需要时怎么去找到它们?一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则就被称为作用域
- 软件工程
编程过程和规范
软件编程是一个复杂而迭代的工程,它不仅仅是编写代码,还应该包括代码审查、单元测
- 软件工程
软件工程概述
从软件的本质特性出发,回顾软件工程的产生与发展,梳理软件工程的基本概念,并讨论商业环境下的软件质量。
- Git
你必须要知道的git rebase
工作一年多,使用过的git命令一只手都数的过来
- JavaScript
灵活的语言
本篇博客包括后面的关于设计模式的博客均来源于《JavaScript设计模式》
- JavaScript
Constructor
CONSTRUCTOR 的作用 function
- 数据库
PG主从数据库搭建
PG主从数据库搭建 环境 * 操作系统1:Windows Server 2012(X64) * 操作系统2:CentOS 7 * 数据库:PostgreSQL 10.9
- JavaScript
JSON.stringify()
对于undefined、任意的函数以及symbol三个特殊
- JavaScript
原型
JavaScript中的对象有一个特殊的[[prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[[prototype]]属性都会被默认赋
- JavaScript
类
JavaScript提供了更接近传统语言的写法,引入了class(类),作为对象的模板。通过class关键字,可以定义类。
- JavaScript
你不知道的this
this关键字是JavaScript中最复杂的机制之一,同时,它也是JavaScript中最重要的机制之一。本文系统梳理this的常见误解、四条绑定规则及其优先级、绑定例外、以及箭头函数的词法this。
- JavaScript
完全理解 arguments
它是JS的一个内置对象,常被人们所忽略,但实际上确很重要,JS不像JAVA是显示传递参数,JS传
- JavaScript
柯里化
Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
- JavaScript
浏览器多线程和 Js 引擎单线程
学术上说,进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。我们这里将进程比喻为工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
- JavaScript
JavaScript 运行时环境
每一个浏览器都有自己的 Js 运行时环境
- JavaScript
JavaScript 数据类型
在JavaScript中一共有六种语言类型
- JavaScript
JavaScript 高级函数
reduce 的语法:
- JavaScript
JavaScript 模块化
从无模块时代到 ES Module,系统梳理 JavaScript 模块化的演进:CommonJS、AMD(RequireJS)、CMD(SeaJS)、ES6 Module 的设计思路、用法差异以及 require 与 import 的本质区别。