JavaScript里的数据类型

209 阅读5分钟

JavaScript 的数据类型,共有7种:
数值,字符串,布尔值,undefined,null,对象和symbol(ES6 新增的类型)。
注意:(NaN不是一种数据类型,它是一个特殊值,它的数据类型属于number)
数值,字符串,布尔值这三种类型又称为原始类型(最基本的数据类型,不能再分了)。
对象称为合成类型(往往是多个原始类型的合成)。
前六种又称为基本类型。

数值

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。
以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示:
(1)小数点前的数字多于21位。
(2)小数点后的零多于5个。 使用字面量(literal)直接表示一个数值时,JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
十进制:没有前导0的数值。
八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
十六进制:有前缀0x或0X的数值。
二进制:有前缀0b或0B的数值。

字符串

字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。
如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用来转义。双引号字符串内部使用双引号,也是如此。
字符串默认只能写在一行内,分成多行将会报错。
如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠(反斜杠后面只能跟换行符,跟空格或其他字符会报错)。也可以使用字符串拼接的方式把一个长字符串分成几个短字符串拼接在一起。
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始),但不能通过这种方法赋值,或增加删改字符串。
JavaScript 引擎内部,所有字符都用 Unicode 表示。 JavaScript 不仅以 Unicode 储存字符,还允许直接在程序中使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式。
每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节。

布尔值

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
undefined
null
false
0
NaN
""或''(空字符串)
补充:1.空数组,空函数,空对象(以及任何对象),对应的布尔值都是true。
2. 空字符串''和' ' (字符串里有个空格)是不一样的,空格也是字符,对应布尔值为true

undefined和null

undefined是一个表示”此处无定义”的原始值,转为数值时为NaN。
null是一个表示“空”的对象,转为数值时为0.
null表示空值,即该处的值现在为空.undefined表示“未定义”.返回undefined的典型场景:
// 变量声明了,但没有赋值
var i;
i // undefined

// 调用函数时,应该提供的参数没有提供,该参数等于 undefined
function f(x) {
return x;
}
f() // undefined

// 对象没有赋值的属性
var o = new Object();
o.p // undefined

// 函数没有返回值时,默认返回 undefined
function f() {}
f() // undefined

对象

对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
对象的所有键名都是字符串,所以加不加引号都可以。如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错。
“属性”和“方法”都是针对“健”的称呼,如果一个键的健值是函数,则一般称之为方法,如是其他数据类型,则称之为属性。 读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。

symbol

之前规定的对象的属性名必须为字符串,现在新增了Symbol类型作为属性名,用来保证每个属性的名字都是独一无二的,从根本上防止属性名的冲突。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。
Symbol 值通过Symbol函数生成。生成的 Symbol 是一个原始类型的值,不是对象。
Symbol 值不能与其他类型的值进行运算,会报错。
Symbol 值可以显式转为字符串。
Symbol 值也可以转为布尔值,但是不能转为数值。