目录
入门之helloworld
进阶之helloworld http服务器
步骤一、引入 required 模块
步骤二、创建服务器
基本语法篇
变量声明
基础类型
if else
循环语句
for
for ... in
while do和do while
运算符
加减乘除
==, ===, !=, !==
typeof
null,undefined,NaN
好了, 上一篇文章已经讲了node环境安装,这里我们开始第一个经典程序 helloworld
入门之helloworld
console.log("hello world");
运行 node hello.js
[root@VM_0_9_centos ~]# node hello.js
hello world
就是这么简单,console.log是在控制台打印输出信息的函数。
进阶之helloworld http服务器
之前我们用php做web网站的时候,需要 Apache 或者 Nginx 的 HTTP 服务器,并配上 mod_php5 模块和 php-cgi,整个"接收 HTTP 请求并提供 Web 页面"的需求就不需要 PHP 来处理。
不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。
在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:
-
引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
-
创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
-
接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
步骤一、引入 required 模块
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
var http = require("http");
步骤二、创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。
实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
var http = require('http');
http.createServer(function (request, response) {response.writeHead(200, {'Content-Type': 'text/plain'});// 发送响应数据 "Hello World"response.end('Hello World\n');
}).listen(80);
console.log('Server running at http://127.0.0.1/');
以上代码我们完成了一个可以工作的 HTTP 服务器。
使用 node 命令执行以上的代码:
node server.js
Server running at http://127.0.0.1/
基本语法篇
变量声明
在 C/C++ 中,我们这么声明变量的:
void fun() {}
int a = 0;
char b = 'a';
float c = 1.0f;
void (*d)() = fun;
而在 Node.js 中则是这样的:
function fun() {}
var a = 0;
var b = 'a';
var c = 1.0;
var d = fun;
所以,无论是什么类型的变量,在 Node.js 中都是以一个var来解决的。
基础类型
Node.js 包含的基础类型差不多有如下几个:
- number
- string
- boolean
- array
这里注意string类型
var a="bc";
var b='bc'; //等价于“bc”
其中前三种类型可以直接赋值,而array的赋值只是一个引用赋值而已,在新变量中改变某个值的话旧变量的值也会改变,直接可以试试下面的代码:
var arr = [ 1, 2, 3 ];
var ref = arr;
ref[0] = 3;
console.log(arr);
它得出的结果是:
[ 3, 2, 3 ]
也就是说array要是复制出一个新的数组的话,不能用直接赋值的方法,而必须深拷贝(深拷贝我将会在后边章节里专门讲,读者不用着急)。
这里有必要讲一下array的三种创建方法。
第一种:
var words = new Array();
words[0] = "hello world";
words[1] = "hello C++";
第二种:
var words = new Array( "hello world", "C++");
第四种:
var word = ["hello word","C++"
];
if else
用法和C++等其他语言一样
var player = {"user_id" : "1927u893233c2993u429o34","user_name" : "高司机","gender" : "man","age" : 18,"level" : 2,"viplevel" : 0,"exp" : 23933,"section" : 12
};if(player["user_name"] == "高司机")
{console.log("找到了高司机");
}
循环语句
for
这个循环语句基本上跟 C/C++ 一样,都是
for(int i = 0; i < foo; i++)
{//...
}
而鉴于 Node.js 是弱类型,所以只需要:
for(var i = 0; i < foo; i++) {//...
}
for ... in
这种循环体适合用来获取JSON对象、数组、对象等这种键值对的,其中键是可以直接通过for 。。。 in 来获取的,值需要借助对象和键来间接获取。
比如我们有一个 JSON对象 如下:
var player = {"user_id" : "1927u893233c2993u429o34","user_name" : "高司机","gender" : "man","age" : 18,"level" : 2,"viplevel" : 0,"exp" : 23933,"section" : 12
};
这个时候我们就可以用 for...in
来循环遍历了:
for(var key in player) {console.log(key + ": " + player[key]);
}
我们如果在命令行中打入下面的命令:
$ node foo.js
屏幕上就会显示下面的内容了:
user_id: 1927u893233c2993u429o34
user_name: 高司机
gender: man
age: 18
level: 2
viplevel: 0
exp: 23933
section: 12
while do和do while
用法和C++等其他语言类似
var player = {"user_id" : "1927u893233c2993u429o34","user_name" : "高司机","gender" : "man","age" : 18,"level" : 2,"viplevel" : 0,"exp" : 23933,"section" : 12
};while(1){if(player["user_name"] == "高司机"){console.log("找到了高司机");break;}else{console.log("没有找到");}
};do{if(player["user_name"] == "高司机"){console.log("找到了高司机");break;}else{console.log("没有找到");}
}while(true);
运算符
加减乘除
这几个运算符也就这样,要注意的是 +
。它既可以作用于字符串,也可以作用于数值运算。弱类型语言虽然说类型是弱的,数字有时候可以以字符串的形态出现,字符串有时候可以用数值的形态出现,但是在必要的时候也还是要说一下它是什么类型的,我们可以用下面的代码去看看结果:
var a = "0";
var b = 2;
console.log(a + b);
console.log(parseInt(a) + b);
这里的 parseInt
是 Node.js 的一个内置函数,作用是将一个字符串解析成 int
类型的变量,这里的a+b实际上因为a是字符串,所以+相当于是连接两个字符串,这个用法类似于php的 .. 连接两个字符串。
上面的代码执行结果是
02
2
那么此时有人要问了,如果数字+数字+字符串结果是什么样的呢?
var a = "0";
var b = 2;
var c = 3;
console.log(c + b + a);
console.log(parseInt(a) + b);
实际上运算符的执行顺序和C++是一样的,从左向右,因此先执行 c+b得到结果5,然后5和字符串“0”通过+连接相当于字符串的连接,所以结果是50,因此此段代码执行结果是
50
2
==, ===, !=, !==
这里有一点要解释,当这个逻辑运算符长度为 2
的时候(==
, !=
),只是判断外在的值是不是一样的,而不会判断类型。如
var a = 1, b = "1";
console.log(a == b);
它输出的结果就是 true
。
但是如果我们在中间判断的时候再加上一个等号,那么就是严格判断了,需要类型和值都一样的时候才会是 true
,否则就是 false
。
var a = 1, b = "1";
console.log(a === b);
f他输出是false因为 a
是 int
型的,而 b
则是字符串。
typeof
这个运算符的作用是判断一个变量的类型,会返回一个字符串,即类型名,具体的执行下面的代码就知道了:
function fun() {
}var a = 0;
var b = '高司机爱写BUG';
var c = 1.0;
var d = fun;
var e = { "a" : a };
var f = [ 1, 2, 3 ];
var g = null;
var h = undefined;console.log(typeof a);
console.log(typeof b);
console.log(typeof c);
console.log(typeof d);
console.log(typeof e);
console.log(typeof f);
console.log(typeof g);
console.log(typeof h);
这里的执行结果就将会是:
number
string
number
function
object
object
object
undefined
null,undefined,NaN
在nodejs里这三个有各自的含义:
null
是一种特殊的 object,意思就是空,但这个null跟0不相等。比如说:
var a = null;
if(a == 0)
{console.log("他俩相等");
}
undefined意思就是说这个变量未声明。为了能够更好地区分null,我们的样例代码如下写:
var player = {"user_id" : "1927u893233c2993u429o34","user_name" : "高司机","gender" : "man","age" : 18,"level" : 2,"viplevel" : 0,"exp" : 23933,"section" : 12,"achievement" : null
};console.log("成就:"+player["achievement"]);
console.log("每日任务:"+player["dailytask"]);
上面的代码中,我们让 player["achievement"]
的值为null。而压根没有声明 player["dailytask"]
。输出的结果大家都差不多应该猜到了:
成就:null
每日任务:undefined
NaN这是一个空的数值,是一个特殊的number。它的全称是Not a Number。大家可以理解为 不是数字形态,或者数值出错的 number
类型变量。
多在浮点型数值运算错误(如被0除)的情况下出现,甚至可以是用户自己让一个变量等于NaN以便返回一个错误值让大家知道这个函数运算出错了云云。