首頁 web前端 js教程 NodeJs基本語法和類型的介紹

NodeJs基本語法和類型的介紹

Jun 30, 2018 pm 03:57 PM
nodejs 基本文法 類型

這篇文章主要介紹了NodeJs基本語法和類型的相關資料,需要的朋友可以參考下

#寫在前面

今天想要查下Node的類型什麼的知識,想要總結下,在Googol上看到一個文章,但是原始的鏈接不在了,在快照中把這篇文章拉出來,如果原作者有問題,請聯繫我!

該文章都是一些JS的基礎,高手自動跳過!我之前沒怎麼寫過js,這方面比較弱,所以在寫node的時候也遇到了麻煩,這裡給自己補充下知識!

正文

Node.js 的基礎是 JavaScript 這門腳本語言。而大多數的腳本語言一個共同的特徵就是「弱類型」。

不同於 PHP 的是,PHP 就是有了新變數也不需要申明,而 JavaScript 還是需要 var 來申明一下的。而這個 var 涵蓋了 C 中的int、string、char等一切類型的意義,甚至是 function。

本篇以及後篇的所有內容都是在 Linux 或 Cygwin 下用 vim 進行編輯(若不是則請自行轉變成你自己的方法),然後在命令列下進行查看結果的。

基本語法

變數宣告

在C/C 中,我們這麼宣告變數的:

"C

void foo() {}
int a = 0;
char b = 'a';
float c = 1.0f;
void (*d)() = foo; ///< 忘了是不是这么写的了,总之是函数指针
登入後複製

而在Node.js 中則是這樣的:
"javascript

function foo() {}
var a = 0;
var b = &#39;a&#39;;
var c = 1.0;
var d = foo;
登入後複製

所以,無論是什麼類型的變量,在Node.js 中都是以一個var 來解決的。

迴圈語句

for…i

這個迴圈語句基本上跟C/C 一樣,都是

"C

for(int i = 0; i < foo; i++)
{
//...
}
登入後複製

而鑑於Node.js 是弱型,所以只需要:
"javascript

for(var i = 0; i < foo; i++) {
    //...
}
for…in
登入後複製

這是一個後有型的迴圈語句,類似PHP 的foreach。

例如我們有一個JSON物件如下:

javascript

var foo = {
    "hello"     : "world",
    "node"      : "js",
    "blahblah"  : "bar"
};
登入後複製

這時候我們就可以用for...in 來循環遍歷了:

javascript

for(var key in foo) {
    console.log(key + ": " + foo[key]);
}
登入後複製

我們如果在命令列中打入下面的命令:

$ node foo.js
登入後複製

屏幕上就會顯示下面的內容了:

hello
: world
node: js
blahblah: bar
登入後複製

提示:由上可知, for...in 語句是用來遍歷JSON物件、陣列、物件的鍵名的,而不提供鍵值的遍歷。如果要取得鍵值,只能透過foo[<目前鍵名>]的形式來取得。這個跟 PHP 的 foreach 還是有一定差別的。

while…do, do…whill

這個就不多做解釋了,跟其它語言沒什麼大的區別,無非就是如果有變數聲明的話,需要用var 就夠了。

運算子

, -, *, /

這幾個運算子也就這樣,要注意的是。它既可以作用於字串,也可以作用於數值運算。弱型別語言雖然說型別是弱的,數字有時候可以以字串的型別出現,字串有時候可以用數值的型態出現,但是在必要的時候還是要說一下它是什麼型式的,我們可以用下面的程式碼去看看結果:

var a = "1";
var b = 2;
console.log(a + b);
console.log(parseInt(a) + b);
登入後複製

這裡的parseInt 是Node.js 的一個內建函數,作用是將一個字串解析成int 類型的變數。

上面的程式碼執行結果是:

12
3
登入後複製

註:第一個console.log 結果是12,由於a 是字串,所以b 也被系統以字串的姿態進行加操作,結果就是將兩個字串黏連在一起就變成了12。而第二個 console.log 結果是 3,是因為我們將第一個 a 轉換為了 int 類型,兩個 int 型的變數相加即數值相加,結果當然就是 3 了。

==, ===, !=, !==

這裡有一點要解釋,當這個邏輯運算子長度為2 的時候(==, !=),只是判斷外在的值是不是一樣的,而不會判斷型別。如

var a = 1, b = "1";
console.log(a == b);
登入後複製

