0%

说明
1. 参考整理自Michael Aranda的文章What’s the difference between JavaScript and ECMAScript?

概念解释

Ecma International(European Computer Manufacturers Association)

  1. 一个为科学技术制定标准的组织。

  2. 为了要举一个“标准”的例子,可以用我们曾用过的键盘来说明。是不是大多数的字母以同样的顺序排列,有一个空格键、一个输入键、箭头键,并将数字显示在最上面的一行?这是由于大多数键盘制造商的键盘设计是基于QWERTY布局标准的。

  3. ECMA-262:由Ecma International发布的标准。它包含通用目的的脚本语言的规范。

    ECMA-262
    • ECMA-262是一个类似QWERTY的标准,但不同于呈现一个键盘层的规范,它呈现了被称为ECMAScript的脚本语言规范。

    • 可以把ECMA-262当做ECMAScript参考数字

    可以把ECMA-262 当做ECMAScript的参考数字

脚本语言(A scripting language)

A programming language designed specifically for acting on an existing entity or system

什么样的编程语言是脚本语言?请思考下命令“walk”、“run” 和 “jump”。这些操作需要一些东西来执行,可能是一个人、一条狗或一个视频游戏角色。如果没有东西来执行这些命令,“walk”、“run” 和 “jump” 是没有意义的。这组操作类似于脚本语言,即专注于操纵外部实体。

ECMAScript/ECMAScript规范(ECMAScript specification)

ECMA-262中定义的标准,是用于创建通用目的脚本语言。ECMA-262是标准的名称,它代表了脚本语言规范ECMAScript。

ECMAScript提供脚本语言必须遵守的规则、细节和准则,这些才是其被视为兼容ECMAScript的判断标准。

JavaScript

一种通用目的的脚本语言,遵循ECMAScript规范。它是ECMAScript语言的一个分支版本。

通过阅读ECMAScript规范,你将学会如何创建脚本语言。通过阅读 JavaScript文档,你将学习如何使用脚本语言。

当人们把JavaScript称为“ECMAScript语言的方言”的时候,他们的意思就像谈论英语、法语或者中国方言时一样。一种方言从其母语中衍生出大部分的词汇和语法,但偏离得值得保留这些差异。

JavaScript实现了多数ECMA-262中描述的ECMAScript规范,但存在少数差异。 Mozilla在此概述了JavaScript的非ECMAScript语言功能:

JavaScript的非ECMAScript语言功能

JavaScript引擎(A JavaScript engine)/JavaScript interpreter解释器/JavaScript implementation实现

能够理解和执行JavaScript代码的程序或解释器。

JavaScript引擎通常可以在Web浏览器中被发现,包括Chrome中的 V8,火狐中的SpiderMonkey,以及Edge中的Chakra。每款引擎就像是一个用于其应用程序的语言模块,可以让其支持某种JavaScript语言的分支。

JavaScript引擎对于浏览器来说就像是人类对语言的理解一样。如果我们重新拿我们日常行为中的“走”、“跑”、“跳”来举例的话,一个 JavaScript引擎是真正能够理解这些动作是何意义的根本机制。

浏览器性能的差异

两个人也许会识别“跳”的命令,但是一个人由于理解和对命令的处理比另一个人更快些,也许会比另一个人对命令的反应更快些。类似的是,两个浏览器都可以理解JavaScript代码,但是一个由于其JavaScript引擎实现起来效率更高而运行得更快。

浏览器

浏览器支持(browser support)的差异

再以即使说同样语言的人们之间也会有差异为例。即使许多人讲英语,但是一些人也许懂得他人不懂的某些词、表达式和与语法规则,反之亦然。浏览器也是同样的道理。尽管浏览器的 JavaScript 引擎都理解 JavaScript ,但是某些浏览器会比其他的浏览器对 JavaScript 理解得更好些。在浏览器对 JavaScript 的支持中就存在着这一的差别。

至于说到浏览器支持,人们通常会谈到 “ECMAScript 兼容性(compatibility)” 而非“ JavaScript 兼容性”,尽管 JavaScript 引擎解析和执行的是 JavaScript 。这个问题说起来有点绕,下面的表格可以对其作出解释。

浏览器支持(browser support)的差异

如果你还记得的话,ECMAScript 是一份规定了脚本语言可以看起来像什么的规范。发布一个新的 ECMAScript 版本并不意味着所有现存的 JavaScript 引擎突然就拥有了这些新功能。这取决于负责那款 JavaScript 引擎的团体或组织是否要更新到最新的 ECMAScript 规范并采用其所带来的变化。

因此,开发者倾向于问这样的问题,“这款浏览器支持哪个版本的 ECMAScript ?”或者“这款浏览器支持哪些 ECMAScript 功能?”他们想知道是否 Google、Mozilla 和微软已经开始更新他们浏览器的 JavaScript 引擎了,例如 V8、SpiderMonkey 和 Chakra 是否都已经具有最新的 ECMAScript 中的功能了。

ECMASCript 兼容性列表是回答这类问题的绝佳答案参考。

如果新版的 ECMAScript 发布了,JavaScript 引擎不会一下子整合所有的更新。他们会逐渐地加入 ECMAScript 功能,这一点从火狐的 JavaScript 变更记录中可见一斑:

Firefox’s JavaScript changelog

JavaScript运行时(A JavaScript runtime)/宿主环境(Host environment)

The environment in which the JavaScript code runs and is interpreted by a JavaScript engine.The runtime provides the host objects that JavaScript can operate on and work with.

The JavaScript runtime is the “existing entity or system” mentioned in the scripting language definition. Code passes through the JavaScript engine, and once parsed and understood, an entity or system performs the interpreted actions. A dog walks, a person runs, a video game character jumps (or in the case of the above image, wrecks).

Applications make themselves available to JavaScript scripting by providing “host objects” at runtime. For the client side, the JavaScript runtime would be the web browser, where host objects like windows and HTML documents are made available for manipulation. Have you ever worked with the window or document host objects? The window and document objects are not actually a part of the core JavaScript language. They are Web APIs, objects provided by a browser acting as JavaScript’s host environment. For the server side, the JavaScript runtime is Node.js. Server-related host objects such as the file system, processes, and requests are provided in Node.js.

n interesting point: different JavaScript runtimes can share the same JavaScript engine. V8, for example, is the JavaScript engine used in both Google Chrome and Node.js — two very different environments.

ECMAScript 6

  1. 它是 ECMA-262 标准的第六个版本,其特点是对 ECMAScript 规范有着显著的变化和改进。
  2. 同义词:ES6、ES2015 和 ECMAScript 2015
  3. 这一版的 ECMAScript 将其名字由 ES6 改为了 ES2015 ,这是由于 Ecma 国际决定每年都对 ECMAScript 发布一次。相应地,Ecma 国际也开始基于每年所发布的来命名新版本的 ECMAScript 规范。简而言之, ES6 和 ES2015 是对同一件事情的两个不同的名字。

说明
1. 部分参考O'Reilly Media出版的JavaScript Programming_A Brain-Friendly Guide

一、基本概念与简介

JavaScript工作原理

JavaScript工作原理
  1. JavaScript最初是解释型的,这意味着浏览器执行(execute)它遇到的每行JavaScript代码。浏览器厂商对现代JavaScript采取即时编译的做法,使其既可获得脚本语言的便利性,又可享受编译型语言的性能。

    编译型语言如C、C++和Java在执行代码前必须进行编译(compile),编译是将代码转换为适合计算机的表达方式,通常可改善运行阶段的性能。

  2. JavaScript的使用范围不仅仅在网页上,还用在各种应用程序(如Photoshop)以及服务器端编程中。

  3. 使用HTMl和CSS时,两者主要都是声明型的(declarative),JavaScript负责计算,利用它能在网页中添加行为。

    语言 内容 作用
    HTMl markup标记 statements结构
    CSS rules规则 styles样式
    JavaScript statements语句 computation/behavior计算和行为

如何将JavaScript代码加入网页

可在HTML文档中的任何地方使用<script>标签添加JavaScript代码

代码位置
  1. 嵌入在<head>

  2. 嵌入在<body>

    • 浏览器加载网页时,先加载<head>元素内的所有内容,再加载<body>元素。如果将代码放在<head>元素中,用户可能需要等一会儿才能看到网页,而放在<body>元素中,则用户在等待这些代码加载时,就能看到网页的内容。
  3. 代码放在独立的文件中,并在<head>元素中链接该文件

    • <script>标签的src属性来指定JavaScript文件的URL
  4. 代码放在独立的文件中,并在<body>元素中链接该文件

  5. <script>元素

    1
    2
    <script type="text/javascript">
    alert("Hello world!"); 
    </script>

    • type可以省略

    1
    2
    <script src="myJavaScript.js">
    </script>

    • 引用独立的JavaScript文件时,<script>元素不能包含任何JavaScript代码

二、语法

语法基础

  1. 每条语句以;结尾
  2. 单行注释用//两个斜杠打头
  3. 空格不重要
  4. 字符串必须使用单引号或者双引号括起,而布尔值truefalse则不能
  5. JavaScript区分大小写,故变量名、关键字和函数名等几乎所有一切的大小写都很重要。

变量Variables和值values

  1. JavaScript语句通常包含变量,变量用来存储值(如数字、字符串和布尔值等)

    布尔值无需用引号括起

  2. var关键字用来声明变量,声明变量时可以给它赋值,也可以不指定初始值。

    1
    2
    var winners = 2;
    var losers;

  3. 变量名的命名规则和建议

    • 以字母、下划线或美元符号$开头,后接任意数量的字母,数字,下划线或美元符号$

    • 不能使用任何内置的关键字作为变量名。

    • 不能包含空格和引号。

    • 推荐使用有意义的变量名,如currentPressure和passedExam

    • 用多个单词做变量名时通常采用骆驼式拼写法(camel case),即将每个单词的首字母大写(第一个单词除外),如:twoHeadedDragonWithFire。

    • 通常不要用_$开头的变量名

      关键字

      关键字keyword:是JavaScript的保留字reserved word,JavaScript将其用于特殊目的。

表达式expressions

  1. 表达式用来计算结果,根据结果的值的不同可以分为数值表达式,字符串表达式,布尔表达式、数组表达式、对象表达式和函数表达式。

    1
    2
    3
    4
    5
    数值表达式 var total = price - (price * (discount / 100));

    字符串表达式 "Dear " + "Reader" + ","

    布尔表达式 cost >= 3.99

循环

  1. while循环

    • (scoops > 0)称为条件测试(简称为条件),包含一个布尔表达式

    • 如果条件测试为true,就执行代码块中所有的代码。如果条件测试为false,就结束循环。

    • 有些代码的条件是一个变量,其值为字符串而不是布尔值。任何包含非空字符串的变量都被视为true而没有设置值的变量都被视为false

    • 仅使用布尔变量本身时,只要该变量为true,条件测试就为true,进而执行相应的代码块。

      • if (inStock){...}如果inStock为false,条件测试将失败
    • 代码块即用花括号{}括起来的一组语句,代码块中的所有语句被视为一个整体,要么都执行,要么都不执行。

      1
      2
      3
      4
      while(scoops > 0){
      document.write("Another scoop!");
      scoops = scoops - 1;
      }

  2. for循环

    for循环
    • for循环以关键字for打头
    • 圆括号中有三部分
      • 第一部分是初始化循环变量,初始化只在循环开始前执行一次
      • 第二部分是条件测试,每次循环时都将执行该测试,如果为false就结束循环
      • 第三部分将计数器加1。每次循环都这么做,这是在执行完循环体的所有语句后进行的。
  3. for in循环

  4. forEach循环

  5. do while循环

    • 工作原理与while几乎相同,只是先执行循环体中的语句,再检查循环条件。
  6. if语句进行决策

    • 在if语句中还可以添加一个或多个else if语句,以执行多重检查。

    • 还可在最后添加一条else语句,以处理所有条件都不满足的情形。

      1
      2
      3
      4
      5
      6
      7
      	if (scoops >= 5) {
      	alert("Eat faster, the ice cream is going to melt!");
      } 

      else if (scoops < 3) { alert("Ice cream is running low!"); }

      else {
      alert("Still lots of ice cream left, come and get it.");
      }

与用户交互的常见方式

  1. 创建提醒框

    • 调用函数alert()创建包含消息的提醒框
    • 仅当你要停止一切并提醒用户时,才应使用它
  2. 直接写入文档

    • 调用函数document.write()将任何HTML和内容写入网页
  3. 使用控制台console

    • 调用函数console.log(),并传入要写入的字符串
    • 可将console.log()视为杰出的故障排除工具
    • console实际是一个对象,而log则是console的一个方法
    • 仅用于在开发网页期间调试代码troubleshoot,用户可能根本看不到控制台
    • 可将控制台视为具有特定功能的对象,其功能之一是写入日志,其语法为console.log,并将用圆括号括起的输出传递给它。
    • 如何打开控制台?
    如何打开控制台
  4. 直接操作文档

    • 利用文档对象模型(document object model,DOM)操作文档
  5. 获取用户输入

    • 函数prompt()用于获取用户输入,它会弹出一个简单的对话框,包含传入该函数的字符串参数并且返回用户输入的字符串值。如果用户取消了对话框或没有输入任何响应,返回的将是null(表示没有值)。
  6. 显示输出

    • 函数alert()

三、函数

常用函数

  1. Math.random()用来生成[0, 1)的随机数

    只要调用函数,都需要使用括号()

  2. Math.floor()用来对一个小数取整(直接舍弃小数位),即向下化整

函数语法

  1. 定义函数/声明函数

    1
    2
    3
    function functionname(parameter1,parameter2) {
    这里是要执行的代码
    }
    函数组成部分

    • 以关键词function打头,接下来指定函数名。函数名的命名规则与变量命名规则一样。
    • parameters为函数的形参,将其放在函数名后面的括号内,将在调用函数时,给形参赋值
    • {}之间的内容被称为函数体(the body of the function)
  2. 调用带参数的函数

    1
    myFunction(argument1,argument2)

    • argument为实参,调用函数时,传给函数的实参的值被赋给相应的形参
    • 可以通过实参传递任何JavaScript值,如字符串、布尔值、数字、变量甚至表达式(对于表达式,先计算它的值,再将值传递给函数)。
  3. 函数表达式(statement)

    • 没有函数名称,且位于一条赋值语句的右边,被赋给一个变量,是一个指向函数的引用。

      1
      2
      3
      4
      5
      6
      7
      var fly = function(num) {
      for (var i = 0; i < num; i++) {
      console.log("Flying!");
      }
      };
      fly(3);
      # 通过变量fly来调用函数

  4. 函数声明和函数表达式之间的区别

    • 在分析(parses) 网页期间(执行任何代码之前),浏览器查找函数声明,找到函数声明时,浏览器创建相应的函数,并将得到的函数引用赋给与函数同名的变量。在处理完所有的函数声明后,浏览器回到代码开头,开始按从头到尾的顺序执行代码。换言之,使用函数声明时,函数将在执行代码前创建,而使用函数表达式时,函数将在运行阶段执行代码时创建。
    • 函数声明是完整的语句,而函数表达式只是语句的一部分。可以认为函数声明包含一条隐藏的赋值语句,这条语句将函数引用赋给一个变量。
    • 函数表达式返回一个引用,该引用指向函数表达式创建的函数。

按值传递实参(pass-by-value)

按值传递实参
  1. 即把每个实参的值复制给形参,其意义在于,在函数中修改形参的值时,只会影响形参,而不会影响传递给函数的变量。
  2. 在函数中处理形参时,其影响范围将限制在函数中。

错误地调用函数

  1. 传入的实参不够:将没有相应实参的形参设置为未定义undefined
  2. 传入的实参太多:将忽略多余的实参

函数可返回值return

  1. 函数体中遇到return语句,函数会直接返回return语句中的值,并停止函数运行,哪怕return语句之后还有语句。
  2. 如果return语句没有指定值(空的),则返回undefined。
  3. 如果一个函数没有return语句,则它的返回值是undefined。

作用域(scope)

  1. 全局变量
    • 在函数外使用关键字var声明。
    • 只有一个全局作用域,也就是说不同的JavaScript脚本共享同一个全局作用域。如果在网页链接到了其他的脚本,这些脚本也能够看到这些全局变量,而你也可以看到它们的全局变量。
    • 全局变量的寿命和网页一样长。重新加载网页时,将销毁并重新创建所有的全局变量。
    • 使用没有关键字var声明的变量,会被自动视为全局变量,即使在函数中首次使用它,亦如此。
  2. 局部变量
    • 在函数中声明的变量叫局部变量,这样的变量只在函数中可见,也只能用在函数中
    • 局部变量是在函数被调用后创建的,并一直活到函数返回(无论函数是否返回值)
    • 如果局部变量使用了与全局变量相同的变量名,那么在这个局部作用域中,全局变量是不可见的。即同名局部变量遮住(shadow)了全局变量
    • 将函数作为实参传递给另一个函数时,传入的函数引用将被复制到所调用函数的一个形参变量中,与其他形参一样,存储函数引用的形参也是局部变量。
  3. 变量提升
    • JavaScript引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明提升至当前作用域的顶端,然后进行接下来的处理。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      var foo = 3;

      function hoistVariable() {

      var foo = foo || 5;

      console.log(foo); // 5
      }

      hoistVariable();
      预编译之后的代码逻辑是这样的:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      var foo = 3;

      //预编译之后

      function hoistVariable() {
      var foo;

      foo = foo || 5;

      console.log(foo); // 5
      }

      hoistVariable();

      #只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。
      #只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。

  4. 全局函数
    • 在代码顶层定义的函数
  5. 局部函数
    • 在函数中定义的函数(nested,嵌套)
    • 在函数内部,如果你使用函数声明创建了一个嵌套函数,那么在这个函数的函数体的任何地方,嵌套函数都是已定义的;
    • 如果使用函数表达式创建了一个嵌套函数,则在这个函数的函数体内,仅当函数表达式执行后,嵌套函数才是已定义的。
  6. 词法作用域(lexical scope)的工作原理
    • 词法(lexical)意味着只需查看代码的结构就可确定变量的作用域,而不是等到代码执行时才明白。换而言之,即JavaScript的作用域规则完全基于代码的结构,而不是一些动态的运行阶段属性。

    • 因此,对于在函数中引用的变量,要确定它是在哪里定义的,可从最里面(当前函数)开始依次向最外面进行查找,直到找到它为止。

    • 实例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      #实例1 

      var justAVar = "Oh, don't you worry about it, I'm GLOBAL";

      function whereAreYou() {
      var justAVar = "Just an every day LOCAL";
      return justAVar;
      }

      var result = whereAreYou();
      console.log(result);

      #显示Just an every day LOCAL

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      #实例2

      var justAVar = "Oh, don't you worry about it, I'm GLOBAL";

      function whereAreYou() {
      var justAVar = "Just an every day LOCAL";

      function inner() {
      return justAVar;
      }

      return inner();
      }

      var result = whereAreYou();
      console.log(result);

      #显示Just an every day LOCAL

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      #实例3

      var justAVar = "Oh, don't you worry about it, I'm GLOBAL";

      function whereAreYou() {
      var justAVar = "Just an every day LOCAL";

      function inner() {
      return justAVar;
      }

      return inner;
      }

      var innerFunction = whereAreYou();
      var result = innerFunction();

      console.log(result);

      #显示Just an every day LOCAL

    • 环境(environment)存储了局部作用域内定义的所有变量。每个函数都有与之相关联的环境,其中包含它所处作用域内的局部变量。当返回这个函数时,返回的不仅仅是函数,还有与之相关联的环境。

      • 每个嵌套函数都有自己的小环境,其中包含它自己的变量,这将形成一个环境链,从内到外依次为各个嵌套函数的环境。在环境中查找变量时,也需要从最近的环境着手,沿环境链不断往下查找,直到找到变量为止。如果环境链中没有找到,再在全局环境中查找。
      • 可将形参视为函数的局部变量,因此形参也包含在环境(environment)中。
      • JavaScript函数都是在定义它的环境中执行的。
      环境

