JavaScript 数据类型

学习笔记,非原创。谢谢

JavaScript 数据类型

字符串、数字、数组、布尔、对象、Null、Undefined

Number (数字)

JavaScript不区分整数和浮点数,统一用Number表示。

合法的Number类型

123;    // 整数123

0.456;    // 浮点数0.456

1.2345e3;    // 科学计数法表示1.2345x1000,等同于1234.5

-99;    // 负数

NaN;    // NaN表示Not a Number,当无法计算结果时用NaN表示

Infinity;    // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity

Number可以直接做四则运算,规则和数学一致:

1 + 2; // 3

( 1 + 2 ) * 5 / 2; // 7.5

2 / 0; // Infinity

0 / 0; // NaN

10 % 3; // 1

10.5 % 3; // 1.5

注意 % 是求余运算。


String (字符串)

字符串是以单引号 ( ' ) 或双引号 ( " ) 括起来的任意文本,单引号或双引号只是一种表示方式,不是字符串的一部分。

转义字符  \

输出 单引号 或 双引号 可以用转义字符 \ 来标识

转义字符 \ 可以转义很多字符,比如 \n 表示换行,\t 表示制表符,字符 \ 本身也要转义,所以 \\ 表示的字符就是 \。

ASCII字符

ASCII字符可以以 \x## 形式的十六进制表示,例如:

'\x41';    //完全等同于'A'

还可以用 \u#### 表示一个Unicode字符:

'\u4e2d\u6587';    //完全等同于'中文'

多行字符串

由于多行字符串用 \n 写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` ... ` 表示:

模板字符串

多个字符串可以用 + 号连接起来

如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量:

注意:拼接时要用反引号括起来,否则 ${... } 会以字符串的形式输出

操作字符串

获取字符串的长度:(注意:空格也是字符串的一部分)

要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:

字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:

字符串常用方法

JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:

toUpperCase

toUpperCase()把一个字符串全部变为大写:

toLowerCase

toLowerCase() 把一个字符串全部变为小写:

indexOf

indexOf()会搜索指定字符串出现的位置:

substring

substring()返回指定索引区间的子串:


Array  (数组)

数组是一组按顺序排列的集合,集合的每个值称为元素。

JavaScript的数组可以包括任意数据类型。并通过索引来访问每个元素。

数组用[]表示,元素之间用,分隔。

[ 1,3.14,'Hello',null,true,undefined ];

另一种创建数组的方法是通过Array()函数实现:

newArray(1,2,3);    // 创建了数组[1, 2, 3]

然而,出于代码的可读性考虑,强烈建议直接使用[]。

要取得Array的长度,直接访问length属性:

请注意,直接给Array的length赋一个新的值会导致Array大小的变化:

Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:

如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:

大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误。在编写代码时,不建议直接修改Array的大小,访问索引时要确保索引不会越界。

indexOf

与String类似,Array也可以通过indexOf()来搜索一个指定的元素的位置:

注意:数字 30 和 字符串 '30' 是不同的元素

slice

slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array:

注意:到slice()的起止参数包括开始索引,不包括结束索引。

如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array:

push 和 pop

push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:

unshift 和 shift

如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:

sort

sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序:

想要按照指定的顺序排序需要创建函数。

reverse

reverse()把整个Array的元素给反转:

splice

splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:

concat

concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:

注意:concat()方法并没有修改当前Array,而是返回了一个新的Array。

concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:

join

join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:

多维数组

如果数组的某个元素又是一个Array,则可以形成多维数组

var arr = [[1,2,3], [400,500,600],'-'];

上述Array包含3个元素,其中头两个元素本身也是Array。

数组的元素可以通过索引来访问。请注意,索引的起始值为0:

var arr = [1,2,3.14,'Hello',null,true];

arr[0]; // 返回索引为0的元素,即1

arr[5]; // 返回索引为5的元素,即true

arr[6]; // 索引超出了范围,返回undefined


Boolean (布尔) 

布尔值和布尔代数的表示完全一致,一个布尔值只有true、false两种值,要么是true,要么是false,可以直接用true、false表示布尔值,也可以通过布尔运算计算出来:

true; //这是一个true值

false; //这是一个false值

2 > 1; //这是一个true值

2 >= 3; //这是一个false值

&& 运算是与运算,只有所有都为true,&&运算结果才是true:

true && true; //这个&&语句计算结果为true

true && false; //这个&&语句计算结果为false

false && true && false; //这个&&语句计算结果为false

|| 运算是或运算,只要其中有一个为true,||运算结果就是true:

false || false; //这个||语句计算结果为false

true||false; //这个||语句计算结果为true

false || true || false; //这个||语句计算结果为true

! 运算是非运算,它是一个单目运算符,把true变成false,false变成true:

! true; //结果为false

! false; //结果为true

! (2>5);//结果为true

布尔值经常用在条件判断中,比如:

var age  = 15;

if (age >= 18) {

    alert( 'adult' );

}else{

    alert( 'teenager' );

}

比较运算符

当我们对Number做比较时,可以通过比较运算符得到一个布尔值:

2 > 5; //false

5 >= 2; //true

7 == 7; //true

实际上,JavaScript允许对任意数据类型做比较:

false == 0; //true

false === 0; //false

注意:

= 运算符 为赋值运算符,将 = 右边的值赋值给左边。

== 运算符只比较内容是否一样,不比较数据类型。

=== 运算符 先比较数据类型是否一样,再比较内容是否一样。

由于JavaScript这个设计缺陷,尽量不要使用 == 比较,始终坚持使用 === 比较。

NaN是特殊的Number与所有其他值都不相等,包括它自己:

NaN === NaN; // false

唯一能判断NaN的方法是通过isNaN()函数:

isNaN(NaN); //true

最后要注意浮点数的相等比较:

1/3 ===  (1 - 2 / 3); //false

这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:

Math.abs(1 / 3 -  ( 1 - 2 / 3 )) < 0.0000001; //true


Null 和 Undefined

null表示一个“空”的值,它和0以及空字符串 ' ' 不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。

在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。

JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。


Object (对象) 

JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。

JavaScript的对象用于描述现实世界中的某个对象:

var person = {    

name: 'Bob',    

age: 20,   

 tags:  ['js','web','mobile'],    

city: 'Beijing',   

 hasCar: true,    

zipcode: null

}; 

JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为'Bob',zipcode属性为null。

要获取一个对象的属性,我们用对象变量.属性名的方式:

person.name;    //'Bob'

person.zipcode;    //null

JavaScript用一个{...}表示一个对象,键值对以xxx: xxx形式申明,用,隔开。注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。

访问属性是通过 . 操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来.

属性名middle-school不是一个有效的变量,就需要用 ' ' 括起来。访问这个属性也无法使用 . 操作符,必须用['xxx']来访问

也可以用 xiaoming['name'] 来访问 xiaoming 的 name 属性,不过 xiaoming.name 的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过 object.prop 的形式访问一个属性了。

实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型。

访问不存在的属性不报错,而是返回undefined:

由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:

如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:

如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的,因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。

hasOwnProperty()方法:判断一个属性是否是xiaoming自身拥有的,而不是继承得到的。



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容