它輸出的結果就是 true 。但是如果我們在中間判斷的時候再加上一個等號,那就是嚴格判斷了,需要型別和值都一樣的時候才會是 true,否則就是 false。也就是說

var a = 1, b = "1";
console.log(a === b);
登入後複製

的時候,回傳的結果就是 false 了,因為 a 是 int 型的,而 b 則是字串。

順從帶就把條件語句講了吧,其實這裡的 if 跟別的語言沒什麼兩樣,就是幾個邏輯運算子兩個等號三個等號的問題。所以就不多做累述了。

typeof

這裡我姑且把它當成是一個運算子而不是函數了。

這個運算子的作用是判斷一個變數的型別,會傳回一個字串,也就是型別名,具體的執行下面的程式碼就知道了:

function foo() {}
var a = 0;
var b = &#39;嘘~蛋花汤在睡觉。&#39;;
var c = 1.0;
var d = foo;
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

在JavaScript 中,有三個特殊的值,如標題所示。其中第一個大家可能都比較熟悉吧,C/C 裡面也有,不過是大寫的,其本質就是一個

"C

define NULL 0
登入後複製

而在JavaScript 中,這三個值所代表的意義都不同。

null ######

null 是一种特殊的 object,大致的意思就是空。比如说:

var a = null;
登入後複製

大家都能看懂,就不多做解释了。但是跟 C/C++ 不同的是,这个 null 跟 0 不相等。

### undefined ###

这个东西的意思就是说这个变量未声明。为了能够更好地区分 null,我们的样例代码如下写:

"javascript

var a = {
    "foo" : null
};
console.log(a["foo"]);
console.log(a["bar"]);
登入後複製

上面的代码中,我们让 a["foo"] 的值为空,即 null。而压根没有声明 a["bar"] 这个东西,它连空都不是。输出的结果大家都差不多应该猜到了:

null
undefined
NaN
登入後複製

这是一个空的数值,是一个特殊的 number。它的全称是 Not a Number。有点奇怪,大家可以理解为 不是数字形态,或者数值出错的 number 类型变量。

多在浮点型数值运算错误(如被0除)的情况下出现,甚至可以是用户自己让一个变量等于 NaN 以便返回一个错误值让大家知道这个函数运算出错了云云。

小杂碎

其它剩余的语句也跟已存在的其它语言差不多,比如说 break 啊、switch 啊、continue 啊等等等等。

变量类型

这一节主要讲的是 JavaScript 对象,其它类型差不多一带而过吧。

基础类型

Node.js 包含的基础类型差不多有如下几个:

number
string
boolean
array
其中前三种类型可以直接赋值, 而 array 的赋值只是一个引用赋值而已,在新变量中改变某个值的话旧变量的值也会改变 ,直接可以试试下面的代码:

javascript
var foo = [ 1, 2, 3 ];
var bar = foo;
bar[0] = 3;
console.log(foo);
登入後複製

它得出的结果是:

javascript
[ 3, 2, 3 ]
登入後複製

也就是说 array 要是复制出一个新的数组的话,不能用直接赋值的方法,而必须“深拷贝”。

这里有必要讲一下 array 的三种创建方法。

第一种:

javascript

var dog = new Array();
dog[0] = "嘘~";
dog[1] = "蛋花汤";
dog[2] = "在睡觉";
登入後複製

第二种:

javascript

var dog = new Array( "嘘~", "蛋花汤", "在睡觉" );
登入後複製

第四种:

javascript

var dog = [
    "嘘~",
    "蛋花汤",
    "在睡觉"
];
登入後複製

我个人比较喜欢第三种写法,比较简洁。

JSON对象

这里我把 JSON对象 单独拎出来而不是把它归类为 JavaScript对象,如果觉得我有点误人子弟就可以直接跳过这一节了。

本人对于 JSON对象 和 JavaScript 对象的区分放在 是否只用来存储数据,而并非是一个类的实例化。其实 JSON 的本质便是 JavaScript Object Notation。

更多有关 JSON 的信息请自行百科。

在 Node.js 中声明一个 JSON对象 非常简单:

javascript

var dog = {
  "pre" : "嘘~",
  "sub" : {
    "name" : "蛋花汤",
    "act"  : "在睡觉",
    "time" : 12
    },
  "suf" : [ "我说了", "它在睡觉", "就是在睡觉" ]
};
登入後複製

有两种方式能得到 JSON对象 中的某个键名的键值,第一种是用点连接,第二种是用中括号:

javascript

dog
.pre;
dog["pre"];
登入後複製