闭包(closure)

  1. 闭包(closure) 的定义:闭包指的是函数和引用环境。

    闭包
  2. 自由变量(free variables)的定义:不在本地作用域内定义的变量。

  3. 可敲定函数(closes the function)的定义:给所有自由变量都提供了值的环境。

    敲定函数
  4. 从函数返回函数来创建闭包:计数器实例

    • 在全局作用域中,根本看不到变量count,但每次调用doCount时,都可以使用变量count。

    • 除了调用doCount外,没有其他任何办法能够获取变量count。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      function makeCounter() {
      var count = 0;

      function counter() {
      count = count + 1;
      return count; }

      return counter;
      }

      var doCount = makeCounter();
      console.log(doCount()); #显示1
      console.log(doCount()); #显示2
      console.log(doCount()); #显示3

      闭包-计数器
  5. 将函数表达式用作实参来创建闭包

    • 我们传递给makeTimer的函数是一个闭包,带有将自由变量doneMessage绑定到字符串"Cookies are done!"的环境。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      function makeTimer(doneMessage, n) {

      setTimeout(function() {
      alert(doneMessage);
      }, n);

      }

      makeTimer("Cookies are done!", 1000);

  6. 闭包包含的是实际环境,而非环境的副本

    • 环境引用的是实时变量,如果闭包函数外面的代码修改了变量,闭包函数执行时看到的将是变量的新值

函数提升

  1. 浏览器分两遍读取网页:

    • 第一遍读取所有的函数定义(由函数声明创建的函数)
    • 第二遍开始执行代码
  2. 可将函数放在JavaScript脚本的任何地方。

    1
    2
    3
    4
    5
    6
    7
    8
    var radius = 5;
    var area = circleArea(radius);
    alert(area);

    function circleArea(r) {
    var a = Math.PI * r * r;
    return a;
    }

函数是一等值(first class values)

  1. 一等值(first class values)的特点(数值、字符串、布尔值、函数和对象都是一等值)

    • 将其赋给变量或存储在数组和对象等数据结构中
    • 将其传递给函数
    • 从函数中返回它们
  2. 一等值的定义:在编程语言中,可像对待其他任何值一样对待的值,包括赋给变量、作为实参传递给函数以及从函数中返回。

  3. 向函数传递函数

    • 只需将函数名用作实参即可

    • 传递的是指向函数的引用,可将这种引用视为指针(pointer),它指向函数本身的内部表示。引用本身可存储在变量中,可赋给变量,还可作为实参传递给函数。

      1
      2
      3
      4
      5
      var allCanFly = processPassengers(passengers, checkNoFlyList); 
      if (!allCanFly) { console.log("The plane can't take off: we have a passenger on the no-fly-list.");
      }

      #checkNoFlyList即传入的函数

  4. 从函数返回函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function createDrinkOrder(passenger) {
    var orderFunction;

    if (passenger.ticket === "firstclass") {
    orderFunction = function() {
    alert("Would you like a cocktail or wine?");
    };

    } else {
    orderFunction = function() {
    alert("Your choice is cola or water.");
    }; } return orderFunction;
    }

匿名函数(anonymous functions)

  1. 匿名函数是没有名称的函数表达式,用于通常需要函数引用的地方。

    window.onload = function() { alert("Yeah, that page loaded!"); };

    • 如果需要将一个函数作为实参,可将实参指定为函数表达式
      1
      2
      3
      setTimeout(function() {
      alert("Time to take the cookies out of the oven");
      }, 600000);
    • 如果需要从函数返回一个函数,也可返回一个函数表达式

四、数据结构

数组(Arrays)

  1. 创建数组

    • 用数组的字面量(array literal)创建数组(即详细地指定了该数组包含的元素)

      var flavors = ["vanilla", "butterscotch", "lavender", "chocolate", "cookie dough"];

      • []中依次输入每个数据,用,隔开即可。
      • 数组中每一项的数据类型可以是任意的,字符串,布尔值,数值,甚至数组,函数和对象都可以。
      • 数据的个数也没有限制,但受制于计算机内存。
      • 不要求一个数组中所有值的类型都相同。
  2. 访问数组元素

    var flavorOfTheDay = flavors[2];

    • []中的数字表示数组的索引位置,数组的索引从0开始
  3. 修改数组元素

    flavors[3] = "vanilla chocolate chip";

  4. 确定数组的长度

    var numFlavors = flavors.length;

    • 每个数组都有一个length属性,它的值也就是数组的长度,等于数组的最大索引值+1
  5. 给数组添加新元素

    • 只需给指定索引处的元素赋值即可,但必须小心地指定索引,否则数组将是稀疏的(sparse)

      1
      2
      3
      4
      var genres = []; 
      genres[0] = "Rockabilly";
      genres[1] = "Ambient";
      var size = genres.length;

    • 稀疏数组是指有些索引处有值,而其他索引处没有值的数组。

      1
      2
      3
      var sparseArray = [ ]; 
      sparseArray[0] = true;
      spraseArray[100] = true;

      • 犹如创建了99个变量,但没有对其初始化。这些变量虽然没有值,但是仍占用计算机的内存空间。

      • 检查元素的值是否是undefined,可编写如下代码:

        1
        2
        3
        if (myarray[i] == undefined) {
        ...
        }

      • undefined是一个值,而不是字符串,因此不能在前后加上引号。

    • push方法

      1
      2
      3
      var genres = []; 
      genres.push("Rockabilly");
      genres.push("Ambient");

  6. 平行数组(parallel arrays)

    平行数组
  7. 数组方法sort的工作原理

    • 根据一个知道如何对两个数组元素进行比较的函数对数组进行排序。

      • 对于数字,使用<>、和==进行比较;
      • 对于字符串,按字母顺序进行比较
      • 对于对象,采用自定义的方式根据对象的属性进行比较
    • sort方法要求我们的函数在第一个数字大于第二个数字时返回一个大于0的值,在它们相等时返回0,并在第一个数字小于第二个数字时返回一个小于0的值。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      function compareNumbers(num1, num2) { 
      if (num1 > num2) {
      return 1;
      } else if (num1 === num2) {
      return 0;
      } else {
      return -1;
      }
      }

      numbersArray.sort(compareNumbers);

    • sort方法是破坏性的,将就地修改数组,而不是返回一个排序后的新数组。

五、对象(Objects)

创建对象

  1. 定义并创建对象的实例
    • 添加对象变量声明

    • 花括号{}内定义对象的所有属性(properties)

    • 每个属性的定义都包含名称、冒号和值,用逗号分隔属性名和属性值对,冒号分隔属性名和属性值。

    • 包含空格的字符串用作属性名时,必须用括号将其括起

      1
      2
      3
      4
      var widget = { 
      cost$: 3.14,
      "on sale": true
      };

    • 属性名可以是任何字符,但通常遵循变量命名规则

    • 对象变量声明也以分号结束

      1
      2
      3
      4
      5
      6
      7
      8
      		var chevy = {
      make: "Chevy",
      model: "Bel Air",
      year: 1957,
      color: "red",
      passengers: 2,
      convertible: false,
      mileage: 1021 };

      创建对象

属性的工作原理

  1. 访问属性(access a property)

    • 句点表示法(dot notation)

      fiat.mileage

    • 串接(chaining)

      var index = ship.locations.indexOf(guess);

    • 方括号表示法(bracket notation)

      • chevy["color"]
      • chevy["co" + "lor"]
        • 可将任何表达式放在方括号内,只要其结果为表示属性名的字符串即可
    • 访问不存在的属性

      if (fiat.make) { ... }

      fiat.make的结果将为undefined

  2. 修改属性

    fiat.mileage = 10000;

  3. 添加新属性

    fiat.needsWashing = true;

  4. 将属性用于计算

    1
    2
    3
    4
    5
    if (fiat.year < 1965) { 
    classic = true;
    } for (var i = 0; i < fiat.passengers; i++) {
    addPersonToCar();
    }

  5. 增删属性

    • 增加属性,只指定一个新属性并给它赋值
    • 删除属性,可使用关键词delete:delete fido.dogYears;
      • 删除属性时,同时删除属性值和属性本身
      • 成功删除属性,delete表达式返回true
      • 当属性无法删除时,delete表达式返回false
      • 如某个对象属于浏览器而受到保护
      • 即便你要删除的属性在对象中不存在,delete表达式仍返回true

变量存储对象的原理

  1. 变量并不实际存储对象

  2. 变量存储指向对象的引用(reference),故此对象变量也被称为引用变量(reference variables)

  3. 引用就像指针(pointer),是对象的存储地址

  4. 当我们使用句点表示法时,JavaScript解释器将负责根据引用获取对象并访问其属性

  5. 基本类型变量(primitive variable)表示的是实际值,而对象变量(object variable)表示一种获取对象的途径

  6. 当使用句点表示法用于引用变量时,相当于使用句点前的引用来获取相应的对象,再访问句点后指定的属性。

    变量存储对象的引用

向函数传递对象

  1. 调用函数并向它传递一个对象时,传递的是对象引用,而不是对象本身。根据按值传递的语义,传递给形参的是改引用的副本,而原来的引用依然是指向原始对象的指针。

  2. 如果在函数中修改对象属性,修改的将是原始对象的属性。因此,函数结束时,在函数中对对象所做的修改都依然有效。

给对象添加行为

  1. 给对象添加行为,就是将函数定义赋给属性。在函数定义中没有指定函数名,而只是在关键词后面提供了函数体,属性名就是函数名。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var fiat = { 
    make: "Fiat",
    model: "500",
    year: 1957,
    color: "Medium Blue",
    passengers: 2,
    convertible: false,
    mileage: 88000,
    drive: function() {
    alert.log("Zoom zoom!");
    }
    };

  2. 对象内的函数,通常被称为方法(method)。

  3. 用句点法(串联,chaining)调用对象内的方法。

    • fiat.drive();
    • var index = ship.locations.indexOf(guess);

关键词this的工作原理

  1. 可将this视为一个变量,指向其方法被调用的对象。

如何知道对象包含哪些属性

  1. for in迭代对象的属性
    • for in以每次一个的方式遍历对象的属性,并依次将每个属性赋给变量prop
    • 用方括号表示法通过prop来访问当前属性
    1
    2
    3
    for (var prop in chevy) {
    console.log(prop + ": " + chevy[prop]);
    }

JavaScript提供的内置对象

JavaScript提供的对象

字符串对象

  1. 属性length:指出字符串包含多少个字符
  2. 方法charAt:获取字符串中指定索引处的字符。
    • JavaScript没有字符类型(character type),通过返回一个字符串来返回字符,其中只包含特点的字符
    1
    2
    3
    4
    5
    6
    var input = "jenny@wickedlysmart.com"; 
    for(var i = 0; i < input.length; i++) {
    if (input.charAt(i) === "@") {
    console.log("There's an @ sign at index " + i);
    }
    }
  3. 方法indexOf
    • 将一个字符串作为第一个参数,并在字符串中该参数首次出现的位置返回该参数中第一个字符的索引

    • 第二个参数是一个索引,指定从什么位置开始查找

    • 如果没有找到指定的字符串,将返回索引-1

      1
      2
      index = phrase.indexOf("the", 5);
      console.log("there's a the sitting at index " + index);

  4. 方法substring
    • 将两个索引作为参数,提取并返回这两个索引之间的子串

      var val = data.substring(5, 10);

      返回从索引5到索引10(不包括)的子串

    • 可以省略第二个参数,在这种情况下,substring将提取从指定索引到字符串末尾的子串。

  5. 方法split
    • 将一个用作分隔符(delimiter)的字符作为参数,并根据这个分隔符将字符串分成多个部分。

      1
      2
      3
      4
      5
      var data = "name|phone|address";
      var vals = data.split("|");
      console.log("Split array is ", vals);

      //Split array is ["name", "phone", "address"]

  6. 方法toLowerCase
    • 将字符串中的所有大写字符都转换为小写,并返回结果。
  7. 方法slice
    • 删除字符串的一部分,并返回结果。
  8. 方法lastIndexOf
    • 查找最后一个子串
  9. 方法match
    • 查找与正则表达式匹配的子串
  10. 方法trim
    • 删除字符串开头和末尾的空白字符
  11. 方法replace
    • 查找子串并将其替换为另一个字符串
  12. 方法concat
    • 将字符串拼接起来
  13. 方法toUpperCase
    • 将字符串中的所有小写字符都转换为大写,并返回结果。

六、浏览器与文档对象模型(document object model,DOM)

网页与JavaScript通过文档对象模型(DOM)交互

DOM模型
  1. document是一个全局对象,表示浏览器显示的整个网页,包含完整的DOM。
  2. getElementByIddocument的一个方法,查找id为指定值的元素对象。
    • 若根据id从DOM获取元素时,如果指定的id不存在,getElementById将返回null。
  3. getElementsByClassNamedocument的一个方法,查找类名为指定值的元素对象集合。
  4. getElementsByTagNamedocument的一个方法,查找与指定标签名匹配的元素对象集合。
  • 返回的是一个NodeList对象。但可以像处理数组一样处理它(length属性、索引访问)。NodeList是一个Node集合,而Node指的其实就是DOM树中的element对象。
  1. innerHTML是元素对象的一个属性,表示包含在元素中的内容(除了元素的HTML标签外)。

    • 可以通过innerHTML来读取或替代元素的内容
    • innerHTML表示元素对象包含的所有内容,包括嵌套的元素/从对象的起始位置到终止位置的全部内容,不包括HTML标签。
      • 例如,段落元素除文本外,还可能包含<em><img>元素
  2. outerHTML是元素对象的一个属性,表示包含在元素对象中的全部内容

    1
    2
    3
    <div id="test"> 
    <span style="color:red">test1</span> test2
    </div>

    • innerHTML的值是<span style="color:red">test1</span>test2
    • outerHTML的值是<div id="test"><span style="color:red">test1</span>test2</div>
  3. 处理DOM时,要确保代码在网页完全加载后,再执行,否则代码执行时,DOM很可能尚未创建。

网页加载完毕后执行代码的方法

  1. 将代码放置于<body>元素末尾
  2. 将函数赋给对象window的属性onload
    • window是一个JavaScript内置对象,表示浏览器窗口

    • 网页加载事件的触发时间点是:浏览器加载完网页,显示网页的所有内容并生成表示网页的DOM

      1
      2
      3
      4
      5
      6
      <script>
      function init() {
      var planet = document.getElementById("greenplanet");
      planet.innerHTML = "Red Alert: hit by phaser fire!";
      }

      window.onload = init; #千万不要在函数名init后面添加括号,这里不是调用函数,而是将函数作为一个值赋给属性window.onload </script>

设置DOM中元素对象的特性

  1. setAttribute方法添加新特性或修改既有特性

    planet.setAttribute("class", "redtext");

    setAttribute方法添加新特性或修改既有特性
  2. getAttribute方法获取HTML元素的特性的值

    • 如果指定的特性不存在,将返回null。

      1
      2
      3
      4
      5
      6
      7
      8
      var scoop = document.getElementById("raspberry"); 
      var altText = scoop.getAttribute("alt");
      if (altText == null) {
      console.log("Oh, I guess there isn't an alt attribute.");
      } else {
      console.log("I can't see the image in the console,");
      console.log(" but I'm told it looks like " + altText);
      }

    • 设置图像的属性(property)src与使用getAttributesetAttribute设置特性(attribute)src相同么?

      • 对于<img>元素而言,效果是一样的。但是并非所有的HTML特性(attributes)都有对应的对象属性(object properties),因此对于这些特性,必须使用getAttributesetAttribute来设置和获取。

七、类型(types)

类型的种类

  1. 基本类型(primitives)
    • 数值(作为基本类型)
    • 布尔值(作为基本类型)
    • 字符串(作为基本类型)
    • null
    • undefined
  2. 对象(objects对象有属性和方法)
    • 字符串(作为对象/JavaScript解释器会在需要时替你创建字符串对象,无需显式地这么做)
      • 数值(作为对象)
      • 布尔值(作为对象)

undefined

  1. 对于任何还没有值(即还未初始化)的东西,都将被赋予值undefinedundefined的类型是undefined

    • 没有return语句的函数返回的值
    • 未赋值的变量的值
    • 稀疏数组中不存在的数组元素的值
    • 不存在的属性的值
    • 已删除的属性的值
  2. 可以通过undefined来判断是否给变量(属性或数组元素)赋值了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var x;

    if (x == undefined) {
    // x isn’t defined! just deal with it!

    }

    var customer = {
    name: "Jenny"
    };

    if (customer.phoneNumber == undefined) {

    // get the customer's phone number
    }

    #注意不要将值undefined与字符串"undefined"混淆
    ### null

  3. 表示”无对象/对象不存在“,在应该提供一个对象,但无法创建或找到时,将提供null,在变量未初始化,对象没有指定属性或数组没有指定元素时,将返回undefined。

  4. null以前的类型是object,不过在最新的规范中null的类型是null

