(二)nodejs循序渐进-nodejs基本类型和循环条件语法篇(基础篇)

目录

入门之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 应用是由哪几部分组成的:

  1. 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。

  2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。

  3. 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 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以便返回一个错误值让大家知道这个函数运算出错了云云。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(三)nodejs循序渐进-值传递和引用传递,深拷贝和浅拷贝(基础篇)

值传递和引用传递 值类型变量&#xff1a; 存在内存的堆中&#xff0c;比如:a1引用类型变量 &#xff1a; 1.指针存在于栈中&#xff0c;2.引用类型的具体内容存在于堆中 ex:let a{b:1} a的指针指向 堆中的地址0xffac0ec 正如我在 第二章 说的&#xff0c; numberstringbo…

(四)nodejs循序渐进-函数,类和对象(基础篇)

上一篇文章讲到了基本数据类型和运算符&#xff0c;相信大家都能做简单的运算&#xff0c;本篇文章将讲述函数&#xff0c;类&#xff0c;对象。 函数 在nodejs中&#xff0c;一个函数可以作为另一个函数的参数。我们可以先定义一个函数&#xff0c;然后传递&#xff0c;也可…

leetcode38. 外观数列

「外观数列」是一个整数序列&#xff0c;从数字 1 开始&#xff0c;序列中的每一项都是对前一项的描述。前五项如下&#xff1a; 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two …

(五)nodejs循序渐进-回调函数和异常处理(基础篇)

上篇文章我们讲完了类和对象&#xff0c;接下来我们将要说回调函数. 我在第一篇说到nodejs的一个优势是异步IO&#xff0c;实际上异步IO直接体现就是使用回调函数&#xff0c;当然不是用了回调函数&#xff0c;他就一定是异步IO的&#xff0c;因为inodejs是一个单线程函数&…

(六)nodejs循序渐进-数据流和文件操作(基础篇)

Buffer JS 语言自身只有字符串数据类型&#xff0c;没有二进制数据类型&#xff0c;因此 NodeJS 提供了一个与 String 对等的全局构造函数 Buffer 来提供对二进制数据的操作。除了可以读取文件得到 Buffer 的实例外&#xff0c;还能够直接构造&#xff0c;Buffer 与字符串类似…

leetcode171. Excel表列序号

给定一个Excel表格中的列名称&#xff0c;返回其相应的列序号。 例如&#xff0c; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: "A" 输出: 1 示例 2: 输入: "AB" 输出: 28 …

(七)nodejs循序渐进-模块系统(进阶篇)

模块系统 为了让Node.js的文件可以相互调用&#xff0c;Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分&#xff0c;文件和模块是一一对应的。换言之&#xff0c;一个 Node.js 文件就是一个模块&#xff0c;这个文件可能是JavaScript 代码、JSON 或…

(八)nodejs循序渐进-事件驱动(进阶篇)

事件驱动程序 Node.js 使用事件驱动模型&#xff0c;当web server接收到请求&#xff0c;就把它关闭然后进行处理&#xff0c;然后去服务下一个web请求。 当这个请求完成&#xff0c;它被放回处理队列&#xff0c;当到达队列开头&#xff0c;这个结果被返回给用户。 这个模型…

leetcode304. 二维区域和检索 - 矩阵不可变

给定一个二维矩阵&#xff0c;计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2)。 上图子矩阵左上角 (row1, col1) (2, 1) &#xff0c;右下角(row2, col2) (4, 3)&#xff0c;该子矩形内元素的总和为 8。 示例…

(九)nodejs循序渐进-Express框架(进阶篇)

Express 框架 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&#xff0c;和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性&#xff1a; 可以设置中间件来响应 HTTP 请求。 定…

leetcode326. 3的幂 如此6的操作你想到了吗

给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。 示例 1: 输入: 27 输出: true 示例 2: 输入: 0 输出: false 示例 3: 输入: 9 输出: true 示例 4: 输入: 45 输出: false 进阶&#xff1a; 你能不使用循环或者递归来完成本题吗&#xff1f; 注意最后一句…

(十)nodejs循序渐进-高性能游戏服务器框架pomelo之介绍和安装篇

目录 Pomelo 安装Pomelo 创建demoserver项目 pomelo命令 项目结构说明 pomelo框架 架构 服务器实现 客户端请求与响应、广播的抽象介绍 Pomelo pomelo是一个快速、可扩展、Node.js分布式游戏服务器框架&#xff0c;对游戏服务器开发感兴趣的同学可以关注关注。 之前…

leetcode344. 反转字符串 史上最简单力扣题

编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。…

(十一)nodejs循序渐进-高性能游戏服务器框架pomelo之启动流程和组件

游戏启动过程 启动入口 在使用pomelo进行游戏开发时&#xff0c;工程目录下的app.js是整个游戏服务器的启动运行入口。app.js中创建项目&#xff0c;进行默认配置并启动服务器的代码如下&#xff1a; var pomelo require(pomelo); var app pomelo.createApp(); app.set(na…

(十二)nodejs循序渐进-高性能游戏服务器框架pomelo之创建一个游戏聊天服务器

上个章节我们简单介绍了下pomelo的安装和目录结构&#xff0c;有读者可能觉得有点吃不消&#xff0c;为什么不再深入讲一讲目录结构和里边的库&#xff0c;这里我就不费口舌了&#xff0c;大家可以去官网参考文档说明&#xff0c;本文只告诉大家如何利用这个框架来开发自己的东…

看这玩意复习你还会挂科?《软件工程篇》

软件工程&#xff1a;是指导软件开发和维护的一门工程学科 三要素方法/工具/开发过程 价值&#xff1a;促进项目成功 现代产品开发三原则&#xff1a;功用性、可行性、称许性 软件过程是软件工程的核心组成部分。 迭代 &#xff1a;反复求精 增量&#xff1a;逐块建造 需…

C++:02---命名空间

一、概念: ①类似于仓库,空间内存储代码,需要用到时调用②也为防止名字冲突提供了更加可控的机制二、命名空间的定义 定义的基本格式如下:namespace 命名空间名 { //一系列声明与定义 };三、命名空间的注意事项 命名空间定义时最后的分号可有可无只要出现在全局作用域中的…

看这玩意复习你还会挂科?《软件工程2篇》

第一章&#xff1a; 软件工程定义&#xff1a; 1968年10月&#xff0c;Fritz Bauer 首次提出了“软件工程”的概念&#xff0c;并将“软件工程”定义为&#xff1a;为了经济地获得能够在实际机器上有效运行的可靠软件&#xff0c;而建立并使用的一系列工程化原则。 1993年IE…

C++:05---命名空间

一、概念: ①类似于仓库,空间内存储代码,需要用到时调用②也为防止名字冲突提供了更加可控的机制二、命名空间的定义 定义的基本格式如下:namespace 命名空间名 { //一系列声明与定义 };三、命名空间的注意事项 命名空间定义时最后的分号可有可无只要出现在全局作用域中的…

C++:04---内联函数

1.概念: 内联类似于宏定义,当程序执行到内联函数时,相当于复制了一份函数代码。牺牲代码空间,赢得了时间 内联说明只是向编译器发出一个请求,编译器可以选择忽略这个请求 2.关键字:inline 声明时写了inline,定义时可省略。建议声明和定义都加上inlineinline int add(int…