注意:上面在用点的时候,后面直接跟的是JSON中的key,如果把key当成是变量去当问,只能用dog[key]试试看:现在你自己动手试试看,用 for...in 的形式遍历一遍上面的 JSON对象。别忘了用上 typeof 喵~

类(对象)的基础

严格意义上来讲,Node.js 的类不能算是类,其实它只是一个函数的集合体,加一些成员变量。它的本质其实是一个函数。

不过为了通俗地讲,我们接下去以及以后都将其称为“类”,实例化的叫“对象”。

因为类有着很多 函数 的特性,或者说它的本质就是一个 函数,所以这里面我们可能一不留神就顺带着把函数基础给讲了。

类的声明和实例化

声明一个类非常简单,大家不要笑:

javascript
function foo() {
    //...
}
登入後複製

好了,我们已经写好了一个 foo 类了。

真的假的?!真的。

不信?不信你可以接下去打一段代码看看:

javascript
var bar = new foo();
别看它是一个函数,如果以这样的形式(new)写出来,它就是这个类的实例化。

而这个所谓的 foo() 其实就是这个 foo() 类的构造函数。

成员变量

成员变量有好两种方法。

第一种就是在类的构造函数或者任何构造函数中使用 this.<变量名> 。你可以在任何时候声明一个成员变量,在外部不影响使用,反正就算在还未声明的时候使用它,也会有一个 undefined 来撑着。所以说这就是第一种方法:

javascript
function foo() {
    this.hello = "world";
}
登入後複製

注意:只有在加了 this 的时候才是调用类的成员变量,否则只是函数内的一个局部变量而已。要分清楚有没有 this 的时候变量的作用范围。

第二种方法就是在构造函数或者任何成员函数外部声明,其格式是 <类名>.prototype.<变量名>:

javascript

function foo() {
    //...
}
foo.prototype.hello = "world";
登入後複製

无论上面哪种方法都是对成员变量的声明,我们可以看看效果:

javascript

var bar = new foo();
console.log(bar.hello);
登入後複製

甚至你可以这么修改这个类:

javascript

function foo() {
    this.hello = "world";
}
foo.prototype.hello = "蛋花汤";
登入後複製

然后再用上面的代码输出。

想想看为什么输出的还是 world 而不是 蛋花汤。

构造函数

我们之前说过了这个 foo() 实际上是一个 构造函数。那么显然我们可以给构造函数传参数,所以就有了下面的代码:

javascript

// 代码2.1
function foo(hello) {
    if(hello === undefined) {
        this.hello = "world";
    } else {
        this.hello = hello;
    }
}
登入後複製

我们看到上面有一个奇葩的判断 if(hello === undefined),这个判断有什么用呢?第一种可能,就是开发者很蛋疼地特意传进去一个 undefined 进去,这个时候它是 undefined 无可厚非。

还有一种情况。我们一开始就说了 JavaScript 是一门弱类型语言,其实不仅仅是弱类型,它的传参数也非常不严谨。你可以多传或者少传(只要保证你多传或者少传的时候可以保证程序不出错,或者逻辑不出错),原则上都是可以的。多传的参数会被自动忽略,而少传的参数会以 undefined 补足。

看看下面的代码就明白了:

javascript

// 上接代码2.1
var bar1 = new foo();
var bar2 = new foo("蛋花汤");
登入後複製

请自行输出一下两个 bar 的 hello 变量,会发现一个是 world 一个是 蛋花汤。显而易见,我们的第一个 bar1 在声明的时候,被 Node.js 自动看成了:

javascript

var bar1 = new foo(undefined);
登入後複製

所以就有了它是 world 一说。

还有就是在这个构造函数中,我们看到了传进去的参数是 hello 而这个类中本来就有个成员变量就是 this.hello。不过我们之前说过了有 this 和没 this 的时候作用域不同,那个参数只是作用于构造函数中,而加了 this 的那个则是成员变量。用一个 this 就马上区分开来他们了,所以即使同名也没关系。

成员函数

成员函数声明

成员函数的声明跟成员变量的第二种声明方法差不多,即 <类名>.prototype.<函数名> = <函数>;

javascript

// 上接代码2.1
function setHello(hello) {
  this.hello = hello;
}
foo.prototype.setHello = setHello;
bar1.setHello("鸡蛋饼");
登入後複製

上面这段代码显而易见,我们实现了 foo 类的 setHello 函数,能通过它修改 foo.hello 的值。