NaN

  1. 表示JavaScript无法表示的数值结果,即(Not a Number)

    1
    2
    3
    var a = 0/0;
    var b = "food" * 1000;
    var c = Math.sqrt(-9);

  2. JavaScript中唯一一个与自己不相等的值:NaN != NaN * 因为NaN与任何东西都不相等,因此不能以任何方式检查变量与NaN是否相等。需要使用特殊函数isNaN。 * NaN指的是无法表示的数字,但并非所有无法表示的数字都相等。 * 如果变量存储的是NaN或其他任何不是数字的值,将其传递给isNaN时,都将返回true,否则将返回false

    1
    2
    3
    if (isNaN(myNum)) { 
    myNum = 0;
    }

  3. NaN值的类型是"number"

    • NaN值可以认为是一个数字,只是无法表示(至少对计算机来说如此而已)

Infinity

  1. 任何超过浮点数上限(1.7976931348623157E+10308)或下限(-1.7976931348623157E+10308,-Infinity)的值。
  2. Infinity值的类型是"number"
  3. Infinity与它自己相减时,结果为NaN

检测类型

  1. typeof是一个内置的JavaScript运算符(operator),可用于探测其操作数(operand)的类型

    操作数:要对其进行操作的东西

    1
    2
    3
    var subject = "Just a string";
    var probe = typeof subject;
    console.log(probe);

  2. typeof使用字符串来表示类型

    • "string"
    • "boolean"
    • "number"
    • "object"
    • "undefined"
    • "function"

类型转换

  1. 拼接和加法运算符+
    • 用于数字时,运算符+表示加法运算,用于字符串时,运算符+表示拼接(concatenation)

    • 将数字和字符串相加时,数字转换为字符串,再进行拼接,顺序为从左至右

      1
      2
      var order = 1 + 2 + " pizzas";
      3 pizza

    • 布尔值与字符串相加时,结果为字符串。 true + “ love”“true love”

  2. 其他算数运算符
    • 如乘法、除法和减法运算,JavaScript将认为你要执行的是算术运算,而不是字符串运算。
    • 运算符-对数字取负,将其用于true,结果将为-1
  3. 将字符串转换为数字的函数Number
    • 如果指定的实参无法转换为数字,Number将返回NaN。

八、运算符

算术运算符

  1. 后递增运算符(post-increment operator):++
    • myImportantCounter++;这条语句执行完以后,myImportantCounter的值比原来大1。
  2. 后递减运算符(post-decrement operator):-- ###
    ###
    ###
    ###

九、比较

比较运算符

  1. <
    • 可以比较布尔值、字符串和数字,true转换为1
    • 字符串比较规则
      • 取决于计算机中用于表示各个字符的Unicode值的排列顺序
  2. >
    • 可以比较布尔值、字符串和数字,true转换为1
  3. ==表示等于
  • 如果两个值的类型相等,就直接进行比较
  • 如果两个值的类型不同,则尝试将它们转换为相同的类型,再进行比较
    • 比较数字和字符串

      • 把字符串转换为数字,再对两个数字进行比较

      • 字符串不能转换为数字时,结果为NaN,和数字的比较结果为false

        99 == "vanilla"99 == NaNfalse

    • 比较布尔值和其他类型

      • 把布尔值转换为数字,再对两个数字进行比较

      • true将被转换为1,而false将被转换为0

        1 == true1 == 1true

    • 比较nullundefined

      undefined == nulltrue

    • 其他情况

      • 空字符串转换为数字的结果是0

        1 == ""1 == 0false

    • 判断两个对象是否相等

      • 如果两个操作数都是对象,=====都可以使用,工作原理完全相同

      • 检查两个对象变量是否相等时,比较的是指向对象的引用

        • 这些对象包含什么不重要,只要两个引用指向的对象不同,他们就不同
      • 当且仅当两个引用指向的是同一个对象时,它们才相等

        判断两个对象是否相等
  1. ===表示正好等于/严格相等

    • 当且仅当两个值的类型和值都相等时,它们才是严格相等。
    • 有些开发人员称其为等同运算符“identity” operator
  2. <=

    • 只能比较字符串和数字
  3. >=

    • 只能比较字符串和数字
  4. !=表示不等于

  5. !==表示严格不等于

逻辑运算符

  1. ||表示OR(或)
  2. &&表示AND(与)
  3. !表示NOT(非),仅当表达式为false时,结果才为true

真值(truthy)和假值(falsey/falsy)

  1. 定义:有些值并非truefalse,但用于条件表达式中时,被视为truefalse。这些值被称为真值(truthy)和假值(falsey/falsy)。因为严格地说它们并非truefalse,但用于条件表达式时,它们的行为像truefalse

  2. 假值(falsey/falsy)

    • undefined
    • null
    • 0
    • 空字符串
    • NaN
  3. 真值(truthy)

    除了5个假值以外,其他都是真值

十、事件处理程序(event handler)/回调函数(callback)及异步编码(asynchronous coding)

基本概念

  1. 有些事件(events)是浏览器生成的,如加载。有些事件是用户与网页交互时生成的。有些事件是JavaScript代码生成的。还有定时器事件。
  2. 事件处理程序(event handler)/回调函数(callback)/监听器(listener)。从代码的角度说,就是一个函数。
  3. 异步编码(asynchronous coding),是一种以响应事件的方式组织代码的代码编写方式。 > 相对应的线性编码,就是从上到下的顺序逐步编写代码。

事件对象(event object)的工作原理

事件对象(event object)的工作原理
  1. 每次调用单击事件处理程序时,都将向它传递一个事件对象(event object),更准确地说是触发事件的元素,这被称为目标(target)。例如,当用户单击特定的图像时,目标就是这幅图像的元素对象。加载事件处理程序传递的一个事件对象的targetwindow对象。

    • target就是事件对象的一个属性(property)
  2. 在事件处理程序中,你可以使用这个事件对象来获取有关事件的信息

    • 常规信息
      • 属性target,它储存了一个引用,指向触发事件的元素对象(可以是各种不同的对象,但通常是元素对象)

        1
        2
        3
        function showAnswer(eventObj) {
        var image = eventObj.target;
        }

      • 属性type,是一个字符串,如clickload,指出了发生的是哪种事件

      • 属性timeStamp,事件是何时发生的

    • 具体信息(取决于事件的类型)
      • 用户单击鼠标时,获得单击位置的坐标
      • 属性keyCode,用户刚按下了哪个键
      • 属性clientXclientY,确定用户点击的位置离浏览器窗口的左边缘和上边缘的距离
      • 属性touches,在触摸设备上,确定用户使用了多少根手指来触摸屏幕
  3. 浏览器把事件都放入队列,再遍历这个队列(queue),并在必要时调用相应的处理程序。浏览器只有一个队列和一个控制线程(thread of control),只能去逐个处理事件。

    事件和队列

具体示例

  1. 将按钮(类型为button)的属性onclick设置为一个事件处理程序

    • 可以给网页中任何元素的onclick属性设置为一个函数。

    • 不会在网页中显示出来的元素(如<script><head>)不支持单击等事件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      function init() {
      var fireButton = document.getElementById("fireButton");
      fireButton.onclick = handleFireButton;
      }

      function handleFireButton() {
      // 从表单中获取值的代码
      }

      window.onload = init;

      • 通过迭代批量增加单击事件处理程序

      1
      2
      3
      4
      5
      6
      function init() {
      var images = document.getElementsByTagName("img");
      for (var i = 0; i < images.length; i++) {
      images[i].onclick = showAnswer;
      }
      };

  2. 处理回车键事件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function init() {
    var fireButton = document.getElementById("fireButton");
    fireButton.onclick = handleFireButton;
    var guessInput = document.getElementById("guessInput");
    guessInput.onkeypress = handleKeyPress;
    # 按键
    }

    function handleKeyPress(e) {
    var fireButton = document.getElementById("fireButton");
    if (e.keyCode === 13) {
    fireButton.click();
    return false;
    }
    }
    # 如果用户按下的是回车键,事件对象的属性keyCode将为13

  3. mousemove事件

    • 当鼠标在特定元素上移动时, mousemove事件通知相应的处理程序。要指定处理程序,可使用元素的属性onmousemove。这样会给这种事件处理程序传递一个event对象。
    • clientX, clientY:鼠标相对于浏览器窗口左边缘和上边缘的距离,单位为像素
    • screenX, screenY:鼠标相对于设备屏幕左边缘和上边缘的距离,单位为像素
    • pageX, pageY: 鼠标相对于网页左边缘和上边缘的距离,单位为像素
  4. 鼠标移动事件

    • 属性onmouseover:鼠标移入元素
    • 属性onmouseout:鼠标移出元素
  5. 其他

    • resize:每当用户调整浏览器窗口大小时,都将触发这个事件
    • play:单击网页中<video>元素的播放按钮时,将触发这个事件
    • pause:单击网页中<video>元素的暂停按钮时,将触发这个事件
    • unload:用户关闭浏览器窗口或切换到其他网页时,将触发这个事件
    • dragstart :用户拖曳网页中的元素时,将触发这个事件
    • drop :用户放下拖曳的元素时,将触发这个事件
    • touchstart:在触摸设备上,用户触摸并按住元素时,将触发这个事件
    • touchend :用户停止触摸时,将触发这个事件
  6. 基于时间的事件

    • 调用函数setTimeout并向它传递处理程序,它接受两个参数,事件处理程序和时间间隔(单位为毫秒)。
      • 向函数setTimeout传递一个指向处理程序函数的引用。函数setTimeout将这个引用存储起来,供定时器到期后使用。

      • 严格地说,应该写作window.setTimeoutwindow是全局对象,可省略对象名。

        setTimeout(timerHandler, 5000);

      • 还可以传入第三个参数:触发时间事件时,这个参数将被传递给处理程序(可向处理程序传递任意数量的参数)。

        1
        2
        3
        4
        5
        6
        7
        setTimeout(reblur, 2000, image);

        function reblur(image) {
        var name = image.id;
        name = name + "blur.jpg";
        image.src = name;
        }

        将处理程序指定为reblur,将时间间隔设置为2秒,并将第三个参数指定为要重新变模糊的图像

    • 调用函数setInterval
      • 在定时器到期时触发事件,并重启定时器

      • 若要停止函数setInterval,可将其传递给另一个函数clearInterval

        1
        2
        var t = setInterval(ticker, 1000);
        clearInterval(t);

十一、

十二、

十三、

盐在中国历史上本来就是一个长期被垄断经营的对象,汉代与唐代都曾把垄断盐利作为增加财政收入的重要手段。但是,授予盐商绝对的垄断经营权,这是明清时期才有的事。

一、明代

###(一)开中法 #### 有明盐法,莫善于开中 明政府为解决“九边”80多万驻军的粮饷供给,实施了军屯、民运粮、开中法三套制度。亦即军士屯种自给,百姓向边镇输纳,商人纳粮中盐办法,习惯上称为屯粮、民粮、盐粮。然而,北部长城一线地处高寒,屯田产量有限。因此,政府每年征调北直隶、晋、陕、豫、鲁数省农民将交纳后的粮食运送到指定边镇。但在交通不便,车拉驴驮的时代,要把数十万石粮食转运到边塞绝非易事,既妨碍农作,又成本很高。

九边:又称九镇,是中国明朝弘治年间在北部边境沿长城防线陆续设立的九个军事重镇,分别是辽东镇、蓟州镇、宣府镇、大同镇、太原镇(也称山西镇或三关镇)、延绥镇(也称榆林镇)、宁夏镇、固原镇(也称陕西镇)、甘肃镇。

九边九镇

洪武三年(1370)六月,山西行省将此普遍性问题奏报明廷,建议政府通过国家所控制的食盐专卖权,让商人到大同仓交米1石,太原仓交米1石3斗,给淮盐一小引(200斤),然后凭盐引换盐运销获利,销售食盐完毕,仍须将盐引交回政府。这样既省运费,又能使边储充足。朱元璋觉得此法利国、便民、惠商,下令全国推行。 > 《明太祖实录》卷53,洪武三年六月辛巳:转输之费省而军储之用充……令商人于大同仓入米一石、太原仓入米一石三斗者,给淮盐一引,引二百斤。商人鬻毕即以原给引目赴所在官司缴之

洪武四年(1371)制定“中盐例”,开中法大致分为报中﹑守支﹑市易三步:

  1. 报中是盐商按政府的招商榜文要求,把粮食运到指定的边地粮仓,向政府换取盐引﹔
  2. 守支是盐商换取盐引后,凭盐引到指定的盐场守候支盐﹔
  3. 市易是盐商把得到的盐运到指定的地区销售。

商人纳米中盐的条例由户部出榜,依军情、粮价、路途、利润酌定。于是各边镇多召商中盐,盐的运销与军需供给有机结合。商人为节省成本,干脆雇农民在边地垦种,就近给军卫仓纳粮,史称商屯

通俗说,就是:政府根据边镇需要军粮数目在民间招标,中标的商人往边境军镇运粮,粮食运到以后政府给商人颁发盐引,然后商人凭盐引领取食盐,再到指定地区贩卖以获利。

开中法的实质是国退民进,放权让利。明政府突破汉武帝以来盐铁垄断,将官营的盐业专卖权转让给普通商人,用来解决庞大军需供给。永乐以后,开中的方式随着社会经济发展由纳米中盐、纳钞中盐发展为纳银、纳铁、纳麦豆、纳茶马、纳丝绢、纳棉布中盐等12种,从而使盐在产品交换中充当重要媒介。开中法不仅使晋商迅速崛起,而且带动了明中后期黄河流域、长江三角洲、珠江三角洲工商业的发展。开中制的优点在于调动了百姓运送军粮的积极性,不足之处就是让利给盐商,减少了政府的收入,但是在明初,总体来说还是利远大于弊。故《明史·食货志》曰:“有明盐法,莫善于开中。”

边商报中的意义,在于取得食盐的销售特许权。而边商的利益,实际上 并不在于食盐的销售,而主要在于盐引的买卖。边商引价是明初国家与民间商人所确定的盐粮交换的比价,这直接影响开中商人的利益。

洪武四年的开中法盐米兑换价

开中法除有解决军需功能外,也是明政府与商人合作兴办公共事业,解决饥荒、漕运、灾民等社会问题的有效方式。永乐年间,为迁都和营建北京,朱棣两次诏令各地暂停开中,集中纳粮运京,以使北平粮储足够数十万工匠人等数年食用。成化五年(1469)春,荆、襄、南阳数地遭灾,户部招商开中淮浙等盐18万引安置流民。同年十月,又开中两淮、两浙、河东盐80万引于陕西赈济灾民。时隔五年,为补充国库粮储,再定开中接济漕运仓储的办法,开中两淮、两浙、长芦、山东盐100万引,纳粮82.6万石。

显然,开中商人从提供军需物资到获得食盐,要经历很长的时间,经营周期漫长,在这期间商人作为授信者,向政府提供了商业信用,商人因此承担了由交易过程漫长而产生的市场风险,而风险的大小则主要取决于政府的守信程度,风险回报是获得食盐销售权利及售盐后的利润。 > 授信就是给予目标客户额度,如信用卡额度。 > > 商业信用:企业在正常的经营活动和商品交易中由于延期付款或预收帐款所形成的企业常见的信贷关系。

开中法特点

开中法值得注意之处有三。

  1. 第一,开中法作为财政制度,在原则上并不强制,而以自愿的交易来得到收入。

    政府要确保有人参加开中,在制定开中法盐米兑换价时,必须把参加者的所有成本计算在内,包括粮食的生产、收购、运输费用,往返粮仓、运司的旅费,等等,还必须确保参加开中者有利可图,否则难以达到“转输之费省而军之用充”的目的。

  2. 第二,开中法下的盐粮交易,不是即时的交易,而是商人为政府运粮在前,政府以食盐支付商人在后。

    明代中国版图虽不如清朝之大,但商人运送粮食多在北方,而支取食盐多在东部沿海,在前工业革命的技术条件下,运粮与支盐的间隔必然相当长,可以说,开中法的盐粮交易,是政府的借贷行为,政府借取粮食在前,而以食盐偿还在后。

  3. 第三,开中法原本的设计,没有货币成分,但也不是以物易物,而是凭一纸盐引完成交易。

    每一纸盐引代表200斤盐的价值,是政府欠债的凭据,商人凭此盐引,能够支取食盐,作为为政府运送粮食的报酬。基于这三个原因,可以把开中法理解为公债制度,把盐引理解为公债券。明初,战乱甫定,元末纸钞恶性通货膨胀的阴影未消,而大明宝钞的纸币制度又非常失败。但明朝政府却能在食盐的运输方面推出开中法这样一个承认利润原则、依靠市场力量的公债制度,相当值得关注。   #### 守支问題的出现

明代统治者为了眼前利益,超额发放盐引,从而产生了始终困扰开中法 顺利实施的“守支”问题。所谓守支问题,就是盐商在边镇交纳粮草取得 盐引后,并不能马上支取到食盐,被迫困守盐场,等候支盐。守支问题的产生在于官商交易方式的改变,在于明政府行为方式的改变。明代开中法与以往历代王朝的盐政并无大的不同,盐的生产仍然由灶户专门从事,再由政府垄断征收,最后被盐商报中支取,转运各地销售。不同点在于,在以往盐制下,盐商直接向征收盐课的盐政机构购买官盐然后转运贩卖而获利,而在开中法下,盐商不再向盐政机构直接购盐,而是先赴边镇纳粮,再回盐政机构支盐转贩。这样,其经营环节便由二增加为三,即一是赴边纳粮,二是返回盐政机构支盐,三是载盐转贩。这一改变使盐商纳粮与支盐两个经营环节间出现了一段间断期。在这段间断期,明廷只需出具一纸纳粮收据,便提前占用了盐商的资金。这样一来,就会出现这样一种可能:当边镇军需紧张时,可以有意延长这段间断期,将尚未产出的官盐预先开中,仅凭一纸收据提前收取盐商投资。这就为守支问题的产生提供了可能。

开中法实施后,开中盐粮遂成为明代盐政的一个重要部分,而盐政在明 代与边备关系密切,所得款项主要用于边防武备开支,这样,盐政实际就成为明廷满足边镇军需的一种手段。盐政与边政相比,边政直接关系国家安危,自然被置于更高地位。开中盐粮的多少是一个变量,主要受边饷需求的制约,而边饷需求又要视边情缓急而定。边情紧急,边饷需求则剧增,开中盐粮也就作为应急措施被频繁使用。反之,开中盐粮则无必要,或所需甚少。因此,开中盐粮实际将盐政与边政直接连在了一起。由于明廷拥有一条延绵万里的西北防御线,边饷需求巨大,开中量往往超出官盐的供应量,使盐商纳粮而无现盐可支,盐商无法及时获得官盐,被迫守支。

开中法得以实施的前提条件就是统治者必须抑制自己的“掠夺之手”,严格遵守承诺,发给商人的盐引总数必须与盐场当年的产量总额相符,不能超发、滥发,以便保障商人在交纳粮草后会得到食盐,“不拘资次,盐引遇到即支”。可是,统治者往往根据边镇局势变化的需要来决定发行的盐引数量,使得发行的盐引远远超过盐场的支付能力,从而造成“守支”问题。

