exports和module.exports的区别

exports和module.exports的区别

我们今天主要来理解exports和module.exports的区别
写了一些代码,有问题请指教

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// file: app.js
var a = {name: 'yutiya'};
var b = a;

console.log(a);
console.log(b);

b.name = 'Yutiya';
console.log(a);
console.log(b);

b = {name: 'test'};

console.log(a);
console.log(b);

结果:

1
2
3
4
5
6
{ name: 'yutiya' }
{ name: 'yutiya' }
{ name: 'Yutiya' }
{ name: 'Yutiya' }
{ name: 'Yutiya' }
{ name: 'test' }

使用b变量修改属性,a变量的属性也会跟着变,说明两个变量使用一块内存,也就是说a和b都是指针(c和c++中)类型,指向同一个对象
给b变量赋值新的对象,b变量指向新的内存区域

Hexo Bug

在文章的md文件中不能使用下面这种搁置,否则出错

1
- 取得数组单个元素的长度:`length=${#array_name[n]}`

Nodejs第八课

测试用例:supertest

学习中,原文链接

目标

建立一个lesson8项目,在其中编写代码

app.js:其中有个fibonacci接口

fibonacci函数的定义为int fibonacci(int n),调用函数的url路径是/fib?n=10,然后这个接口会返回55
函数的行为定义如下:

  • n === 0时,返回0;n === 1时,返回1
  • n > 1时,返回fibonacci(n) === fibonacci(n-1) + fibonacci(n-2),如fibonacci(10) === 55
  • n不可大于10,否则抛错,http status 500,因为Node.js的计算性能没那么强。
  • n也不可小于0,否则抛错500,因为没意义。
  • n不为数字时,抛错,500

test/app.test.js:对app的接口进行测试,覆盖以上所有情况

知识点

  • 学习supertest的使用
  • 复习mocha,should的使用

开始

1
$ npm init # 来吧,一阵阵的键盘声(不停的回车)

ReactiveCocoa初体验

Reactive的学习和使用

Podfile文件内容:

1
2
3
platform :ios, '7.0'

pod 'ReactiveCocoa', '2.1.8'

运行$ pod install

安装完成后使用xcworkspace文件打开项目

RWViewController.m文件

1
#import <ReactiveCocoa/ReactiveCocoa.h>

在viewDidLoad中添加代码