但是这么写是不是有点麻烦?接下去我要讲一个 JavaScript 函数重要的特性了。

★ 匿名函数 ★

很多时候我们的某些函数只在一个地方被引用或者调用,那么我们为这个函数起一个名字就太不值了,没必要,所以我们可以临时写好这个函数,直接让引用它的人引用它,调用它的人调用它。所以函数可以省略函数名,如:

javascript

function(hello) {
    this.hello = hello;
}
登入後複製

至于怎么引用或者调用呢?如果是上面的那个类需要引用的话,就是写成这样的:

javascript

foo.prototype.setHello = function(hello) {
    this.hello = hello;
}
登入後複製

这样的写法跟 成员函数 声明 是一个效果的,而且省了很多的代码量。而且实际上,基本上的类成员函数的声明都是采用这种匿名函数的方式来声明的。

至于说怎么样让匿名函数被调用呢?这通常用于传入一个只被某个函数调用的函数时这样写。

比如我们有一个函数的原型是:

javascript

/**
 * 我们将传入a,b两个变量,
 * 在算出a+b的值后,交由func(num)
 * 去进行输出
 */
function sumab(a, b, func) {
    var c = a + b;
    func(a, b, c);
}
登入後複製

比如我们有两个版本的输出函数,一个是中文输出,一个是英文输出,那么如果不用匿名函数时候是这么写的:

javascript

function zh(a, b, sum) {
  console.log(a + " + " + b + " 的值是:" + sum);
}
function en(a, b, sum) {
  console.log(a + " plus " + b + " is " + sum);
}
sumab(1, 2, zh);
sumab(3, 4, en);
登入後複製

执行一遍这段代码,输出的结果将会是:

1 + 2 的值是:3
3 plus 4 is 7
这样的代码如果采用匿名函数的形式则将会是:

javascript

sumab(1, 2, function(a, b, sum) {
    console.log(a + " + " + b + " 的值是:" + sum);
});
sumab(3, 4, function(a, b, sum) {
    console.log(a + " plus " + b + " is " + sum);
});
登入後複製

这种形式通常使用于回调函数。回调机制算是 Node.js 或者说 JavaScript 的精髓。在以后的篇章会做介绍。

成员函数声明的匿名函数声明方式

虽然上一节讲过了,不过还是再讲一遍吧。

通常我们声明类的成员函数时候都是用匿名函数来声明的,因为反正那个函数也就是这个类的一个成员函数而已,不会在其它地方被单独引用或者调用,所以就有了下面的代码:

javascript

// 上接代码2.1
foo.prototype.setHello = function(hello) {
    this.hello = hello;
}
登入後複製

这样我们就使得 foo 类有了 setHello 这个函数了。

2.3.4. 类的随意性

这个又是我胡扯的。所谓类的随意性即 JavaScript 中你可以在任何地方修改你的类,这跟 Ruby 有着一定的相似之处。

比如说 string ,它其实也是一个类,有着诸如 length 这样的成员变量,也有 indexOf、substr 等成员函数。但是万一我们觉得这个 string 有些地方不完善,想加自己的方法,那么可以在你想要的地方给它增加一个函数,比如:

javascript

String.prototype.sb = function() {
  var newstr = "";
  for(var i = 0; i < this.length; i++) {
    if(i % 2 === 0) newstr += "s";
    else newstr += "b";
  }
  return newstr;
};
登入後複製

这个函数的意思就是填充一个字符串,使其变成 sb 的化身。

我们来测试一下:

var str = "嘘~蛋花汤在睡觉。";
console.log(str.sb());
登入後複製

你将会得到这样的结果:

sbsbsbsbs
你跟你的电脑说“嘘~蛋花汤在睡觉。”,你的电脑会骂你四次半傻逼。(赶快砸了它)

3. 附

3.1. 深拷贝

所谓深拷贝就是自己新建一个数组或者对象,把源数组或者对象中的基础类型变量值一个个手动拷过去,而不是只把源数组或者对象的引用拿过来。所以这就涉及到了一个递归的调用什么的。

下面是我实现的一个深拷贝函数,大家可以写一个自己的然后加入到自己的 Node.js 知识库中。

javascript

function cloneObject(src) {
  var dest = {};
  for(var key in src) {
    if(typeof src === "object") dest[key] = cloneObject(src[key]);
    else dest[key] = src[key];
  }
  return dest;
}
登入後複製

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何快速使用node.js进行web开发

关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍

以上是NodeJs基本語法和類型的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles