Node.js核心数据类型简介

Node.js的核心类型有:

  • number(数字)
  • boolean(布尔 值)
  • string(字符串)
  • object(对象)

Node.js的数据类型

另外两种类型——函数(function)和数组(array)实际上是object的特殊形式。

因为它们在语言以及运行时层面有一些额外的特性,因此将object、 function(函数)以及array(数组)归类为复杂数据类型。

null(没有值)和 undefined(不存在)也是object的特殊形式,在JavaScript语言中有特殊作用。

undefined值代表还没有赋值或者不存在,null的另外一个准确的意思是“没有值”。


number类型

JavaScript中所有数字都采用IEEE 754标准定义的64位双精度浮点数表示。所有的正负整数都可以使用253位准确表示,JavaScript中的数字类型和其他语言的整数数据类型非常相似,然而,使用数字类型最棘手的部分是,许多数字的真实值实际上是实际数值的一个近似值。例如:

1
2
3
> 0.1+0.2
0.30000000000000004
>

当对浮点数执行算术运算时,仅仅操作任意的实际数字并不一定能够得到准确值:

1
2
3
4
> 1-0.1-0.3
0.6000000000000001
> 1-0.1-0.3==0.6
false

boolean类型

JavaScript中的布尔(boolean)数据类型不仅简单而且容易使用。

布尔值可以是true或者false,虽然技术上可以使用Boolean函数将其他值转换为布尔值,
但实际上却很少需要使用这个函数,因为JavaScript语言会在需要时自动将任何值转换为布尔值,转换规则如下:

  • false、0、空字符串(””)、NaN、null以及undefined都等价于false。

  • 其他值都等价于true。

1
2
> ""==0==null==NaN==undefined==false
true

string类型

JavaScript中的字符串(string)是一组Unicode字符(内部以16位UCS-2格式实现)组成的序列,可以表示世界上绝大部分字符,包括大部分亚洲语言中使用的字符。

JavaScript语言没有单独的字符(char)或者字符数据类型,可以使用只有一个字符的字符串来表示字符。

对于大部分使用Node.js编写的网络应用,需要使用UTF-8格式对外通信,Node会自动处理转换细节。
而如果是操纵二进制数据,那么处理字符串和字符集相关的经验会非常重要。

字符串可以使用单引号或者双引号封装。单引号和双引号在功能上是等价的,可以选择任意一个使用。如果想要在使用单引号的字符串中包含单引号,可以使用\’;同理,如果在使用双引号的字符串中包含双引号,可以使用\”。

要想获得一个JavaScript字符串的长度,只需使用length属性,在JavaScript中尝试获取值为null或undefined的字符串的长度时,将会抛出错误。

要想将两个字符串组合在一起,可以使用+操作符。如果将其他类型的数据混入到字符串中,JavaScript将尽可能将其他数据转换成字符串。许多人担心在处理字符串时使用连接运算符+会导致严重的性能问题,好消息是几乎所有现代浏览器的JavaScript实现——包括 Node.js使用的ChromeV8引擎,已经对该问题进行了深度优化,因此现在的运行性能非常好。

字符串函数 JavaScript中为字符串提供了许多有趣的函数。

indexOf函数

使用indexOf函数可以在一个字符串中搜索另外一个字符串。

substr函数 slice函数

从一个字符串中截取一个子串,可以使用substr或slice函数 (前者会接受一个开始索引和一个需要截取的字符串长度;而后者则 会接受一个开始索引和一个结束索引)。

split函数

如果字符串中有某个分隔符,可以使用split函数将字符串分割成子字符串并返回一个数组.

trim函数

可以使用trim函数(V8 JS)清除字符串前后的空白字符。

正则表达式

JavaScript支持功能强大的正则表达式。有几个字符串函数可以接收正则表达式作为参数并 执行。
正则表达式不仅可以使用字面量格式(literal format)(通 过将正则表达式放入两个斜杠字符[/]之间表示),也可以通过调用 RegExp对象的构造器来表示:

1
2
3
4
5
6
7
> '1,3,6,8,9'.split(',');
[ '1', '3', '6', '8', '9' ]
> /[Aa]{2,}/
/[Aa]{2,}/
> new RegExp("[Aa]{2,}")
/[Aa]{2,}/
>

以上两个都是正则表达式,用来表示一组两个或两个以上a字符 的序列(大写或者小写)。

为了将字符串对象中两个或两个以上的a字符序列替换成b字母,我们可以使用replace函数,以下两种写法都是可行的:

1
2
3
4
5
> "123aaammm".replace(/[Aa]{2,}/,"b");
'123bmmm'
> "123aaammm".replace(new RegExp("[aA]{2,}"),"b");
'123bmmm'
>

search函数

与indexOf函数类似,search函数接收一个正则表达式参数,并 返回第一个匹配此正则表达式的子字符串的位置索引,如果匹配不存 在则返回-1:

“123aaammm”.search(new RegExp(“[aA]{2,}”));
3

object类型

对象(object)是JavaScript语言的核心之一,我们总会使用到 它。对象是一种相当动态和灵活的数据类型,可以轻松地为其新增或删除属性。

我们可以使用以下两种方式创建对象,而后者就是所谓的对象字面量语法(object literal syntax),它是目前最推荐的写 法。

我们还可以使用对象字面量语法指定对象的内容,在初始化时, 可以指定对象成员的名字以及对应的值:

1
2
3
4
5
6
> var user=new Object();
undefined
> var user={};
undefined
> user
{}

对象字面量语法(object literal syntax)

1
2
3
4
5
> var user={name:"Tom",age:18,gender:"male"};
undefined
> user
{ name: 'Tom', age: 18, gender: 'male' }
>

添加属性:

1
2
3
4
> user.birthday='1999-01-01';
'1999-01-01'
> user
{ name: 'Tom', age: 18, gender: 'male', birthday: '1999-01-01' }

delete关键字

要删除对象的某个属性时,可以使用delete关键字:

1
2
3
4
> delete user.age;
true
> user
{ name: 'Tom', gender: 'male', birthday: '1999-01-01' }

在JavaScript中获取一个关联数组对象的大小有些棘手。对象没有size或者length等属性或者方法。而为了得到对象的大小,可以使用如下写法(V8 JS):

1
2
3
4
> Object.keys(user);
[ 'name', 'gender', 'birthday' ]
> Object.keys(user).length;
3

关于JSON

JSON即JavaScript对象表示法(JavaScript Object Notation)。这种数据交换格式充分发挥了基于文本的数据格式的 灵活性,却没有像XML这样的其他格式所带来的麻烦(公平地讲, 相较于后者,JSON缺少一些格式验证功能,但它仍然是最好使用的 格式)。

JSON和对象字面量表示法非常相似,但是二者之间有两个关键 的区别:对象字面量表示法使用单引号或双引号封装属性名,甚至可以不使用任何引号,而在JSON中却是强制使用引号的。

另外,JSON中所有字符串都需要包含在双引号中: 实际上大部分JSON库兼容单引号字符串,但是为了提高兼容 性,无论是编写还是生成JSON数据,最好还是使用双引号。

通常我们可以使用V8的JSON.parse和JSON.stringify函数来生 成JSON数据。前者接收一个JSON字符串作为参数,并将其转换成 一个对象(如果失败,则抛出一个错误),而后者接收一个对象作为 参数,并返回一个JSON字符串表示。

1
2
> JSON.stringify(user);
'{"name":"Tom","age":18,"gender":"male"}'

array类型

JavaScript中的数组(array)类型实际上是JavaScript对象的一个特殊形式,它拥有一系列额外特性,这使得数组非常实用和强大。

array

创建数组

我们可以使用传统的表示法或者数组字面量语法(array literal syntax)来创建数组:

1
2
3
4
5
6
7
8
> var arr1=new Array();
undefined
> arr1
[]
> var arr2=[];
undefined
> arr2
[]

和对象一样,我倾向于使用字面量语法来创建数组,而很少使用
传统表示法创建数组。

校验类型

如果我们对数组使用typeof运算符,会得到一个令人惊讶的结果:

1
2
> typeof(arr2);
'object'

因为数组实际上就是对象,所以typeof运算符会返回”object”,而这不是我们想要的结果。
幸运的是,V8有一个语言扩展,可以确定是否为一个数组:Array.isArray函数(V8 JS)。

1
2
> Array.isArray(arr2);
true

push函数

