JS中值可以分为七个类型,分别是数值(number),字符串(string),布尔值(boolean),null,undefined,对象(object)和symbol(ES6新增)。
其中,数值、字符串、布尔值、undefined、null被称为基本数据类型,对象被称为复杂数据类型,即基本类型的集合,对象包括array和function。
数值(number)
JavaScript 内部,所有数字都是以64位浮点数形式储存。根据国际标准,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。
- 第1位:符号位,0表示正数,1表示负数
- 第2位到第12位(共11位):指数部分
- 第13位到第64位(共52位):小数部分(即有效数字)
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。
JavaScript 能表示的范围为2^1024到2^-1023,如果超过最大范围就会发生“正向溢出”,那么, JavaScript 无法表示这么大的数就会返回Infinity(无穷),如果小于最小范围,则会返回0。
数值的表示法
科学计数法允许字母e或E的后面,跟着一个整数,表示这个数值的指数部分。比如1.23e2表示123;
数值的进制
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
- 十进制:没有前导0的数值。
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
- 十六进制:有前缀0x或0X的数值。
- 二进制:有前缀0b或0B的数值。
默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
特殊数值
-
正负0,基本相同,只有在表示符号位时,和当做分母时的返回值不一样。
-
NaN,表示非数字,主要出现在将字符串解析成数字出错的场合,数据类型依然属于number,不等于任何值,包括自身,和任何数的运算得到的都是NaN。
-
Infinity,表示无穷,用来表示两种场景:一正值太大,或负值太小;二非0除以0,得到Infinity。有正负之分,用来计算时,Infinity和正常非零数值进行加减乘除运算时,结果都是无穷,0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity;Infinity和自身做加乘运算返回自身,做减除运算返回NaN;和null计算时,null会被转成0来计算;和undefined计算,返回的都是NaN。
数值相关全局方法
-
parseInt():用于将字符串转为整数。转换方式是从第一个字符开始一个个转换,遇到不能转换成数字的字符就停下,只返回已经转好的部分,如果第一个就不能转换,返回NaN。头部有空格时会自动去除空格再转换,如果参数不是字符串,会先转成字符砖再转换。第二位参数可选,默认十进制,如果超出进制能表示的内容就只转能转的部分并返回。
-
parseFloat():用于将字符串转换为浮点数。转换规则也是一个一个转换,碰到不能转换的就停下,如果第一个字符就不能转返回NaN,且会将空字符串转为NaN。
-
isNaN():用来判断一个值是否为NaN。但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。因此,使用isNaN之前,最好判断一下数据类型。
-
isFinite():该方法返回一个布尔值,表示某个值是否为正常的数值。
字符串(string)
字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义。双引号字符串内部使用双引号,也是如此。
字符串默认只能写在一行内,分成多行将会报错。如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
转义
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
需要用反斜杠转义的特殊字符,主要有下面这些。
- \0 :null(\u0000)
- \b :后退键(\u0008)
- \f :换页符(\u000C)
- \n :换行符(\u000A)
- \r :回车键(\u000D)
- \t :制表符(\u0009)
- \v :垂直制表符(\u000B)
- ' :单引号(\u0027)
- " :双引号(\u0022)
- \ :反斜杠(\u005C)
字符集
JavaScript 使用 Unicode 字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。
JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式,其中xxxx代表该字符的 Unicode 码点。比如,\u00A9代表版权符号。
解析代码的时候,JavaScript 会自动识别一个字符是字面形式表示,还是 Unicode 形式表示。输出给用户的时候,所有字符都会转成字面形式。
Base64 转码
所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。
JavaScript 原生提供两个 Base64 相关的方法。
- btoa():任意值转为 Base64 编码
- atob():Base64 编码转为原来的值
布尔值(boolean)
布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
null 和 undefined
null与undefined都可以表示“没有”,含义非常相似。在用法上有区别:一般使用undefined来表示一个空的非对象,用null来表示一个空的对象。
对象(object)
对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
键名
对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。如果键名是数值,会被自动转为字符串。
属性的操作
- 属性的读取
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
var obj = {
p: 'Hello World'
};
obj.p // "Hello World"
obj['p'] // "Hello World"
- 属性的赋值
点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。
var obj = {};
obj.foo = 'Hello';
obj['bar'] = 'World';
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
- 属性的查看
查看一个对象本身的所有属性,可以使用Object.keys方法。
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
// ['key1', 'key2']
- 属性的删除
delete命令用于删除对象的属性,删除成功后返回true。
var obj = { p: 1 };
Object.keys(obj) // ["p"]
delete obj.p // true
obj.p // undefined
Object.keys(obj) // []
注意,删除一个不存在的属性,delete不报错,而且返回true。
var obj = {};
delete obj.p // true
- in 运算符
in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。它的左边是一个字符串,表示属性名,右边是一个对象。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。要想判断是否为对象自身的属性,可以使用对象的hasOwnProperty方法。
var obj = {};
if ('toString' in obj) {
console.log(obj.hasOwnProperty('toString')) // false
}
- for...in 循环
for...in循环用来遍历一个对象的全部属性。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log('键名:', i);
console.log('键值:', obj[i]);
}
// 键名: a
// 键值: 1
// 键名: b
// 键值: 2
// 键名: c
// 键值: 3
for...in循环有两个使用注意点。
- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性。
with 语句
with语句的格式如下:
with (对象) {
语句;
}
它的作用是操作同一个对象的多个属性时,提供一些书写的方便。
注意,如果with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量。
with语句的一个很大的弊病,就是绑定对象不明确。
typeof方法
typeof可以返回一个值的数据类型,除了null会返回object,函数会返回function外,其他几种都会返回自身的数据类型。
网友评论