特别是明代中后期,随着开中法的普及,开中内容随着明代社 会经济的发展和边储的需要逐渐由纳米中盐繁衍为纳铁中盐、纳茶中盐、纳绢中盐等多种方式,食盐几乎充当了一般等价物的角色。统治者发现,通过发行盐引并延期支盐,无需付出什么成本就可以将大量的民间资本征集起来供其使用,这对于统治者来说是一种极具诱惑的、有利可图的选择。

权力寻租导致守支问题恶化

开中法实施之初,明太祖于洪武二十七年(1394年)下令: > “公、侯、伯及文武四品以上官,不得令家人、奴仆行商中盐,侵夺民利。

明初的统治者明令禁止朝廷官员参与开中,以免产生官商勾结、侵夺民利等弊端。永乐年间,明成祖为筹集更多的资金以满足边防需要,改变了明太祖的禁令,开始批准了一些权贵关于参与开中的请求。随着开中内容的增加和开中地理范围的扩展,各级官员皆被允许参与开中。随着越来越多的官员参与开中,逐步出现排挤商人、垄断市场的行为。成化年间,权贵们可以通过皇帝敕许而获得纳粮中盐的权利,实际输纳粮草就不再是获得中盐权利的必要条件,于是纳粮中盐权利就与实际的输纳粮草相分离,成为一种可以买卖交易的权利。在当时的历史文献中,这种权利就被称为“窝”,其买卖交易就被称为“买窝卖窝”。准许官员参与开中的先例一开,使得那些拥有特权的官僚得以利用权势垄断食盐贸易,利用特权霸占盐引,这种现象史称“占窝”。