默认情况下,JavaScript数组是通过数字来进行索引的,可以通过以下两种方式在数组的末尾添加新项:

push函数 或者 arr[arr.length]=新的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> var arr3=['dog','cat','tiger']
undefined
> arr3
[ 'dog', 'cat', 'tiger' ]

> arr3.push('cow')
4
> arr3
[ 'dog', 'cat', 'tiger', 'cow' ]

> arr3[arr3.length]="fly";
'fly'
> arr3
[ 'dog', 'cat', 'tiger', 'cow', 'fly' ]
>

可以通过指定特定的元素索引插入新元素。如果该元素的索引超过了最后一个元素,则两者之间的元素会被创建,并初始化为undefined值:

1
2
3
4
> arr3[10]='pig'
'pig'
> arr3
[ 'dog', 'cat', 'tiger', 'cow', 'fly', <5 empty items>, 'pig' ]

pop函数

删除末尾的元素,并返回被删除的元素

1
2
3
4
5
6
7
8
9
10
> arr3
[ 'dog', 'cat', 'fly', <5 empty items>, 'pig' ]
> arr3.pop()
'pig'
> arr3
[ 'dog', 'cat', 'fly', <5 empty items> ]
> arr3.pop()
undefined
> arr3
[ 'dog', 'cat', 'fly', <4 empty items> ]

delete关键字

使用delete关键字从数组中删除元素,被删除位置对应的值仍然“存在”,只是值被设置为
undefined。

splice函数

要想真正地从数组中删除某一项,可以使用splice函数,它会接收删除项的起始索引和数目作为参数。该函数会返回被删除的数组项,并且原始数组已经被修改,这些项不再存在:

1
2
3
4
5
6
> arr3
[ 'dog', 'cat', 'tiger', 'cow', 'fly', <5 empty items>, 'pig' ]
> arr3.splice(2,2);
[ 'tiger', 'cow' ]
> arr3
[ 'dog', 'cat', 'fly', <5 empty items>, 'pig' ]

unshift函数

在数组首位添加一个元素,并返回新的数组长度

1
2
3
4
5
6
> arr3
[ 'cat', 'fly', <4 empty items> ]
> arr3.unshift('dog');
7
> arr3
[ 'dog', 'cat', 'fly', <4 empty items> ]

shift函数

删除数组的第一个元素,并返回被删除的元素

1
2
3
4
5
6
> arr3
[ 'dog', 'cat', 'fly', <4 empty items> ]
> arr3.shift();
'dog'
> arr3
[ 'cat', 'fly', <4 empty items> ]

join函数

数组函数join可以将数组按照参数指定的分割符转为字符串,返回一个字符串,与字符串函数split作用相反

1
2
> arr3.join(',');
'dog,cat,fly,,,,'

sort函数

sort函数用于对数组进行排序,如果不传参数则使用内置的排序函数,也可以用自己提供排序函作为参数传入sort函数中

1
2
3
4
5
6
7
8
> var arr4=[4,1,7,8,0,1,9,2,4,3];
undefined
> arr4
[ 4, 1, 7, 8, 0, 1, 9, 2, 4, 3 ]
> arr4.sort()
[ 0, 1, 1, 2, 3, 4, 4, 7, 8, 9 ]
> arr4.sort(function (a,b) { if(a>b) return -1; if(a<b) return 1; return 0; })
[ 9, 8, 7, 4, 4, 3, 2, 1, 1, 0 ]

forEach函数

forEach函数(V8 JS)用于遍历数组,作用于for循环相同,只是不需要传入索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
> arr4.forEach(function (value,index){ console.log('index='+index+',value='+value);})
index=0,value=9
index=1,value=8
index=2,value=7
index=3,value=4
index=4,value=4
index=5,value=3
index=6,value=2
index=7,value=1
index=8,value=1
index=9,value=0
undefined
>

function类型

虽然第一眼看起来不像(名字并没有帮到它),但其实JavaScript是一门函数式编程语言(functional programming language),这意味着函数是完全意义上的对象,可以被操纵、扩展,还可以作为数据进行传递。Node.js充分利用了这种能力,因此,我们会在网络和Web应用中广泛地使用函数。

ijiangtao wechat
欢迎订阅我的微信公众号
打赏支持博主继续写出好作品
0%