1
2
3
[self.usernameTextField.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

现在我们就能体验到信号编程了

Nodejs第七课

浏览器端测试: mocha、chai、phantomjs

目标

  • 建立lesson7项目,编写代码
  • main.js类似第六节课中提交的fibonacci函数
  • 此函数的定义为int fibonacci(int n)
    • n === 0,返回0.n === 1时,返回1
    • n > 1,返回fibonacci(n) === fibonacci(n-1) + fibonacci(n-2),如fibonacci(10) === 55
  • verdor文件:前端单元测试环境
  • verdor/test.js编写针对前端脚本的测试用例

知识点

前端脚本单元测试

lesson6的内容都是针对后端环境中node的一些单元测试方案,出于应用健壮性的考量,针对前端js脚本的单元测试也非常重要.而前后端通吃,也是mocha的一大特点.
首先,前端脚本的单元测试主要由两个困难需要解决.

  • 运行环境在浏览器中,可以操作浏览器的DOM对象,且可以随意定义执行时的HTML上下文
  • 测试结果应当可以直接反馈给mocha,判断测试是否可以通过

Shell脚本学习第二天

第二天

格式化输出

必须显示添加换行符

1
printf "Hello, Shell\n"

printf命令语法:
printf format-string [arguments...]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

printf "%d %s \n" 1 "abc"
# 单引号和双引号一样
printf '%d %s \n' 2 "bcd"
# 即使不使用引号也一样
printf %s cde
# 多余的参数仍然遵循现有格式
printf %s abc def

printf "%s\n" abc def
# 未设置参数 %s 被NULL代替 %d被0代替
printf "%s and %d \n"
# 参数传递错误
printf "The first program always prints '%s, %d' \n" "Hello" "Shell"

Shell脚本学习第一天

Shell脚本学习第一天

第一个Shell脚本

1
2
3
echo "打印是内容"        //输出内容到stdou 使用双引号""
read PERSON //从stdin获取输入并赋值给PERSON变量
echo "Hello, $PERSON" //输出内容,同时输出PERSON变量的值

变量

  • 定义变量varName="value",变量名和等号不能有空格
  • 首字符(a-z,A-Z)
  • 中间不能有空格,可以使用下划线
  • 不能使用标点符号
  • 不能使用bash里的关键字

For example:

  • myUrl="http://yutiya.com/"
  • myNum=100

使用变量,在变量名前面加$符号即可
变量名外面的花括号是可选的,是个好习惯

1
2
3
your_name="yutiya"
echo $your_name
echo ${your_name}

如果不写,像下面这样,就会有问题…

1
2
3
4
for skill in Ada Coffe Action Java 
do
echo "I am good at ${skill}Script"
done

这里稍微提一下,Shell中使用#打头备注后面的内容,首行特殊表示用什么脚本解析器执行

C语言变态的HelloWorld

C语言变态的HelloWorld

C语言真是世界上最难的语言,所以C++是最恐怖的语言

第一种实现方式,使用宏定义

1
2
3
4
5
6
7
8
9
10
11
12
// file main.c
#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include <stdio.h>
_____

看一下该代码经过预处理之后是什么样子,使用$ gcc -E main.c -o main.i

1
2
// file main.i 看最后的部分,main函数
main(){ putchar(0x48);putchar(0x65);putchar(0x6C);putchar(0x6C); putchar(0x6F);putchar(0x2C);putchar(0x20);putchar(0x77);putchar(0x6F); putchar(0x72);putchar(0x6C);putchar(0x64);putchar(0x21); }

现在我们来解析这段代码,一步一步看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>  //这句之前的都是宏定义,之后的代码在预编译阶段会进行宏替换
_____
>>>> __ ___ ____ _________
-- 先看来第一个 __
>>>> ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
>>>> _______(){ _(0x48)_(0x65)_(0x6C)_(0x6C)
>>>> main(){ putchar(0x48);putchar(0x65);putchar(0x6C);putchar(0x6C);
-- 继续 ___
>>>> _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
>>>> putchar(0x6F);putchar(0x2C);putchar(0x20);putchar(0x77);putchar(0x6F);
-- 继续 ____
>>>> _(0x72)_(0x6C)_(0x64)_(0x21)
>>>> putchar(0x72);putchar(0x6C);putchar(0x64);putchar(0x21);
-- 最后 _________
>>>> }

由四部分组成,所以得到了上面的那段代码
0x全是16进制数,以ASCII码形式转换成字符,前面是零,不是'鸥'
0x48 > 72 == H
0x65 > 101 == e
0x6c > 108 == l
0x6f > 111 == o
0x2c > 44 == ,
0x20 > 32 == Space(空格)
0x77 > 119 == w
0x72 > 114 == r
0x64 > 100 == d
0x21 > 33 == !

输出结果Hello, world!,你的呢?测试了吗?
此乃没有写返回值类型的main函数噢
好了,就分析这一个,剩下的贴代码,太丧心病狂了

Nodejs第六课

测试用例: mocha, should, istanbul

第六课, 原文链接Node.js-lesson6

目标

建立lesson6项目,编写代码
main.js: 其中有个fibonacci函数.fibonacci的介绍详见维基百科,中文名 斐波那契
此函数的定义为int fibonacci(int n)

  • 当 n === 0 时,返回0; n === 1 时,返回1
  • n > 1 时,返回fibonacci(n) = fibonacci(n - 1) + fibonacci(n-2),如fibonacci === 55
  • n不能大于10,否则抛错,因为Node.js的计算性能没那么强,到此为止
  • n也不能小于0,否则抛错,因为没意义
  • n不为数字时,抛错

test/main.test.js: 对main函数进行测试,并使行覆盖率和分支覆盖率都达到100%

知识点:

课程内容

$ npm init 初始化项目
编辑 main.js,编写 fibonacci 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// file main.js
var fibonacci = function(n) {
if(n === 0) {
return 0;
}
if(n === 1) {
return 1;
}
return fibonacci(n-1) + fibonacci(n-2);
};
if(require.main === module) {
// 如果是直接执行main.js,则进入此处
// 如果是main.js被其他文件require,则此处不会执行
var n = Number(process.argv[2]);
console.log('fibonacci(' + n + ' ), is', fibonacci(n));
}

执行 $ node main.js 10运行

Nodejs第五课

使用async控制并发

原文链接: https://github.com/alsotang/node-lessons/tree/master/lesson5
博主已学习,并做记录

目标

建立一个lesson5项目,在其中编写代码
代码入口app.js , $ node app.js, 会输出CNode社区首页的所有主题的标题、链接和第一条评论,以json格式
注意: 与lesson4不同. 并发连接数需要控制在5个

输出实例:

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"title": "【公告】发招聘帖的同学留意一下这里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
"comment1": "呵呵呵呵"
},
{
"title": "发布一款 Sublime Text 下的 JavaScript 语法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
"comment1": "沙发!"
}
]

知识点

当你需要去多个源(一般是小于 10 个)汇总数据的时候,用 eventproxy 方便;当你需要用到队列,需要控制并发数,或者你喜欢函数式编程思维时,使用 async。大部分场景是前者

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×