权贵利用特权通过种种手段占据大量盐引。他们派家人前往开中,以至于参与开中的都是权贵及其关系人。权贵们一方面让亲属假扮军人或百姓出面承纳马草开中盐粮,另一方面还经常向皇帝奏讨盐引,每次少则千引,多则数万引。成化以后,“宗藩、贵戚之求土田夺盐利者,亦数千万计”。成化十五年(1479年),宪帝赐给万贵妃的兄弟万通准盐五千引;十六年,赐给淳皇后母段氏两淮官盐二万引,成化十九年(1483年〉,宦官梁芳“侵盗库金以数十万计,不足则给以盐……前后请两淮存积余盐不下数十万引”,致使“商引壅不行,边储日匮”。

明代政府对权贵们开中食盐网开一面,而对商人中盐则有诸多限制。比如商人中盐数额“不许过三千引”,而对权贵,“或五万、十万,至二十万引”并无限制,于是,开中盐引大多被朝中权贵所把持。权贵们以便宜的价格得到盐引,然后再以较髙的价格出售从而赚取巨额利润。

即使在支盐环节上权贵们也享受着一般商人无法获得的特权。普通商人 无论是交纳粮草还是下场支盐,都必须在官府指定的地点进行。一般商人只能选择参与还是不参与,而权贵则可以通过特权取得盐引,然后去最好的盐场支取食盐,而且在盐产量有限的情况下,权贵们总也能够找到办法抢先支到盐。在“朝廷令人易纳马草开中盐粮”之时,“各场纳草之人,多系官豪势要,及该管内外官”。

明中后期,普通中小商人祖孙三代空持引票支不到盐卖,而靠贿赂权势的不法奸商却能纳粮掺假,甚至虚出“通关”。按明制,商人纳米到边镇,由仓官验收,在法票上注明纳粮品种、数量及应支盐引,并加盖骑缝印章,称作“通关”。但到正统时,奸商通过贿赂管仓官吏,不纳米却能盖印支盐获利。这使仓库未收到粮,盐场却支付了盐,政府蒙受双倍的损失。

由于《大明律》规定,四品以上官员不得允许其家人和亲属参与中盐和与民争利,于是这些权贵们就设法绕开法律规定,“令子侄家人伴当假托军民出名承纳”。待到支盐之时,“嘱管盐官搀越关支”,“不拘年次,本场无盐,辄易他所,三倍加支”权贵们利用权势抢先支盐。权贵们有钱有势,盐政官员对他们逢迎巴结或姑息迁就,往往将灶户所生产的课盐“潜卖与人,或答应势要",从而造成“官盐不足,私盐盛行”的局面。

更为常见的是,权贵们并不直接纳粮边地,而是将中盐资格转卖他人。这种资格被称为“窝”。势豪通过种种手段,“包占”或控制了这种“窝”,使其有了价值,将其转卖与无势不得中盐的商人,每一千引卖银一百余,或七八十两,名曰“卖窝钱”。这样一来,实际上就剥夺了商人直接纳粮中盐的权利,正如弘治末年国子监祭酒章懋上疏所言,“商人不藉手于彼,即无由中纳于此,故费多而中盐者日少”。因此,商人要纳粮中盐,就先要从势豪之手获得行盐资格“窝”,既增加了纳粮的困难,又增加了中盐的成本。其结果是中盐者日少,官盐价日贵,官盐价贵,私盐盛行。私盐盛行,更使官盐难销,形成恶性循环。纳粮和行盐均困难重重,兼顾则更不可能,这就更促使纳粮边商和支盐内商的分化。正是在这种占窝卖窝日益成为纳粮行盐的常态,报中守支均日趋困难的情形下,边商、内商之分日益定型。

纳粮中盐的开中法正常运作,纳粮边地,商人角逐于边地,山陕商人较之徽商有优势。开中法败坏,纳粮凭窝,先要资格,商人角逐于上层甚至权力中央,徽州甲第连云,无论中央还是地方,身居要职者多,“善行媚权势”的徽商较之山陕商人有优势;下场支盐,角逐于淮扬地方,徽商有地理之便,也较山陕商人有优势。

此外,由于贩卖食盐利润巨大,走私越来越猖獗。正统末,三杨去世,法弛贿兴,走私日甚。成化时公然发展到武装走私,“结党朋,操利器,与官司捕役抗争夺利”。当时敢造“遮洋大船,列械贩盐”者已非中小商人,而是富商巨贾、名门世族、军卫土豪组成的走私集团,造成国家税收大量流失。 > 三杨,指杨士奇、杨荣、杨溥。三人均历仕永乐、洪熙、宣德、正统四朝,先后位至台阁重臣,正统时加大学士衔辅政,人称“三杨”。

边商和内商的形成

隆庆二年以总理江北等处屯盐都御史身份前往两淮改革盐政的庞尚鹏的奏折称: > 国初原无边商内商名色,自边商难于守支,故卖引于內商;內商难于报中,故买引于边商。一专报中、一专守支。其初盐法疏通,引可速卖、盐可速掣,彼此交易,两利俱全。今盐法不行,在內商有支盐上堆,数年而不得掣者,则其不乐于买引,原非得已也,势也;由是抑勒减价之弊生。而边商始蹙额矣。在边商有申引到司,数年而不得卖者,则其告掣河盐,亦非得已也,势也;由是展转增价之议兴,而內商始侧目矣。转相攻激。视为寇仇……已经札行兵备道,督同运、府等官,召集边內二商,从公酌议,将边商引价,着为三等。分拨见引:淮南定价玖钱,淮北定价捌钱;分拔起纸关引:淮南捌钱,淮北柒钱;分拨到司勘合:淮南柒钱,淮北陆钱。

庞尚鹏的奏折,清楚地交代了16世纪中叶两淮盐引市场的运作,以及政府对盐引市场的承认和控制。盐商分为专门输送粮食的“边商”、专门凭盐引兑换食盐的“内商”,边商把支取食盐所需的各种票据(勘合、盐引)等卖予内商,内商则凭着这些票据支取食盐。庞尚鹏对于这一系列显然违反“祖制”的现象,并不反对,反而予以承认,还规定边商、内商之间三种票据的交易价格。

边商、内商之间三种票据的交易价格

###(二)折色开中法与运司纳银制 按照明代开中法的要求,商人必须把粮草等物资输送到边防卫所,以换 取“仓钞”,再按仓钞发派盐引,然后凭盐引到指定的盐场支盐,并在政府指定的范围内销售。无盐引而经销食盐,属于贩私盐,要受法律严惩。如果商人们输边交纳的是粮草等农产品,则称为“本色”,如果交纳的是银钱,则称为“折色”。明初边防物资以粮食为主,开中的形式主要为“本色”。到了明代成弘年间,随着白银的使用,盐法发生了重大变革,由纳“本色”改为纳“折色”,即由纳粮改为纳银。

最初的开中折色政策是政府为了吸引商人参与开中而出台的优惠政策。 据记载:天顺八年十一月,即宪宗即位尚未改元之时,明廷以报中商人稀少,下令降低当年八月在大同、宣府所开中引盐的价格,并规定“愿折银者听”,折银标准为淮盐每引折银五钱,其余盐种依中盐米数以次递减此时,运粮到边区开中的商人,也希望把纳粮开中改为纳银开中。在此之前内地盐商或纳粮输边或经营商囤以换取盐引,他们在洪武时期盐法通行之时不困守支、资金周转迅速,经营顺利。

自永乐以后盐法日坏,商人们苦于守支,不少内地盐商纷纷破产,视开中为畏途。在这种情况下,正当盐商无法获利,只有那些投靠权贵者例外。事实上,盐商若不投靠权贵而免于守支,一般是不敢冒险去开中的。对商人们来说,纳银开中,缩短了守支的时间,缩短了经营周期,其益处自然不言自明。纳银开中不但有利于商人,而且有利于政府。

当时白银已成为通用的货币,因而白银在财政上的运用较纳粮草为方便。很显然,在折色开中制下,商人向边关输送粮草改为折纳银两,实际上就失去了原来开中之本意。

“粟贵征粟,粟贱征银”,明政府不再着眼于巩固边防,而是把食盐专卖为财政搜刮的手段,致力于充实国库,增加帑银。但是,最初的折色制只是应急之策,对于朝廷来说,开中纳粮始终是“不可更改”的“祖宗成例”。开中折色政策的真正设立是“没官盐”的出售。“没官盐”,指被官府没收的私盐或者是批验所在秤掣官盐时所没收的超出规定数量的多余的食盐,也称为“掣割余盐。”《明宪宗实录》载,成化二年闰三月,巡视淮扬右副都御史林聪奏言:“凤阳诸处灾伤,措置赈济别无余策,査得两淮运司仪真批验盐引所见有没官盐二万余引,已行召商卖银支用。”

这是成化年间首例在盐场出售“没官盐”。虽然开卖的并非正额引盐,但这意味着开中盐制的禁条正在一步步地被解除,是对“祖宗成例”的又一冲击。“没官盐”的就地出售,在成化九年固定下来,规定每积至二万引即召商出售。不仅如此,也恰好在成化九年底,正额引盐也开始出现在盐场出售的情况。

成化九年十一月,巡抚山西右副都御史雷复上疏,要求“鬻河东运司盐四十万引,以济山西饥民。”得到允准。次年五月,经河东巡盐御史王臣建议,户部确定,今后河东盐凡幵中无商报中者,均就场开卖,所卖银两 由户部转拨边方。此后,就场幵卖引盐的事例不断出现,长芦盐、山东盐、四川盐、广东盐、福建盐、两浙盐,以至当时开中情况较好的两淮盐,都有了就场开卖的事例。至此,盐商不必纳粮边镇,也可获得经营引盐的权利。

折色制发展到到了成化末年,不但实行了纳银开中法,运司纳银制也已 经形成。随着内商经济实力的增长,他们日益感到运送白银赴边开中有很多不便,于是要求一种更简便的方法,以换取盐引,借此摆脱边商的控制。因此,运司纳银制出现了。在原来情况下,以陕西、山西商人为主的边商因其地利之便,经营商囤,开中纳粮获得盐引后加价转卖给内商,内商因有“远涉之虞”,不便直接开中得引,只好接受边商的盐引。

明朝的“南倭北虏”危机到弘治和嘉靖时全面暴露。军卫缺员,盐法阻滞。为了扭转危局,孝宗大力整顿盐茶、马政,决定从全国最大的两淮盐场入手清理盐法。

不久,户部左侍郎李嗣奏:两淮运司连年称过引盐一百余万,而商人所缴截角引目十无二三,如不严禁,则奸商投机不已,盐法更坏。这就说明户部宏观管理失控,换句话说,两淮盐场的引盐实际只有20%用于开中商人纳米中盐,其余大半已为官商影射侵夺。所以,户部建议各盐政机关,每年除将称过引盐数额造册上报外,必须将商人所缴截角骑缝引票同时造册缴部,防止盐政衙门欺上瞒下,搞两本账。 > 截角,将角截掉

弘治四年(1491),明廷罢户部尚书李敏,升侍郎叶淇。叶淇上任后,变开中之法,“请召商纳银运司,类解太仓,分给各边”。此后,商人不再纳粮而是给盐运司交银,统一提解国库,每年通过财政转移支付方式,将饷银调拨到边镇发给将士籴买粮食。辩证地看,叶淇变法的利弊并生,一方面商人免去了先到边镇纳粮、再到盐场支盐的奔波,国家财政收入也骤增;另一方面,边地盐商举家内迁,商屯迅速破坏,粮价飞涨,边军粮食储备也因此大减。不难看出,边镇供给体制由纳米为主向纳银转变是变法的内核,但前提是国内市场兴盛,在边镇市场拿钱能买到粮食。至于粮价波动,势必受供求影响,也说明专制政体下盐政腐败难除,政府管理失控,只得借用市场手段。此外,叶淇变法违背了开中制的初衷:纳粮开中解决的是军粮问题,纳银开中解决的是国库收入问题。更重要的是,大明王朝为了这百万白银的眼前收入,把军粮问题抛诸脑后。

注:籴dí,买米,引申为买入之意

准许纳银解部以后,纳栗报中的重要性大大降低,这样一来,边商与内商两极分化。原来“输粟于边,利归边民”,开中折色后形势逆转,内商取得了对边商的压倒性优势。于是“西北商或徙家于淮以便盐,而边地为墟。”

商屯解体使边商中的富商纷纷改业内商,残留的边商资力日疲,不得不仰承内商之鼻息;而水商或为内商所雇,或为托荫于内商的江湖行贩,其所以取得专卖权皆仰承于人,更无实力同内商抗衡;而内商坐场掣盐,资本增殖很快,后来索性将售盐委托给代理人经营,或转售引他人,于是内商中又分化出水商。 > 从内商手里批发到盐再转运各地的,叫水商。

以徽商和南迁的秦晋富豪为骨干的内商构成了明代盐商的主体。由此可见,三商的分化实质上是促使内商演变为盐商的主角,边、水二商不过是它的经济附庸。但内商决不会坐困守支、正常经营,而是将投托权贵“奏讨”包占的盐引“价增数倍”卖出,以“买窝卖窝”形式坐享其成,这种脱离盐业经营转手倒卖盐引的商人实为一种寄生阶层。其通过投托权贵,牟取厚利,经弘治到万历百余年的发展,终于成为内商中的巨富,囤户。

###(三)纲法 #### 边镇纳粟的差别 由于商屯在不同的边镇发展情况有差别,加大了各边镇开中纳粟的差距。开垦种植条件较好的地区,如陕西三边、山西诸边,商屯发达,中纳情况较好,而北京周围边镇,开垦种植条件较差,商屯难兴,开中纳粟就比较困难。极边地区如甘肃,极冲地区如大同、宣府、独石,开中纳粟仍不景气。国家只好用行政命令或其他手段进行调节。宣德中,因赴北京中盐的人少,规定召商纳中之盐“以十分为率,六分支与纳米京仓者,四分支与辽东、永平、山海、大同、宣府、万全已纳米者,他处中纳悉停之”。对于甘肃、宁夏、大同、宣府、独石、永平等道路险远、商人不乐赴中的地方,甚至允许“寓居官员及军余有粮之家纳米豆中盐”。   #### 解决守支问题的策略 1. 出钞给商,冲消盐引。如成化十六年(1480): > “令永乐、宣德、正统年间客商所中引盐、全未支者、各造册送部。於原籍有司关给资本钞。每引三十锭。景泰元年以後、未支引盐、愿关资本钞者、听。愿守支兑换者、两淮、兑福建山东。两浙、兑广东。俱每引加半引不愿者、听照旧守支”。

`注:听,顺从,接受别人的意见。`
  1. 对积欠时间不太长的盐引,给以加额的优惠,动员商人转场支盐,或兼场支盐。

    正统三年定,“客商中纳官盐支给不敷者,令两淮运司、云南提举司于河东、陕西、福建、广东各运司、提举司兑支。河间、长芦及河东、陕西运司于广东、海北盐课司兑支”。八年奏准,“永乐、洪熙、宣德年间客商原中淮、浙、长芦运司引盐愿兑支河东、山东、福建运司者 ,每支一引支与二引 ,不愿者听其守支”。

  2. 收买灶户余盐以充正引,供开中。

    余盐就是指明代在官专卖制度下,政府为了管制盐的生产,建立了灶户制度,以特定的人户世代世袭制盐。官支给工本与生产手段,免除杂役,使灶户得尽力制造定额的盐课,以维持各场的产量。灶户生产的盐有一部分以盐课形式交给政府,称为正盐,一部分以从事正盐生产以外剩余劳动所生产的盐。此外,还将灶户应向国家交纳粮、草等科差也折以余盐交纳。灶户除了办盐外,也经营一些土地,这些土地的科差,通常是以粮草交纳的。这时为了增加边盐额,就把这些粮草也折为盐上纳,不分起运存留,每正粮米麦豆五斗,草五包束,各纳正盐一小引。 > 盐课以引为单位,每引400斤,称大引,后改为小引,每引100斤或200斤。 >
    > 科差是指征收的代徭税。 > > 起运是指各司、府、州、县等按中央的指派定期定额将赋税运至中央及九边的仓库。 > > 存留:一部分赋税留于地方,用作党规支出。该项钱粮分别储存于司、府、州、县和卫所仓库。

  3. 定常股、存积之制,解决因盐引积滞影响紧急开中之弊。

    《明实录》记载: > (正统五年四月癸巳)行在户部奏:盐商因守支年久,虽减轻开中,少有上纳者,恐误边储。请令云南、福建、四川、广东、河东盐,仍其旧。其两淮、两浙、长芦,每岁盐以十分为率,八分给守支客商,二分令巡按监察御史、按察司官,见数存积,遇边方急用粮日,召商中纳支给,庶官民两便,不致误事。从之。

    综合以上《明实录》正统五年这两段记载,可知明朝政府一方面有意识地消化已经发行的两淮盐引,另一方面设立“存积”这种新名目的盐引。“存积”盐引是指政府为应付紧急财政开支而临时发行的债券,其价值由两淮每年食盐供应量的20%来保障,用债券制度的术语来说,这20%的食盐,就是“存积”盐引的抵押品;商人要认中“存积”盐,要付出更多的粮食,但好处是凭“存积”盐引,能够优先支取食盐。其余在非紧急情况下发行的两淮盐引,则被称为“常股”盐引,其价值由两淮每年食盐供应量的80%来保障。商人认中“常股”盐,付出的粮食较少,但坏处是凭“常股”盐引支取食盐的速度比未有“常股”、“存积”名目的时代更慢,因为“常股”盐引的持有者将不断被“存积”盐引的持有者抢先插队。于是“存积”盐引成为两淮盐引债券市场的新宠,《明史·食货志》提供了证据,“凡中常股者价轻,中存积者价重,然人甚苦守支,争趋存积,而常股壅矣”。

推行纲法来消化积压的盐引

在1617年纲法成立前夕,两淮盐政陷入困局。万历年间,两淮每年必须兑换90万张盐引,其中淮南盐引占68万张,淮北盐引占22万张,因此为户部太仓库带来60万两的余盐银。但是,由于政府发行盐引、征收盐税后,不能及时用盐来兑换已经发行的盐引(时称旧引),以至于积压了约250—260万张两淮盐引。假如政府把两淮所有的盐来兑换这批旧引,以两淮每年兑换约90万张的速度计算,约三年就可以全部兑换,但政府从两淮征收的盐税,也将停收三年,仅对户部的财政损失就达180万两:而北部边防军因连续三年无商人运送粮草所造成的损失尚未计算在内。

万历四十五年(1617),负责整顿盐政的袁世振开始推行“纲法”来消化积压的盐引。袁世振的纲法,是将在1617年之前持淮南盐引的内商,组成十纲;持淮北盐引的内商,组成十四纲。每年,淮南十纲中,以一纲兑换历年旧引,其余九纲兑换当年新引;淮北十四纲中,也同样以一纲兑换历年旧引,其余十三纲兑换当年新引。这样,政府就可以不大幅增加盐产,而又能够继续征收盐税,并且逐渐兑换旧引。当时,淮南十纲,每年共兑换48万张新引和20万张旧引;淮北十四纲,每年共兑换15万张新引和7万张旧引,合共仍然维持两淮每年兑换90万张盐引的定额。为使盐商接受这个方案,袁世振答应:凡愿意参与纲法的盐商,名字登记在纲册上,给予永久专卖权(永永百年,据为窝本),成为纲商。在纲册无名者要参与盐业,也必须寄在纲册有名者的名下。

其后,官不收盐,令盐户将应纳课额,按引缴银,谓之“仓盐折价”。官府卖引,由商人自行赴场收运,政府将食盐收买运销之权悉归商人。

二、清代

清初为了笼络人心,免除各种盐税附加,推行纲法,也叫引岸制,是一种官督商销的形式,由政府给引票于商人,按引购盐,贩卖到特定区域(引地)。同时还实行官运官销,即政府运盐到栈,自行买卖,寓税于价;官运商销,即盐场生产出来的盐,由政府统一收购,储运于官设的盐栈,由商人购买运销,盐课含于价内或于购运时交纳;一些偏僻的产盐地区,还允许民间自制自用,政府征收盐税。

 清初沿袭了明代的盐法。盐商运销食盐,须先向盐运司交纳盐课,领取盐引,然后到指定的产盐区向灶户买盐,再贩往指定的行盐区(叫做“引岸”)销售。然而盐引并不能随便领取,商人必须以引窝为据,证明自己拥有运销食盐特权。为了得到引窝,商人又必须事先“认窝”,也就是交纳巨额银两取得官府授予的垄断经营权。

 在盐法的实际运行过程中,盐商的角色发生了分裂,出现了窝商、运商、场商、总商等名目,他们在食盐的流通过程中各有不同的职能。窝商,也叫业商。清初本来没有窝商、运商之分,凡是有引窝的盐商都是自己运销食盐。之后,因为一些有引窝的盐商缺乏资本无力贩运,就将引窝租给无窝的商人经营,于是便有了窝商、运商之分。

 窝商自己不经营盐业,而是纯粹靠出租引窝坐收巨利,是盐业垄断性的最突出的表现。运商,也叫租商。运商想要贩卖食盐,必须先向窝商缴付“窝价”,租取引窝,然后到盐运司衙门纳课领引,他们在食盐的流通过程中起着产地与销售地之间的桥梁作用。场商,是在指定的盐场向灶户收购食盐再转卖给运商的商人。他们攫取了收购盐场全部产盐的特权,所以往往采取不等价交换的手段,残酷剥削生产者。

 明清时期的盐法采取这种“纲商引岸”制,背后有种种复杂的原因,但是最直接的原因在于明清时期的国家没有太多的力量直接控制社会经济,所以倾向于采取“包”的形式,抓住实力雄厚之人,责成他们承包到底。这一点,在总商的设置上表现得特别明显。总商,又名商总,是运商中家道殷实、资本雄厚的人,盐运司衙门指定他们为总商,把散商分隶于他们名下。每年征课办引的时候,总商要监督完成,还要负责查禁私盐,朝廷如有盐政方面的举措,也往往要与总商协商。

 除垄断经营权之外,朝廷还给盐商以很多其他优惠条件。如允许他们“加价”(提高官定售盐价格)、“加耗”(增加每引的斤数)以及“借帑”(即从国库里借钱营运)。有了这样的保证,盐商可以说是坐收暴利。

 在盐的收购、运输与销售各个环节,相关官员无不伸出贪婪的手

 盐商虽然手握垄断经营权,可以牟取暴利,但是朝廷和官府并不是白给他们这些好处,而是指着他们增加财政收入,因此,他们的负担也很沉重。按照道光年间的两江总督兼两淮盐政陶澍的说法:清朝初年,两淮盐区(行销的地方包括今天的河南、江苏、江西、安徽、湖北、湖南六省)的正纲盐课银原有90余万两,加上其他杂款,也只有180余万两。但是到了乾隆年间,这个数字已经达到400余万两银,是原额的好几倍。而到了嘉庆二十年(1815)之后,两淮盐区每年需要交纳的款项竟然达到800余万两之多。

 盐商的负担还不止于行盐纳课,他们还要承受官员的额外盘剥。朝廷为了加强对盐课的征收,设置了各种机构和官员,这些官员除了领取俸禄之外,还有一笔丰厚的养廉银,目的就是为了避免他们的贪污腐败行为。但是,他们仍然把盐商视为圈里的猪羊任意宰割,明勒暗扣,无止无休。

 在盐的收购、运输与销售各个环节,相关官员无不伸出贪婪的手,雁过拔毛。道光朝的包世臣说:“淮商办运,纳请引、呈纲、力听钱粮,在运司一衙门,设收支、广盈、架阁、承发四房,出入各五、六次,遍历经、库、知、巡四首领,皆商厮名走司者主之,故商命每悬走司之手。然后转历分司、场员、坝员、监掣、批验、子盐各衙门,然后盐得上船赴岸。凡经一署,投一房,则有一次费。合计所费,殆浮正杂,而迂曲备至。”可见盐政衙门内部机构复杂,官员们层层盘剥,商人自有其苦衷。

 当时有人指出,在所有需要与官府打交道的事情里,没有比盐商办盐更艰难繁重的了。合计下来,商人暗里支出的费用几乎相当于成本的一半。雍正时期,皇帝厉行改革,把很多陋规都进行透明化处理,确定下来,免得官员浮收。两淮盐区规定盐商要以“公务”的名义送给盐政每年8万两白银,以“薪水”的名义送给盐运司每年4万两白银。

 此外,每逢盐运使有离任或外调的,盐商也都要照例馈赠一笔重金。盐官的收入如此丰厚,难怪大家都抢着要做。如巡盐御史一职,初时只有六品,却是人人艳羡的肥差,而且一般还轮不到别人,只能由相当于皇帝家奴的“内务府”官员担任。康熙朝时,内务府官员李煦长期担任两淮盐政,离任时他还恋恋不舍,一再上奏皇帝,请求再留一任。

 需要指出的是,皇帝虽然屡次下旨严禁官员贪污腐败,但是实际上他们自己加给盐商的摊派是最大的。乾隆皇帝前后6次南巡,他口头上虽然说“一切出自内府,无烦有司供亿”,但是主要花费的都是长芦、两淮盐商的钱。盐商们争先恐后,各出奇招,以博皇帝的欢心,用度无算。

 乾隆年间爆发的两淮盐引案,亏空达1000多万两,其中就包括“备办南巡出差银”。不仅如此,康乾以来,朝廷每次遇到重大军需、庆典、赈务、工程,需要花钱的时候,盐商们都得踊跃捐输,多则数百万,少则数十万。乾嘉年间,各地盐商报效捐输军需就达白银3000万两之多,其中两淮盐商为支持朝廷镇压川楚白莲教起义,从嘉庆四年(1799)到八年的短短4年之间连续6次捐输,共计白银550万两。

 盐商引领奢侈生活方式,据说远在北京的西太后梳头时也要模仿扬州的妓女

 盐商基本上垄断了全国的食盐销售,因此他们可以任意压低买价,抬高卖价,获取巨额利润。但是,由于传统经济与政治等方面的原因,他们倾向于用赚来的钱购买土地或者捐纳官职,而不是扩大再生产。此外他们会把大量的钱投入奢侈的生活消费中,其中尤以居住在扬州的两淮盐商为甚。

 扬州是两淮盐运司衙门所在地,盐商多聚集于此。据《清稗类钞》记载,黄均太是当时两淮八大商总之首。他吃一碗蛋炒饭需要耗银50两。之所以这么贵,是因为这碗蛋炒饭要保证每粒米都是完整,且必须粒粒分开,每粒米都要泡透蛋汁,炒出来外面金黄的,内心雪白。与这碗饭相配的是百鱼汤,汤里包括鲫鱼舌、鲢鱼脑、鲤鱼白、斑鱼肝、黄鱼膘、鲨鱼翅、鳖鱼裙、鳝鱼血、鳊鱼划水、乌鱼片,等等,极尽精致之能事。更令人咋舌的是,据说他吃的鸡蛋并非一般的鸡下的,而是吃了人参、苍术等药物的鸡下的,所以味道特别好。

 清人李斗的《扬州画舫录》一书是扬州盐商奢靡之风的全面记录,吃喝玩乐就不必说了,据说盐商会想出各种各样的花招来消遣。例如,选美活动搞腻了就选丑,把大姑娘的脸上涂了酱油在太阳底下暴晒,看谁更丑。又如,为了比谁更有钱,大家纷纷在金箔上刻上自己的名字,跑到镇江金山的宝塔上把金箔往外扔,看谁的金箔第一个飘到扬州。

 盐商过着非常悠闲的生活,他们修建楼台馆榭,养戏班开戏院,琢磨精致的菜肴,逛妓院养“瘦马”,调脂弄粉。盐商的生活方式深刻地影响了扬州的社会风气,当时市面上游逛着大量闲人,他们不事生产,无所事事,“早上皮包水,晚上水包皮”,在茶馆和澡堂之间流连。扬州盐商的生活方式还具有领导时尚的作用,据说远在北京的西太后梳头时也要模仿扬州的妓女,否则就嫌不够新潮。

 两淮盐商的豪奢,不仅是为了满足自己的欲望,在某种程度上,它也是服务于拉拢贿赂官员的需要的。盐商尽管不满于各级官员的巧取豪夺,但他们又需要这些官员的庇护,因此他们往往要竭力备办令官员满意的物品。

 两淮盐政高恒出身内务府,是真正的纨绔子弟,盐政事务完全不在心上,只知道聚敛财物。盐商针对其好色贪财的特点,物色美女,搜集珍玩,馈赠于他,结果正中下怀,高恒甚至可以答应将以往的亏空一笔勾销。

 两淮盐运使卢见曾是位名士,风流自赏,对于黄白之物只觉得俗不可耐。盐商投其所好,花重金购买善本图书碑帖献上。卢见曾感觉这个贿赂很不俗,就欣然笑纳,之后还不断收受,乐此不疲。总之,两淮盐商用心揣摩官员的爱好,又用自己的生活方式感染官员,使他们“入吾彀中”,豪奢风气下掩盖的是官员的贪污腐败和官商的勾结共谋。

 破除垄断的新制度逐渐取代了旧制度,盐商的风光不再,没落已成定局

 清中期以后,盐商报效捐的压力渐渐增大,又要品尝“借帑还息”的苦果,加上官吏勒索,自己生活豪奢,很多人都陷入外强中干,入不敷出的境地。为了克服危机,他们只有不断抬高盐价一条路,以致于民间出现了百姓被迫淡食的局面,民怨沸腾。而私盐则趁机大行其道,几乎占据了官盐一半的市场。

 官盐发生严重滞销,商人开始欠缴盐课,直接影响了朝廷的财政收入。为了增加盐课收入,清廷决心对盐法进行改革。道光十二年(1832)两江总督陶澍议准将两淮盐务改归两江总督兼管,以统一事权。之后,他大刀阔斧地将淮北引盐为票盐,也就是在那些交通不便、引商不肯前往的地方,允许资本较小的商人经营,他们不必认窝,只要缴纳盐课就给据官票,让他们凭票贩盐。陶澍的这一举措很快收到了实效,既方便了百姓,也增加了朝廷收入。道光三十年,两江总督陆建瀛又将此法推行于淮南。以后,票盐法渐渐向福建、两浙、长芦等盐区推进。

 纲法改为票法,从根本上取消了盐商对盐业的垄断,深刻地触犯了盐商的既得利益,引起他们的强烈不满。据说,当时的盐商对陶澍恨之入骨,设计了一种新的纸牌规则。他们增加了两张新牌,一张是“桃树”,拿到这张牌的人“虽全胜亦全负”,所以一旦拈到此牌无不痛骂。另一张是“陶小姐”,暗喻陶澍的女儿,“得之者虽全负亦全胜”,所以拿到这张牌的人无不欢喜雀跃,并且“浪语谑词,猥亵无比”。但是,无论如何痛恨,新制度逐渐取代了旧制度,盐商的风光不再,没落已成定局。

 纵观清代盐商的盛衰过程,可以看到,他们的垄断经营权同时也是官府牟利的工具,这正是他们悲剧命运的深刻原因。

 (作者系中国政法大学法律古籍所副教授)

 资料链接

 盐引:又称“盐钞”,是宋代的取盐凭证,“引”是指有价证券,可以作为“代币”流通。明朝时期,如果想要合法贩盐,商人必须先向政府取得“盐引”。每引一号,分前后两卷,盖印后从中间分成两份,后卷给商人的,叫“引纸”——盐引;前卷存根叫“引根”。商人凭盐引到盐场支盐,又到指定销盐区卖盐。

 两淮盐引案:乾隆三十三年(1768),新任“盐政”查账,发现在他之前的20年里,“盐政”的官吏们私自“超发”盐引,从中克扣、提留“引银”竟达1000多万两。乾隆大怒,许多官吏和徽州大盐商都被抓捕至北京问罪,其中包括纪晓岚等知名“要员”(纪因此受到牵连,而被发配新疆)。

心相篇

[宋] 陈希夷

原文及注释

心者貌之根,审心而善恶自见;

心地是相貌的根本,审察一个人的心地,就可以了解他的善恶之性;

行者心之发,观行而祸福可知。

行为是心性的外在表现,观察一个人的行为,就可以知道他的祸福吉凶。

出纳不公平,难得儿孙长育;

买卖出纳不公平的人,儿女常常短命夭折;

语言多反复,应知心腹无依。

说话无信多反复的人,没有几个心腹好友。

消沮闭藏,必是好贪之辈;

耗损别人的钱财和资源的人,必是贪婪之辈;

披肝露胆,决为英杰之人。

为人坦荡,竭诚相待,待人忠诚,这样的人一定是英雄豪杰。

心和气平,可卜孙荣兼子贵;

遇事从容,心平气和的人,其子孙必然享尽荣华富贵;

才偏性执,不遭大祸必奇穷。

才走偏锋,性格固执的人,不遭大祸就一定很贫穷。

转眼无情,贫寒夭促;

翻脸无情的人一生贫寒,夭折短寿;

时谈念旧,富贵期颐。

时时念旧,发迹不忘故友的人,富贵绵远,长寿多福。

重富欺贫,焉可托妻寄子;

嫌贫爱富的人,心地刻薄,怎么能够在外出时把家中妻儿托付给他?

敬老慈幼,必然裕后光前。

能够敬老爱幼,关怀弱者,这样的人将来必定会立身扬名,光耀祖宗,福荫子孙。

轻口出违言,寿元短折;

动辄就讲一些不合情理、违心的话,最易折损自己的寿命;

忘恩思小怨,科第难成。

忘恩负义、记小仇的人,难以考学科第。

小富小贵易盈,刑灾准有;

小成就骄傲自满、目空四海的人成不了大气候;

大富大贵不动,厚福无疆。

大成就而不骄傲的人,福报深厚无边。

欺蔽阴私,纵有荣华儿不享;

恶行隐蔽、行为不光明的人,纵有荣华富贵,儿孙也享用不到。

公平正直,虽无子息死为神。

而公平正直的人虽没有子嗣,死后也可以做神。

开口说轻生,临大节决然规避;

平时“为国献身、为朋友献身”的豪言壮语不离口,这样的人在大事关头、大节时刻,一定会逃掉;

逢人称知己,即深交究竟平常。

滥交朋友的人,即使所谓的“深交”实际上很平常。

处大事不辞劳怨,堪为梁栋之材;

能挑起重担又任劳任怨的人,一定是国家的栋梁;

遇小故辄避嫌疑,岂是腹心之寄。

碰到一点小事就避嫌,不肯承担一点责任的人,怎么能重用呢。

与物难堪,不测亡身还害子;

平时待人待物刻薄,常常令人下不来台,不但引来杀身之祸,还会遗害子孙;

待人有地,无端得福更延年。

待人接物,殷勤热情的人,会获得意外的福禄和长寿。

迷花恋酒,阃kǔn中妻妾参商;

寻花问柳、贪杯恋酒的人,家中的女眷一定不和睦;

参商指的是参星与商星,二者在星空中此出彼没,彼出此没,古人以此比喻彼此对立,不和睦、亲友隔绝,不能相见、有差别;有距离。 古书左传上有记载。

利己损人,膝下儿孙悖逆。

利己损人的人,一定会有不肖子孙。

贱买田园,决生败子;

趁火打劫、贱买人家财产,一定会生出败家子;

尊崇师傅,定产贤郎。

尊师重道的人家一定出孝子贤孙。

愚鲁人,说话尖酸刻薄,既贫穷,必损寿元;

愚蠢鲁莽的人,说话尖酸刻薄,不但会贫穷而且会缩减自己的寿命;

聪明子,语言木讷优容,享安康,且膺封诰。

聪明的人,平时不随便说话,一举一动优雅从容,这样的人一生平安健康而且还会得到朝廷的赐封。

患难中能守者,若读书,可作朝廷柱石之臣;

在艰难困苦中还能坚持自己的操守,不随波逐流的人,如果读书、走仕途之路,一定是国家的柱石之臣;

安乐中若忘者,纵低才,岂非金榜青云之客。

安乐中忘记安乐、依然能发奋图强的人,即使才学低一些,未必就不能够金榜题名,青云直上。

鄙吝勤劳,亦有大富小康之别,宜观其量;

节俭勤劳的人有大富有小康的区别,关键看其人的器量;

奢侈靡丽,宁无奇人浪子之分,必视其才。

奢侈豪华的人有奇人也有浪子,关键看其人的才能。

弗以见小为守成,惹祸破家难免;

不要把爱占小便宜为“守成”,这样的人难免惹祸破家;

莫认惜福为悭吝,轻财仗义尽多。

不要以为爱惜财物是吝啬,这样的人遇到他人有困难,往往是仗义疏财的人。

处事迟而不急,大器晚成;

处事沉稳不着急的,必是大器晚成的人;

见机决而能藏,高才早发。

自己能谋划决断而又能深藏不露的人,必然才高而年轻得志。

有能吝教,己无成子亦无成;

有才能而不肯教给他人,自己不但没有成就,子女也一无所成;

见过隐规,身可托家亦可托。

见到他人有过错,能够在暗中规劝的人,可以托身寄家。

知足与自满不同,一则矜而受灾,一则谦而获福;

知足与自满不一样,知足的人谦虚谨慎必有福报,骄矜自大的人必然招致灾祸

大才与庸才自别,一则诞而多败,一则实而有成。

大才与庸才自然有区别:一种是有实际能力可以做出成绩,另一种是夸夸其谈却无法做成一事。

忮求念胜,图名利,到底逊人;

因为嫉妒别人的成就和才华,非要胜过别人,心里没有远大的抱负,只是追求名誉和利益,这种人的人品到底是逊人一筹;

恻隐心多,遇艰难,中途获救。

常常怀有恻隐之心的人,即使遇到艰难,也会获得别人的帮助。

不分德怨,料难至乎遐年;

对人不分德怨,只知道按自己的情绪来对人的人,估计很难长寿;

较量锱铢,岂足期乎大受?

斤斤计较的人,怎么能承受的了大富大贵呢。

过刚者图谋易就,灾伤岂保全无?

过于刚强的人,做事虽容易成功,但容易伤人伤己,很难善终;

太柔者作事难成,平福亦能安受。

过于柔弱的人,做事不容易成功,福报平平但能安享。

乐处生悲,一生辛苦;

高兴的时候却生出悲伤的情绪,这样的人难免辛苦一辈子;

怒时反笑,至老奸邪。

明明非常生气却反而露出笑容,这样的人一生都是奸诈凶邪之辈。

好矜己善,弗再望乎功名;

喜欢自夸己善的人,就不要再想自己在仕途上有什么成就了;

乐摘人非,最足伤乎性命。

喜欢挑剔别人的过错,最容易伤害自己的性命。

责人重而责己轻,弗与同谋共事;

指责别人重,批评自己轻,这种人既不能共同谋划事情、一起工作。

功归人而过归己,尽堪救患扶灾。

功劳归别人过错归自己,这种人可以任命他去解除危机、扶助灾患。

处家孝弟无亏,簪缨奕世;

在家中孝顺父母长辈,照顾兄弟姐妹,即使有困难也不亏德行,这样的家族世世代代都会有人在朝为官;

与世吉凶同患,血食千年。

在民族国家生死存亡的时刻,与世人同生死共进退的人,会被人永远铭记,祭祀千年不忘(屈原、岳飞、介子推)

曲意周全知有后,

自己吃亏受气、曲意周全他人的,其后人一定会非常贤明;

任情激搏必凶亡。

任性暴烈、一意孤行的,必定凶亡。

易变脸,薄福之人奚较;

易变脸的人薄福,何必与之计较呢?

耐久朋,能容之士可宗。

耐久可交的朋友,大肚能容,是值得信任、依靠的人。

好与人争,滋培浅而前程有限;

争强好胜的人虽能风光一时,却前程有限;

必求自反,蓄积厚而事业能伸。

一定要经常自我反省,品重德厚,事业自然一帆风顺。

少年飞扬浮动,颜子之限难过;

少年人飞扬浮动的,往往都寿不过三十二岁;

壮岁冒昧昏迷,不惑之期怎免?

壮年人还鲁莽行事的,四十岁上难免有大难。

喜怒不择轻重,一事无成;

不分轻重、喜怒无常的人一事无成

笑骂不审是非,知交断绝。

不分是非、喜欢拿别人开玩笑的人,好朋友也会与之断交。

济急拯危,亦有时乎贫乏,福自天来;

救人于危难之中的人,有时也遭遇贫困,自有天赐福;

解纷排难,恐亦涉乎囹圄,名扬海内。

为人分忧解难的人,虽然有时也有牢狱之灾,自有神来保佑他。

饿死岂在纹描,抛衣撒饭;

被饿死的人仅仅因为面相上有“螣蛇纹入口”了吗?是这些人不知惜福,糟踏五谷;

瘟亡不由运数,骂地咒天。

得瘟疫而亡的人是因为运数不好吗?是这些人自己造孽还咒骂天地。

甘受人欺,有子忽然大发;

甘心忍受他人的欺辱,后代一定发达;

常思退步,一身终得安闲。

常退一步为他考虑,终身自在安闲。

举止不失其常,非贵亦须大富,寿可知矣;

一举一动不失常态的人,不是贵也是大富,长寿更不用说了;

喜怒不形于色,成名还立大功,奸亦有之。

喜怒不形于色的人,功名可成,也有大奸之人。

无事失措仓皇,光如闪电;

无事仓皇失措的人,福禄薄如电光雷火;

有难怡然不动,安若泰山。

有难怡然不动的人,福禄重如泰山。

积功累仁,百年必报;

积功累仁的善行必得善果,即使等上一百年,也会得善报;

大出小入,数世其昌。

借贷米粮,用大斗出借,以小斗回收,这样的家道一定会数世昌盛。

人事可凭,天道不爽。

可以凭借人事,验证天道(天理、承负)的准确。

如何飧刀饮剑?君子刚愎自用,小人行险侥幸。

为什么有人走上绝路自杀呢?君子刚愎自用而失败,小人心怀侥幸心理而去做冒险的事,都可以导致自杀。

如何投河自缢?男人才短蹈危,女子气盛见逼。

如何短折亡身?出薄言,做薄事,存薄心,种种皆薄;

为什么有人夭折亡身,作了短命鬼呢?因为是出薄言、做薄事、存薄心,处处都薄。

如何凶灾恶死?多阴毒,积阴私,有阴行,事事皆阴。

为什么有人遭遇横祸,凶灾恶死呢?因为这些人多阴毒、积阴私、有阴行、事事皆阴。

如何暴疾而殁?色欲空虚。

为什么有人暴病而亡?因为恣情纵欲,精气耗尽。

如何毒疮而终?肥甘凝腻。

为什么有人毒疮而死呢?因为这些人饮食上肥甘凝腻。

如何老后无嗣?性情孤洁。

为什么有些人年老尚无子嗣呢?大多因为性情孤洁。

如何盛年丧子?心地欺瞒。

为什么有人于盛年丧子呢?心地欺瞒——阴损事做多了,亏心事做多了。

如何多遭火盗?刻剥民财。

为什么有人总是遭遇水火盗贼之灾呢?因为刻剥民财,损人利己。

如何时犯官府?强梁作胆。

为什么总是有人违法乱纪?倚仗着权势、地位,胆大妄为。

何知端揆首辅?常怀济物之心。

什么人能当宰相?常怀济物之心的人。

何知拜将封侯?独挟盖世之气。

什么人能拜将封侯呢?有独挟盖世的胸襟、气魄的人。

何知玉堂金马?动容清丽。

什么人能以文章博得功名呢?格局清丽,神清气秀的人。

何知建牙拥节?气概凌霄。

什么有人能够委以重任,镇守一方?志存高远,气概凌霄的人。

何知丞簿下吏?量平胆薄。

为什么有人只能当小职员呢?因为量平胆薄。

何知明经教职?志近行拘。

为什么有的人靠通明经典却以教书糊口呢?因为胸无大志,行为拘谨。

何知苗而不秀?非惟愚蠢更荒唐。

为什么有些人看着是好苗子却成不了才呢?因为作人愚蠢,行事荒唐;

何知秀而不实?盖谓自贤兼短行。

为什么有些人只得到虚名虚利,人生没有实际的结果呢?因为自以为很有才,且德行有亏或行动跟不上。

若论妇人,先须静默;从来淑女,不贵才能。

说到妇德女相,首先要沉稳安静,从来淑女都不是贵在才能上。

有威严,当膺一品之封;少修饰,准掌万金之重。

有威严的女人天命大,可封一品诰命;少修饰的女人宿命大,能管理大的家业。

多言好胜,纵然有嗣必伤身;尽孝兼慈,不特助夫还旺子。

多言好胜的女人,即使有后代也必受伤克;尽孝兼慈的女人,不但助夫还能旺子。

贫苦中毫无怨詈,两国褒封;富贵时常惜衣粮,满堂荣庆。

贫苦中无怨言,会受到婆娘两地的褒奖;富贵还能勤俭持家,一定满堂荣庆。

奴婢成群,定是宽宏待下;资财盈箧,决然勤俭持家。

府中奴婢成群,主人一定是宽宏待下;家中资财丰厚,主人一定是勤俭持家。

悍妇多因性妒,老后无归;奚婆定是情乖,少年浪走。

凶蛮泼辣的悍妇,多因嫉妒成性,晚年一定孤独无靠;卖淫为娼的奚婆,定是性情乖戾轻浮,年轻时行为浪荡。

为甚欺夫?显然淫行。缘何无子?暗里伤人。

为什么欺辱丈夫?显然是淫行;为什么没有子嗣?暗地里伤人。

合观前论,历试无差;勉教后来,犹期善变。

信乎骨格步位,相辅而行;允矣血气精神,由之而显。

骨格与其位相辅相成,血色与气色互为表里,这是确信无疑的。

知其善而守之,锦上添花;知其恶而弗为,祸转为福!、

知其善而守住善道,有福之人可以锦上添花;知其恶而不去做,有祸之人可以转祸为福

陈希夷简介

陈抟

陈抟(公元872年—989年),字“图南”,号“扶摇子”、“白云先生”、“希夷先生”(“夷”指视而不见,“希”指听而不闻),知名道教人士,常被视为神仙,尊称为陈抟老祖、希夷祖师等。

五代末,宋朝初期人,其生平事迹和出生时地众说纷纭,真伪难辨,一说普州崇龛县人(今重庆市潼南县崇龛镇)。一说华州华阴人(今陕西华阴一带),祖籍谯郡(今安徽亳州一带)。一说亳州真源县(今河南省鹿邑县)人。

主张以睡眠,休养生息,时常一眠数日,人称睡仙。相传紫微斗数及无极图说皆为陈抟之创作。

陳希夷睡图

据史书记载,陈抟曾将《太极图》(原名《无极图》)、《先天图》、《河图》以及《洛书》传给其学生种放,种放以之分别传穆修、李溉等人,后来穆修将《太极图》传给周敦颐。周敦颐著《太极图说》加以解释。现在我们看到的太极图,就是周敦颐所传的。

太极图

参考书籍
1. 张宏杰《曾国藩的正面与侧面》民主与建设出版社.2014年
2. 张宏杰《曾国藩的正面与侧面》国际文化出版公司.2011年
3. 林乾《曾国藩大传》人民文学出版社.2011年

三、困顿与坎坷

曾国藩回顾平生几次大堑,认为挫折是他最大的助力。他说:

吃此四堑,无地自容,故近虽忝窃大名,而不敢自诩为有本领,不敢自以为是。俯畏人言,仰畏天命,皆从磨炼后得来。

总结生平,曾国藩多次说挫折是他长进的动力,因此鼓励他弟弟在挫折之际咬紧牙关,不屈不挠,化被动为主动,以扩展心胸、增长本领:

吾生平长进,全在受挫辱之时。务须咬牙励志,蓄其气而长其智,切不可荼然自馁也。

注:荼然自馁,不要无缘无故的自己看不起自己

当此百端拂逆之时,亦只有逆来顺受之法,仍不外悔字诀,硬字诀而已。

何为“悔字诀”呢?曾国藩说:“近年得力,惟一悔字,悔悟之后,才知自己全无本领,才看得到人家有几分是处”。有这一个悔字,其待人也,小心翼翼,就无一人敢轻慢;其行事也,兢兢业业,就无一丝疏忽。由悔而又生畏,曾国藩曾经说自己有“三畏”:畏天命、畏人言、畏君父。常存敬畏之心,才是惜福之道啊!所以,纵观曾国藩的一生,游刃官场,虽有不少坎坷,却终能化险为夷。

凡事皆有极困极难之时,打得通的,便是好汉。

梁启超说:“曾文正者,……在当时诸贤杰中,最称钝拙,其所遭遇事会,亦终身在拂逆之中,然乃立德、立功、立言三不朽,所成就震古烁今而莫与京者,其一生得力在立志自拔于流俗,而困而知,而勉而行,历百千艰阻而不挫屈,不求近效,铢积寸累,受之以虚,将之以勤,植之以刚,贞之以恒,帅之以诚,勇猛精进,卓绝坚苦,如斯而已,如斯而已。”

注:莫之与京,出自《左传·庄公二十二年》,解释为首屈一指,无与伦比。

(一)三次“为众人所唾骂”和三次军事大失败

同治五年(1866年),五十五岁的曾国藩在家书中对曾国荃回顾了他一生三次“为众人所唾骂”及三次军事大失败:

余为京师权贵所唾骂,继为长沙所唾骂,再为江西所唾骂,以至岳州之败、靖港之败、湖口之败,盖打脱牙齿多矣,无一不和血吞之。

京师权贵所唾骂

曾国藩晚年在家书中回忆:

“昔余往年在京,好与诸有大名大位者为仇,亦未始无挺然特立不畏强御之意”。

大名大位者之一,就是那位因鸦片战争而出名的琦善。琦善出身贵族,身名早达,二十岁就当了河南巡抚。一度位极人臣,在朝廷中根深蒂固。虽因鸦片战争而被道光皇帝“革职锁拿,查抄家产”,但不久就获重新起用,任陕甘总督。咸丰皇帝即位后,有人参奏他在陕甘总督任内“妄加诛戮”,“将雍沙番族刑求逼供,杀毙多名”。皇帝命革职交刑部审讯。

虽然两度获罪,琦善在京中人缘却一直很好。回到北京后,会审人员只寻“微琐细事”令琦善回答,实际是为他开脱罪责。刑部尚书恒春甚至要将举报人萨迎阿的四名下属当做罪犯抓来,与琦善一同审讯。这明显是违反大清律的。然而对这个建议,满朝无人反对。只有当时兼属刑部侍郎的曾国藩挺身而出,拍案而起,说:

琦善虽位至将相,然既奉旨查办,则研鞫乃其职分;司员职位虽卑,无有传入廷尉与犯官对质之理。若因此得罚,将来大员有罪,谁敢过问者?且谕旨但令会审琦善,未闻讯及司员,必欲传讯,当奏请奉旨然后可。

注:鞫jū,审讯

就是说,琦善虽然权高位重,但既然奉旨查办他的罪行,则自然应该以罪犯待之。举报他的那几个司员官位虽低,现在也仍然是朝廷命官,怎么能像罪犯一样抓来当堂对质?如果举报者被这样对待,将来再有大员犯罪,谁敢过问?况且皇帝只命会审琦善,并没有命令兼审其司员。如果一定要传讯司员,那必须先请旨。

曾国藩“词气抗厉”,“四坐为之悚动”,刑部尚书恒春不得不取消了这个动议。慑于曾国藩的刚直,咸丰二年四月,琦善被革职,发往吉林效力赎罪。

另一个“大名大位”者是赛尚阿。咸丰二年初,赛尚阿等因为在镇压太平天国起义军过程中调度不力,日久无功而“交部议处”。朝中众人多力图为之宽减,只有曾国藩认为:

“以军务关系重大,议处罪名宜从重者,不当比照成例”。

但会议还是决定从宽处罚。曾国藩不服,“会议罢后,公专摺奏请从严议处”。赛尚阿因此终被革职。

本来,曾国藩在京官中人缘颇好。然而,这两次挑战“大名大位”者,却令他人际关系网出现巨大破洞。因为琦善门生故旧遍天下,与穆彰阿关系也颇深。曾国藩打破了“官官相护”的潜规则,成为官场上的异类。案子审完之后,许多人与曾国藩拉开距离,甚至不再往来。他在官场上的处境愈益孤立。“诸公贵人见之或引避,至不与同席。”在背后当然更是遭到无数诋毁之词。弹劾赛尚阿又得罪了一大批人。因此曾国藩在咸丰二年几乎成了京师人人唾骂的人物。

在北京在最后一段日子,曾国藩动辄得咎,精神十分痛苦,愈来愈想念家乡了。国事颓唐,他百计奋斗,却丝毫无补,不免又一次萌生了退志:

粤西事用银已及千万两而无确耗,户部日见支绌,内库亦仅余六百万。时事多艰,无策以补救万一,实可惭愧!明年拟告归,以避尸位素餐之咎。

在给罗泽南的信中亦云:

计稍迟岁时,即当解组归养,从吾子与孟容(即罗泽南与刘蓉)于万山恬寂中耳。

咸丰二年六月,曾国藩终于得到了江西乡试正考官的外差,他兴冲冲逃离这个让他失望而厌恶的京城。不料刚走到安徽太和县,接到了母亲去世的讣闻,当即换装回乡奔丧,至此正式结束了他十四年的京宦生涯。

为长沙所唾骂

详见“癸丑六月(咸丰三年,即1853年6月被赶出长沙)不与焉”

为江西所唾骂

详见“丙辰(咸丰六年)被困南昌,官绅人人目笑存之”

(二)平生“四大堑”

第二年(即同治六年,1867年)三月十二日,他又在家信中对曾国荃回顾了平生“四大堑”:

余生平吃数大堑,而癸丑六月(咸丰三年,即1853年6月被赶出长沙)不与焉。第一次壬辰年(道光十二年,1832年)发佾生,学台悬牌,责其文理之浅;第二庚戌年(道光三十年,1850年)上日讲疏内,画一图甚陋,九卿中无人不冷笑而薄之;第三甲寅年(咸丰四年,1854年)岳州靖港败后,栖于高峰寺,为通省官绅所鄙夷;第四乙卯年(咸丰五年,1855年)九江败后,赧颜走入江西,又参抚臬,丙辰(咸丰六年)被困南昌,官绅人人目笑存之。

注:不与焉,不算在内

壬辰年发佾生,学台悬牌,责其文理之浅

壬辰年是道光十二年(1832),这一年二十一岁的曾国藩第六次参加秀才考试。

结果发榜之日,却被学台(即湖南省学政,相当今天的省教育厅厅长)悬牌(发布公告),责其“文理太浅”,以佾(yì)生注册(“佾生”是指未能考取秀才但成绩尚好者,选取充任孔庙中祭礼乐舞的人员。获“佾生”资格则下次考试可免县试、府试,只参加院试即可,故称“半个秀才”)。

在一般人看来,获得“佾生”资格也算是小有收获,值得祝贺。曾国藩却视在大庭广众之下被悬牌批责为奇耻大辱。回到家塾“利见斋”,他闭门不出,咬牙发愤。没想到这一次“悬牌批责”,居然如当头棒喝、醍醐灌顶,豁然贯通,突破了父亲刻板教育下形成的僵化文笔思路,文理大进,转过年来,第七次参加考试,终于中了秀才。又一年,他就中了举人,又四年,中进士,点翰林,从此飞黄腾达。

画图甚陋

道光三十年正月,道光皇帝去世,年方二十、血气方刚的咸丰登基,罢黜穆彰阿,下诏“求言”。一时“天下称快”,朝野上下,为之一振。

曾国藩心情激奋,上了一道《应诏陈言疏》,痛斥当时的“以畏葸为惧,以柔靡为恭”的官场作风,曲尽当时官场的丑恶形状:

“京官办事通病有二,曰退缩,曰琐屑。外官办事通病有二,曰敷衍,曰颟顸。退缩者,同官互推,不肯任怨,动辄请旨,不肯担责任咎。琐屑者,锱铢必较,不顾大体,察及秋毫,不见舆薪。敷衍者,装头盖面,但计目前,剜肉补疮,不问明日。颟顸者,外面完全,中已溃烂,奏章粉饰,而语无归宿。”

曾国藩建议皇帝举行“日讲”,即“加强学习”,以本身的振作之气,扭转官场的泄沓之风,同时改革官员选拔办法,使进取之员有机会脱颖而出。

这道奏折得到了良好的反应。皇帝对他大为赞赏:

“礼部侍郎曾国藩奏陈用人三策,朕详加披览,剀切明辩,切中情事,深堪嘉纳。”

皇帝对他提出的“日讲”建议最感兴趣,命令他详细解释。于是曾国藩精心准备讲稿,并且画了一张解释讲堂布局的图表。不过他本不擅画,这张图画得相当难看。

讲稿在九卿中传阅之后,曾国藩成了北京官场议论的中心。大家议论的不是他的赤心血诚,而是讥笑他“画图太陋”。就这个水平,还充什么圣人门徒!

这固然是曾国藩准备不充分导致的自取其辱,其实也何尝不是北京官场之上看他风头太盛、锋芒太露而引发的自然反应。官场之上,对曾国藩这个憨头憨脑的湖南愣头青早就憋了一肚子气了。木秀于林,风必摧之,锋芒毕露,人必非之。众人皆醉,我也只好喝上几杯。天塌大家死,中国的事,急不得。激动、愤怒、抨击、更张,都是不成熟的表现。因此,要成熟,要心胸宽阔,要辩证地、全面地看问题。天塌大家死,何必独着急?

看到他的奏折中把京官描写得如此不堪,官员们气不打一处来。好嘛,满朝皆醉你独醒,满朝皆浊你独清?就你对大清朝忠心耿耿,我们都是废物?皇帝下了一个求言诏,你就真的独抒己见,把大家一竿子全打倒?

癸丑六月(咸丰三年,即1853年6月被赶出长沙)不与焉

咸丰二年底,咸丰皇帝的一道紧急命令传到了荷叶。原来不久前太平军挥师北上,湖南各地,纷纷糜烂。咸丰皇帝情急之下,诏命在乡下老家为母亲守孝的曾国藩帮助地方官员兴办“团练”,也就是“民兵”,以保卫乡里。

曾国藩一到长沙,就展现出雷厉风行的办事风格。曾国藩在自己的公馆里开设了一个“审案局”,专门审理社会治安案件。曾国藩命令,凡有地方土匪、流氓、抢劫犯被抓获,不必经过州县,直接送到这里。只要捆送来者,一不需要参照法律,二不需要任何实际证据,只以举报者口辞为信,稍加讯问,立即结案。处理方法只有三种:一是立刻砍头,二是活活打死在棍下,三是施以残酷的鞭刑。用曾国藩自己的话说就是:

“匪类解到,重则立决,轻则毙之杖下,又轻则鞭之千百。敝处所为止此三科。”四个月内,审案局“计斩决之犯一百零四名,立毙杖下者二名,监毙狱中者三十一名”。

曾国藩因此获得了“曾剃头”的著名外号。

恐怖政策确实收到了一时之效,各地土匪不再敢轻举妄动,社会秩序迅速安定下来。奇怪的是,曾国藩勇于任事,没有赢得湖南政界的感激,相反却招致了重重怨怼。出山几个月后,谤名满城,长沙城中“文法吏大哗”,都视他为仇敌。甚至当时的一些老朋友如李瀚章、魁联、朱孙诒、郭嵩焘、欧阳兆熊等都给他写信,表示了对他种种做为的不理解和担心,“劝其缓刑”。

成为众矢之的的原因,是曾国藩动了别人的奶酪。曾国藩悍然成立了不伦不类的“审案局”,将自布政使到各府州县长官的社会治安权收归自己名下,“巨案则自行汇奏,小者则惟吾专之”。他对那些贪鄙畏葸的地方官吏本来就极不信任,所以常常越过他们,直接下达命令。他规定,任何人都可以捆送土匪流氓,不必经过过去那些层层手续:

“一切勘转之文、解犯之费都行省去,宽以处分,假以便宜”。

他办案总是径自决定,从速处理,以免有人来说情纠缠:

“期于立办,无所挂碍牵掣于其间。案至即时讯供,即时正法,亦无所期待迁延。”

这就惹恼了通省文官。案子就是钱,不是现钱也是天大的人情,你把抓捕、审判、监禁、处决权统统收归自己所有,别人还有什么活路?

曾国藩不尊重行政程序,视湖南通省官员如无物,更是大伤文官们的面子。你要当好官,出成绩,这可以理解,谁不想往上爬?但能不能别把我们踩得这样狠,反衬得这样无能?你半年里办的事,超过了湖南几十年的工作成绩,这样干法,别人的面子往哪里摆?

咸丰皇帝任命的“帮办团练大臣”,并非曾国藩一人。从咸丰二年十一月至三年二月,他一口气任命了十个省共四十三位退休或者丁忧在家的前官员为团练大臣。

绝大多数团练大臣行事都很明智。他们的做法有三类。洁身自好者深知自己不受地方官员欢迎,他们接到命令之后,在省城找间空办公室,挂个牌子敷衍两天,最后像大多数绅士那样,给团练捐些钱了事。

精于打小算盘者则视皇帝的圣旨为以公济私的好机会。他们在地方上果真办起一支小小的民兵,不过主要目的却是保卫自己的庄园不受土匪抢劫。一旦太平军大股部队到来,则立刻“逃遁”或“托病藏匿”了。

胃口更大者则把这个差事当成中饱私囊的绝佳机会。他们扯着皇帝的幌子,以筹款练兵为借口,大肆敲榨地方富户。

“假公济私,百端纷扰,或逼勒州县供应,或苛派民间银钱,或于官设捐局之外,团练再设捐局,或于官抽厘金之外,团练再抽厘金”。

只有曾国藩一个人,一不要钱,二不要利,只想真正想为国家分忧。这就触犯了官场潜规则。

曾国藩混迹官场多年,当然不是不通世故之辈。他自己说:

“今岁以来,所办之事,强半皆冒侵官越俎之嫌。”

他悍然不顾,一意孤行,自有他的道理:

“只以时事孔艰,苟利于国,或益于民,即不惜攘臂为之,冀以补疮痍之万一,而扶正气于将歇。”

后来,在给翰林院同事龙启瑞的信中,他又这样进行解释:

二三十年来,士大夫习于优容苟安,榆修袂而养姁步,倡为一种不黑不白、不痛不痒之风,见有慷慨感激以鸣不平者,则相与议其后,以为是不更事,轻浅而好自见。国藩昔厕六曹,目击此等风味,盖已痛恨刺骨。今年乏承团务,见一二当轴者,自藩弥善,深闭固拒,若恐人之攘臂而与其建业者。欲固执谦德,则于事无济,而于心亦多不可耐,于是攘臂越俎,诛斩匪徒,处分重案,不复以相关白。

注:姁xū,神态和悦娇媚

就是说,二三十年以来,官场形成一种黑白不辨、不痛不痒的含混作风。偶尔有人批评这种作风,则大家相与议论,说他不懂事,好显摆自己。我昔年做六部官员时,对此早已痛恨入骨。如今办理团练,又遇到几个有实权的人,不许我触及他们的势力范围。在这种情况下,如果我再谦逊退让,则一事无成。而且这么多年来,心里也憋着一股火,于是毅然出手,不再管那么多。

他又说:

“物穷则变,救浮华者莫如质。积玩之后,振之以猛,意在斯乎?”

风波的触发点是练兵。他深知,依靠目前这支大清军队,打败太平军是不可能的。因为晚清国家军队是一支没有灵魂的、没有“天良”、没有精神力量的军队。曾国藩说过:

“国藩历年来痛恨军营习气,武弁自守备以上无不丧尽天良!”

要挽救这个国家,只有一个办法,那就是“赤地立新”,自己动手,练出一支崭新的有战斗力的队伍。所以,在接奉圣旨后的第十天,曾国藩就复奏,要在长沙创建一支新的军队。

曾国藩练兵,首重给军队注入“良心”和“灵魂”。他在中国军事史上首先发明了“政治教育”。创立湘军之后,每逢三日、八日,他要把军队召集到操场上,进行政治动员。他亲自训话,用“杀身成仁,舍生取义”的孔孟之道和“不要钱,不怕死”的岳飞精神激励将士,教育他们忠君爱国,不得扰民。这当然是好事。但问题是曾国藩又一次把手伸向了自己的权力范围之外。和各地国家军队一样,驻长沙的绿营军,军纪废弛、四处扰民,令全长沙头疼。曾国藩命令驻省的正规军队每三、八两日,与湘军一起“会操”。曾国藩自己说,“传唤(绿)营兵,一同操演,亦不过会弁委前来听我教语”,开启他们的天良。他为了唤醒这些兵痞的良心,也确实苦口婆心:

“每逢三、八操演集诸勇而教之,反复开说至千百语,但令其无扰百姓。”

“每次与诸弁兵讲说,至一时数刻之久。虽不敢云说法点顽石之头,亦诚欲以苦口滴杜鹃之血。”

其目的:

“盖欲感动一二,冀其不扰百姓,以雪兵勇不如贼匪之耻,而稍变武弁漫无纪律之态”。

大清政治惯例是文官不管军队的日常事务。即使是巡抚这样的实权大官,也不会具体过问军队的日常操练。文官们虽然痛恨曾国藩,但也只能形于辞色,性情粗野的军人们却没有这么好脾气,他们立刻付诸行动。

带头闹事的,是长沙副将清德。他在太平军进攻湖南时曾临阵脱逃,此时面对曾国藩却很勇敢。他不仅带头抵制会操,“操演之期,该将从不一至”,而且摇唇鼓舌,四处鼓动各军不要受曾国藩的摆弄。

行事至刚的曾国藩立刻给皇帝上了个折子,弹劾清德,并猛烈抨击湖南驻军

“将士畏葸,疲玩已成痼习,劝之不听,威之不惧,竟无可以激励之术”。

尚方宝剑很快显示了威力。咸丰皇帝立刻将清德革职拿办。这是曾国藩出山之后,与湖南官场发生的第一次正式冲突。

表面上看曾国藩在这次冲突中取得大胜,实际上失败的隐患已根植在这场“大胜”之中。晚清官场最重要的潜规则是“官官相护”。常在河边走,谁能不湿鞋?只有彼此掩盖,才能最大限度保证大家的集体安全。动辄咬人,足以令人人自危。湖南官员从此对曾国藩更加恨之入骨。清德的上司、湖南提督,也就是驻湖南最高军事长官鲍起豹更伺机报复,而机会也很快就来了。

绿营军看着曾国藩招来的这些湘勇土包子怎么看怎么不顺眼,经常借故与湘勇发生械斗。八月初四,鲍起豹的卫队又寻衅攻打湘勇,双方各有负伤。

军队没有纪律,何以平贼,何以安民?曾国藩向鲍起豹发去文书,要求他逮捕带头闹事的绿营兵,以杜私斗之风。

鲍起豹决意要借这个机会好好教训教训曾国藩。他故意将几名肇事士兵五花大绑捆起来,大张旗鼓地押送到曾国藩的公馆,同时派人散布曾国藩要严惩这几个绿营兵的消息,鼓动军人闹事。绿营一传二、二传三,越聚越多,群情激愤,纷纷上街,游行示威,要求曾国藩释放绿营兵。长沙城中一时大乱。

张亮基调走之后,湖南通省官员都和曾国藩气味不投。出了这个事,满城官员都关起大门,袖手旁观,心中暗喜。“营兵既日夜游聚城中,文武官闭门不肯谁何。”等着要看曾国藩的笑话。绿营兵见状,胆子更大,居然开始公然围攻曾国藩的公馆。

曾国藩的公馆就临时设在巡抚衙门的射圃里,与巡抚骆秉章的办公室仅一墙之隔。曾国藩以为绿营兵胆子再大,也绝不敢武装攻击他这个二品大员。所以被绿营兵包围后,他还若无其事地处理公文。不料绿营兵竟然破门而入,连伤了他的几个随从。连曾国藩自己都差点挨刀。曾国藩夺门而逃,几步窜到隔壁巡抚办公室门前,连连急叩。

绿营在门外闹事,巡抚骆秉章听得一清二楚,但是却装聋作哑,暗暗发笑。他早应该出来调停,却一直假作不知。直到曾国藩来叩门,他才故作惊讶,出来调停。绿营兵一见巡抚驾到,马上规矩下来。骆秉章的调处办法是命人把鲍起豹捆送来的那几个绿营兵带过来,他亲自上前松绑,还连连向他们道歉,说让兄弟们受委屈了!

绿营兵面子挣足,兴高采烈拥着这几人而去。只剩下骆曾二人了,骆秉章一句安慰的话也没对曾国藩说,只淡淡地说了一句:“将来打仗,还要靠他们啊!”就转身走了。

曾国藩气得哑口无言。

湖南官员们眼见前一段飞扬跋扈的二品大员这次被狠狠地修理,个个眉开眼笑,把这事当成笑话,四处飞传。一时间,满城都是对曾国藩的讥笑之声。

“司道群官皆窃喜,以谓可惩多事矣。”

曾国藩的第一反应当然是向皇上控告。干脆,借这个机会把到省办事以来所受的所有排挤委屈都痛快淋漓地向皇帝陈诉一番!然而细一想,他就知道这种做法行不通。这一道奏折上去,顶多打倒一个鲍起豹,能把湖南全省官员都扳倒吗?如果扳不倒全省官员,那么以后他在湖南的处境,岂不是更要寸步难行?

经过几夜不眠的反思,曾国藩做出了一个出人意料的决定:“好汉打脱牙和血吞。”他不再和长沙官场纠缠争辩,而是卷起铺盖,带着自己募来的湘军,前往僻静的衡阳。全省官员瞧不起我,我不争一日之短长。等到我在衡阳练成一支劲旅,打几个胜仗给你们看看,那时自会分出高下。这才是挽回面子的最好办法!

咸丰三年八月,曾国藩带着受伤的自尊心到达衡阳,开始赤手空拳创立湘军。刚到衡阳,他就遇到很多问题。

一是无办公场所。二是没有名正言顺的职权。三是还没有经验。对于行军布阵,带兵训练,没有一点实际经验。如何招兵,如何筹饷,如何采购武器,如何编营,如何训练,如何制定营规,如何选择军官,如何设定军饷标准,如何排兵,如何布阵。四是没有朋友前来帮忙。长沙之辱使曾国藩脸面丧尽,人心离散。不但通省官员们不齿于他,甚至他的那些好友郭嵩焘、郭崑焘、刘蓉、左宗棠,也都认为他行事鲁莽,难以成功,竟没有一人愿意前来帮他。第五条:无制度保障。最突出的表现就是没有军饷来源。

曾国藩说:

“筹饷更难于督兵”,“大抵军政、吏治,非财用充足,竟无下手之处”。

可以说,如果没有长沙之辱的刺激,曾国藩不可能克服这五难,开创湘军。长沙之辱如同一根针扎在心里,让他时刻难以自安,终于苦苦支撑,惨淡经营,斩关夺隘,排除万难。

没有办公场所,他就借住在一户祠堂里。

没有名位,他只好照旧用长沙时用过的“湖南审案局”五个字,来接送公文。

没有经验,曾国藩就自己在黑暗中探索。他精心果力,认真思考绿营兵种种弊端之原因,创造了许多崭新的军事原则,比如招兵不用城市浮滑之人,只选朴实山农。比如“将必亲选,兵必自募”,比如实行厚饷和长夫制度。

关于军饷,曾国藩想来想去,只想出了一个办法:劝捐。也就是说,劝那些大户捐款,回报是由国家授予他们一些荣誉性的虚职。他在衡阳设立劝捐总局,派人四出劝捐筹饷。

然而,曾国藩本身非官非绅,权力不明,收据由曾国藩自己刊印,信用不高。从咸丰三年八月到咸丰四年底,总局费尽口舌,一共才弄到一万九千多两银子,根本无济于事。劝而不动,他只好强行勒派。巨绅们如果拒不捐款,他就派兵动用拘押手段。结果得钱不多,招怨不少。曾国藩因此叹息:

“劝捐之难,难于登天,费尽心力,迄无一获。”

甚至因为劝捐,他还得罪了皇帝。原来已故湖北巡抚杨健之孙杨江,急公好义,主动捐输军饷两万两银子,解了曾国藩的燃眉之急。曾国藩感动之下,想把他树为表率,带动捐输事业,于是上疏请旨,请朝廷批准将杨健列入祀乡贤祠。

杨健生前为官平平,且受过处分,其官声、治绩均不足以入祀乡贤祠。不过兵务紧急,同意他这个请求也算不上什么大事。不想精于小事忽于大计的皇帝根本体谅不到曾国藩的难处,恪守“名位不能轻易予人”的教条,大发雷霆,将曾国藩痛骂一顿,说他“所奏荒谬之至”,并且说:

“(曾国藩)实属袒护同乡,以私废公,显背圣旨,可恶已极。……着交部议处”。

而京官们部议的结果竟提出给以革职的处分。好在皇帝尚未失去理智,知道曾国藩这样的人缺不得,于是将处分改为降二级调用,使曾国藩由二品京堂降到了三品。重重困难之中,曾国藩不止一次想打退堂鼓。但一想起长沙之辱,他便又鼓起了全部斗志。

吃尽了千辛万苦,曾国藩终于练成了一支一万七千人的队伍。咸丰四年四月湘潭之战中,湘军水陆不足万人,与三万之众的太平军作殊死战,十战十捷,以少胜多,歼灭太平军万余人。这是太平军兴起以来清军取得的唯一一次重大胜利。

接到战报,咸丰皇帝大喜过望。自从镇压太平军以来,他所接到的都是兵败如山倒的失败报告,这样重大的捷报还是头一次。皇帝发出一系列上谕,嘉奖湘军,还特命曾国藩单衔奏事,湖南省文武百官,除巡抚一人之外,曾国藩皆有权调遣。这道上谕从根本上转变了曾国藩在湖南的政治地位。上谕先发至巡抚衙门,骆秉章接旨后,立即带着藩、臬两司等一班官员,拥着一抬绿呢空轿,亲自来接一直住在城外船上的曾国藩入城。骂他最凶的布政使徐有壬当晚单独拜会曾国藩,恳切检讨过去的态度。曾国藩的仇人鲍起豹则被皇帝下旨严责,革职拿办。

曾国藩的打掉牙和血吞,终于取得了胜利。他用自己的艰苦奋斗,成功地挽回了面子。

可以说,没有长沙之辱,就没有曾国藩后半生的功名事业。这一次挫而后奋的成功,给了曾国藩一次印象极深的自我教育,更强化了他愈挫愈奋、百折不挠的性格特点。从这次经验中,曾国藩领悟到,对于有志者来说,挫辱是最大的动力,打击是最好的帮助。咬紧牙关,把挫辱活生生吞下,就成了滋养自己意志和决心的营养。这构成了曾国藩生命经验中最核心的部分。几十年后,他还在家书中教育儿子说:

“天下事无所为而成者极少,有所为有所利而成者居半,有所激有所逼而成者居半”

“百端拂逆之时”,“只有逆来顺受之法”

“所谓好汉打脱牙和血吞,真处逆境之良法也”

丙辰(咸丰六年)被困南昌,官绅人人目笑存之

湘军的意外崛起,使昏惨惨黄泉路近的大清王朝又看到了起死回生的希望。一时间,朝廷褒奖,绅民欢呼,曾国藩成了滔滔天下的中流砥柱。

按理说,此时的曾国藩应该会呼风唤雨、八面逢源了吧?不是。曾国藩的日子仍不好过。因为体制仍然不顺,饷项仍须自筹。咸丰四年四月十四日,湘潭大胜之后仅仅九天,他在长沙给弟弟们所写信中沮丧地说:

饷项已空,无从设法,艰难之状,不知所终。人心之坏,又处处使人寒心。吾惟尽一分心作一日事,至于成败,则不能复计较矣。……余近来因肝气太燥,动与人多所不合,所以办事多不能成。

也就是说,湘军筹饷上的困难一如既往。曾国藩仍然经常和他人发生冲突,以致肝气上升,时常处于焦灼愤懑之中。

问题的焦点在于曾国藩没有实权。大清王朝各省的实权掌握在总督和巡抚们的手中,他们是全省官僚系统的绝对主人。下级官员的身家性命掌握在他们手中,对他们唯命是从。 因为出山之后,皇帝给曾国藩的只是虚衔,既没有提拔下属的权力,又很难左右地方官的命运。军事离不开民事,招兵、选将,购置武器,“处处与地方官相交涉”,而地方官却往往不予配合。

曾国藩需要实权,这一点皇帝心里很明白。然而,目光短浅的咸丰却打起了自己的小算盘:他以前只知曾国藩胆子大,敢于撄皇帝之逆鳞。这次才知道此人本领大,以在籍侍郎,振臂一呼,就集兵数万,所向披靡。如果他打败了太平军后反戈朝廷,那岂不是比太平军还难对付?即使他不反戈,但由汉人立下拯救王朝之全功,以后满洲八旗的威信何在?皇帝的如意算盘是让曾国藩游击野战,歼灭太平军有生力量。最后仍由盘踞在天京脚下的满族将领收功。因此虽然屡获大胜,湘军与清王朝体制上的矛盾仍然没有理顺,曾国藩的处境仍然十分艰难。这种艰难在江西表现得最为充分。鉴于湘军是唯一有战斗力的部队,咸丰皇帝命曾国藩出省作战,支援困境中的江西。

湘军出省作战实行的是“就地筹饷”,江西省官僚系统负有供饷之责。其时江西巡抚是陈启迈。其人气度狭隘,寸权必争。在他眼里,曾国藩不过是一个办团练起家的在籍官员而已,地位等同绅士,要在江西吃自己的军饷,就必须对自己唯命是从。因此他对曾国藩指手画脚,呼来喝去,而所下命令又朝三暮四,令人左右为难。

曾国藩在奏折中有过这样的描述:

罗泽南克复广信以后,臣本欲调之折回饶州、都昌,以便与水师会攻湖口。陈启迈则调之防景德镇,又调之保护省城,臣均已曲从之矣。旋又调之西剿义宁,臣方复函允从,而陈启迈忽有调往湖口之信;臣又复函允从,陈启迈忽有仍调往义宁之信。

对这样一个毫不知兵的巡抚,曾国藩实在无法敷衍,只好拒不从命。这下子惹火了陈启迈,对曾国藩“多方掣肘,动以不肯给饷为词”。曾国藩没办法,只好自己想办法在江西筹饷,这又侵犯了陈启迈的财政权。在他的带领下,江西通省官员与曾国藩针锋相对。曾国藩要对商人抽税,地方官员马上也抽,强分一杯羹。曾国藩要任用一个地方上的绅士,地方官就扣住不放,甚至对敢于接近曾国藩的绅士打击报复。盖有曾国藩关防的捐输执照,不被地方官员承认,说:

曾国藩“未奉明诏,不应称钦差字样”;

又说他“曾经革职,不应专折奏事”;说他“系自请出征,不应支领官饷”等

极尽污辱玩弄之能事,大有挤垮曾国藩之势。曾国藩在江西数年之间步步荆棘,处处碰壁。曾国藩自己说他在江西:

“事事被人欺侮,故人得而玩易之也”

连与曾国藩积怨很深的王錱,也不无同情地说:

“涤帅遭际若是,直令人急煞”,“涤帅所处真是不易”

曾国藩忍无可忍,拍案而起,于咸丰五年六月十二日,以陈启迈“劣迹太多,恐怕贻误大局”,上奏参劾。陈启迈所作所为确实让人无法为之辩解,咸丰皇帝阅之大怒,立刻将陈启迈革职查办。

然而,接下来发生的事情又重复了湖南的经验,这次参劾不但没有使其他江西官员束手,反而令他们变本加厉。接替陈启迈任江西巡抚的文俊行事一如陈氏,江西官员在他的率领下团结起来处处给曾国藩下绊子设障碍。甚至曾国藩的兵勇也被人毒骂痛打,遭受侮辱。曾后来在给朋友的信中回忆这段经历说:

“江西数载,人人以为诟病。”又形容当时的苦况说:“士饥将困,窘若拘囚,群疑众侮,积泪涨江,以夺此一关而不可得,何其苦也。”

当然,使他“积泪涨江”的根本原因,不是江西官员的个人素质,而是咸丰皇帝对自己不信任。在籍之员出山带兵,本是基于对王室的忠心,不想皇帝却对他如此提防,曾国藩的寒心和委屈可想而知。他无时不想挂冠而去,但时势之危与圣人之教又不容许,只好百计隐忍,甘受煎熬,长年寸心如焚。

“国藩昔在湖南江西,几於通国不能相容。六七年间,浩然不欲复闻世事。”

“虹贯荆卿之心,而见者以为淫氛。碧化苌宏之血,而览者以为顽石。古今同慨,我岂伊殊。屈原所以一沈而万世不复者,良有以也。”

委屈痛苦,溢于笔端。甚至这样对好友刘蓉说:

“所至龃龉,百不遂志。今计日且死矣,君他日志墓,如不为我一鸣此屈,泉下不瞑目也。”

种种不平之鸣,证明这是他一生中精神最痛苦的时期之一。一向对曾国藩多所讥评的王闿运,在编写《湘军志》时,也在日记中对曾国藩深表同情:

“夜览涤公奏,其在江西时,实悲苦,令人泣下。……涤公言:‘闻春风之怒号,则寸心欲碎;见贼船之上驶,则绕屋彷徨’,《出师表》无此沉痛!”

这就是曾国藩所说的“为江西所唾骂”,以及“又参抚臬,丙辰被困南昌,官绅人人目笑存之”的难堪经历。

(三)“大悔大悟”之年

正在曾国藩痛苦万分之时,他接到了父亲的讣告。这个噩耗此刻倒成了摆脱困境的天赐良机。他立刻上疏要求回家守孝,并且不等皇帝的回复,把军队抛在江西,径直回到了湖南老家。 皇帝当然不会批准他在家守孝三年,催他立刻回到军中。曾国藩给皇帝上了一封奏折,一股脑地把自己压抑已久的愁苦愤懑都说了出来,期望皇帝会体谅他的苦衷,授与他职权。

曾国藩在奏折中将官场的潜规则说得很清楚。

他说,带兵打仗,必须依靠地方官员的支持。

“至于筹饷之事,如地丁、漕折、劝捐、抽厘,何一不经由州县之手?”

但地方官员只认他们权力体系内的运转规则,只听能掌握他们升迁权力者的话。他名义上为部长级官员,而

“文武僚属,大率视臣为客,视本管上司为主。宾主既已歧视,呼应断难灵通”。

他“身非地方大吏,州县未必奉行,百姓亦终难可信”,所以“或臣抽厘之处,而州县故为阻挠;或臣营已捐之户,而州县另行逼勒。欲听之,则深虑事势之窒碍;欲惩之,则恐与大吏相龃龉”。

他虽有保举权,但由于所保人员非国家正规军出身:

“徒有保举名,永无履任之实”。许多战功卓著的部下,“虽保举至二三品,而充哨长者,仍领哨长额饷。充队目者,仍领队目额饷。一旦告假,即时开除,终不得照绿营廉俸之例,长远支领”。

他直言不讳地说:

“以臣细察今日局势,非位任巡抚有察吏之权者,决不能以治军;纵能治军,决不能兼济筹饷。臣处客寄虚悬之位,又无圆通济变之才,恐终不免于贻误大局。”

如果皇帝不给他督抚之权,他就只能“在籍终制”,不复出山。

曾国藩以为他已经把委屈和困难说得够充分了,皇帝没有任何理由不给他这个卖命的“走狗”以必要的支持。没想到逞妇人之智的咸丰皇帝却和曾国藩较上了劲。适值此时天京内讧之后,太平军内部分裂,势力大衰,看起来已经指日可平,有没有曾国藩好像也没有大碍。于是顺水推舟,批准他在家守制三年,实际上解除了他的兵权。

这当头一棒差点把曾国藩打昏。他万没料到苦战数年竟是这样一个结果。而他的那些夙敌,也就是长沙城中的湖南官员们闻听此讯却一个个喜形于色。从传统伦理上来说,不论曾国藩是何居心,如此要挟皇帝都有违臣道。以前曾国藩以唯我独忠之态,居高临下,睥睨众人。而这次他们可抓住了把柄,举城跳着脚大骂曾国藩假道学,假忠义。蛰居荷叶塘的曾国藩有口难辩,遂“得不寐之疾”、患了“怔悸之症”,卧病在床。他在给郭崑焘的信中亦称:

“以兴举太大,号召过多,公事私事不乏未竟之绪,生者死者犹多愧负之言。用是触绪生感不能自克,亦由心血积亏不能养肝,本末均失其宜,遂成怔悸之象。”

更让曾国藩痛苦的是,建立不世大勋的千载难逢之良机眼睁睁地从自己眼前溜走了。此际正当太平军由盛转衰的转折点,而他偏偏在这个时候回了家。他的许多部下,都因军功飞黄腾达。比如以知府投身于他的胡林翼早当上了湖北巡抚,以千总这样的低级军官身份加入湘军的杨载福也已经升为二品提督,而他却仍然是一个在籍侍郎,职位没有任何升迁。在他离开军队这段日子,湘军攻陷九江,杨载福、李续宾皆赏穿黄马褂,官文、胡林翼皆加太子少保,一时荣耀无比。只有他这个湘军创始人冷冷清清待在家里,受人嘲骂。曾国藩虽被视为理学名臣,但功名心一向极炽,失去这个永垂史册的千载良机,他怎么能不懊悔莫及!

原本自诩硬汉的他这回有点挺不住了,举动大异常态,整日生闷气,“心殊忧郁”,动不动就骂人。他数着江西的一帮文武骂,骂够了就找几个弟弟的碴吆喝,一年之中和曾国荃、曾国华、曾国葆都发生过口角。弟弟们走了后,他又开始骂几个弟媳妇。语言粗俗,蛮不讲理,理学家的风度荡然无存。

被酷热击中的荷叶,夜半仍然如同处于火炉之中。彻夜不眠的曾国藩时而在床上辗转反侧,时而在室内外踱来踱去。几年来的种种经历不断缠绕在他心头,在给曾国荃的信中他说自己在家中

“回思往事,处处感怀”,“心中纠缠,时忆往事,愧悔憧扰,不能摆脱”,“近日天气炎热,余心绪尤劣,愧悔交集,每中夜起立,有怀吾弟而不能见”。

注:憧chōng,1.心意不定;2.笨;不聪明。

曾国藩反思到,在官场之上一再碰壁,碰得鼻青脸肿,不光是皇帝小心眼,大臣多私心。自己的个性、脾气、气质、风格上的诸多缺陷,也是重要原因。回想自己以前为人处世,总是怀着强烈的道德优越感,自以为居心正大,人浊我清,因此高己卑人,锋芒毕露,说话太冲,办事太直,当然容易引起他人的反感。他翻阅旧日信稿,发现了当日武昌告急时,他请求骆秉章发兵援救的一封信。写这封信时,他觉得字字有理有据,今天读来,却发现字字如锥如芒。信中称:

湖南湖北“唇齿利害之间,不待智者而知也”

不仅没有一点商量的口气,而且还略带嘲讽之意。为了防止骆秉章干预他募练水师,他又在信中早早地表明态度:

“其水路筹备一端,则听侍(曾自称)在此兴办,老前辈不必分虑及之。断不可又派员别为措置”。

仍是一副舍我其谁、比谁都高明的架势。

怪不得当日骆秉章批评他刚愎自用。骆秉章回信的原话是说他:

“行事犹是独行己见,不能择善而从,故进言者安于缄默,引身而退。”

说他做事听不进别人意见,所以也就没人愿意给他出主意。当时听了这话他不以为然,今天想来,才发现确实说到了自己的痛处。他在给弟弟的信中承认说:

“余生平在家在外,行事尚不十分悖谬,唯说些利害话,至今悔恨何及。”

曾国藩回忆起在湖南时朋友们对他的批评:

“近日友朋致书规我,多疑我近于妒功嫉能、忮薄险很者之所为,遂使我愤恨无已……仆之不能推诚与人,盖有岁年。”

朋友们不能理解他,难道都是因为不明大义,身处局外?他自己就没有任何责任?“行有不得,反求诸己”这句圣人之言,虽然耳熟能详,实际上却没有真正做到过。

他又想起弟弟对自己的批评:

“曾记咸丰七年冬,余咎骆文、文耆待我之薄,温甫则曰:‘兄之面色,每予人以难堪。’”

温甫是三弟曾国华。亲兄弟比别人说话更直接。确实,面对官场同僚,他确实常以圣贤自命,而以小人目人,面色如铁,话语如刀。

不光是对同僚,就是对自己的亲兄弟,他也成天一副“唯我正确”、“你们都不争气”的神气,处处批评教训,弄得当年国荃、国华到北京投奔他,结果都待不了多久就返乡了。设身处地,推己及人,那些自尊心受挫的同僚当然也会以冷面冷心甚至排斥辱骂来对待自己。

经过反复放电影,他越来越清楚地看到了自身的致命弱点:太自傲、太急切、一味蛮干、一味刚强。

曾国藩终于认识到,行事过于方刚者,表面上似乎是强者,实际上却是弱者。这片土地上真正的强者,是表面上看起来柔弱退让之人。

所谓“天下之至柔,驰骋天下之至坚”

“江河所以为百谷之王者,以其善下”

所谓“大柔非柔,至刚无刚”。

中国社会的潜规则是不可能一下子被扫荡的。那些他以前所看不起的虚伪、麻木、圆滑、机诈,是在这片土地上生存的必需手段。只有必要时和光同尘,圆滑柔软,才能顺利通过一个个困难的隘口。只有海纳百川,藏污纳垢,才能调动各方面的力量,达到胜利的彼岸。

曾国藩在这里把家居的两年称为“大悔大悟”之年,经过一年多的乡居,曾国藩的思维方式发生了重大转变。后来他回忆自己的这一变化说:

“昔年自负本领甚大,可屈可伸,可行可藏,又每见人家不是。自从丁巳、戊午大悔大悟之后,乃知自己全无本领,凡事都见得人家几分是处,故自戊午至今九年,与四十岁前迥不相同。”

和光同尘,指不露锋芒,与世无争的平和处世方法。

和、同:混合。

和光:混合各种光彩;

同尘:与尘世相同。

本意是道家无为而治思想的体现。出处《道德经》第四章和第五十六章:

“挫其锐,解其纷,和其光,同其尘;是谓玄同。”

挫其锐,解其纷:意为用虚柔不盈的方式来化解纷扰。

和:涵蓄。同:相同,混同。

玄同:微妙的同一。

指不露锋芒,消解纷争,挫去人们的锋芒,解脱他们的纷争,收敛他们的光耀,混同他们的尘世,这就是深奥的玄同。