JavaScript 共有7种数据类型,分别是
- 数值(number):整数和小数如 1,1.2等
- 字符串(string):文本如 “JavaScript”等
- 布尔值(boolean):只有两个值 true(真)false(假)
- undefined:表示“未定义”,空或不存在
- null:表示空值
- 对象(object):各种值组成的集合
- symbol:es6的新增数据类型,这里不做介绍
使用typeof
获取数据类型,需要注意的是函数的数据类型输出虽然是“function”,但其数据类型是“object”,null
的类型输出虽是object
,但实际上是null
// 查看数据类型
typeof 1
"number"
typeof 'hi'
"string"
typeof false
"boolean"
typeof undefined
"undefined"
typeof null
"object"
typeof {}
"object"
typeof []
"object"
typeof function(){}
"function"
typeof Symbol()
"symbol"
undefined 和 null
两者实际上都表示没有(也许可以说是一种设计错误了),而undefined则一般出现在未赋值的变量,未定义的属性,无返回值的函数返回值(或返回值是未传入的参数),下面是输出参考:
// 未赋值变量
var x
undefined
x
undefined
// 无返回值
(function() {return})()
undefined
// 返回值是未传入的参数
(function(unpass) {return unpass})()
undefined
// 未定义属性
var emptyObj = {}
undefined
emptyObj.prop
undefined
// == 情况下与null相等
undefined == null
true
// bool判断
Boolean(null)
false
Boolean(undefined)
false
// 代表数值
Number(null)
0
Number(undefined)
NaN
boolean
布尔值,只有true
和false
两种状态,只有在以下几种情况下才会判断为false
- undefined
- null
- false
- 0
- 非数字:NaN
- 空字符串:
""
或''
或 ``
Boolean(NaN)
false
Boolean(undefined)
false
Boolean(null)
false
Boolean(0)
false
Boolean(-1)
true
Boolean('')
false
Boolean("")
false
Boolean(``)
false
number
JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。
1 === 1.0
true
数字的表示和进制
// 次方
Math.pow(2, 3)
8
// 科学计数法
2e3
2000
2 * Math.pow(10, 3)
2000
// Number 可表示的范围
Number.MAX_VALUE
1.7976931348623157e+308
Number.MIN_VALUE
5e-324
// 16进制
0x10
16
// 8进制
0o10
8
// 2进制
0b10
2
// 不建议的8进制表示法,以0开头(浏览器为兼容旧代码的处理,将以0开头的数字识别为8进制,在es5的严格模式和es6中已废除)
010
8
NaN(Not a Number),NaN与任何数(包括它自己)的运算,得到的都是NaN。
// NaN的判断
typeof NaN
"number"
NaN === NaN
false
isNaN(NaN)
true
// 运算
NaN + 1
NaN
NaN + NaN
NaN
Infinity,无穷,有正无穷和负无穷
1 / 0
Infinity
1 / -0
-Infinity
parseInt,通常用于将字符串转换为整数;parseFloat,通常用于将一个字符串转为浮点数
parseInt('9')
9
// 先转字符串再parse
parseInt(9)
9
// 2进制输出10进制
parseInt('1000', 2)
8
// 超出进制范围
parseInt('2', 2)
NaN
isFinite,用于检查值是否是一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。
isFinite(Infinity)
false
isFinite(-Infinity)
false
isFinite(NaN)
false
isFinite(undefined)
false
isFinite(null)
true
isFinite(-1)
true
object
对象,JavaScript中最重要的也是最常用的数据类型。与Python中的字典有类似之处。简单的说就是键值不重复的键值对。
// 定义
var obj = {}
// 属性赋值
obj.foo = 'foo'
obj['bar'] = 'bar'
obj
{foo: "foo", bar: "bar"}
// 属性获取
obj.foo
"foo"
obj['bar']
'bar'
// 属性删除
delete obj.foo
true
obj
{bar: "bar"}
// 查看属性
Object.keys(obj)
["bar"]
// 判断是否包含属性
'bar' in obj
true
'foo' in obj
false
// 遍历属性
for (var attr in obj) {
console.log(typeof attr, attr)
console.log(typeof obj[attr], obj[attr])
}
string bar
string bar
string
字符串,即文本。
// 定义与表示
var
hiText = 'hi',
specialCharacterText = 'say \'hi\'', // “\”用于符号转义 使用“\\”表示“\”
multiLineText = 'a' // 多行字符串,
+ 'b'
unicodeText = '\u4f60' // unicode表示
我们还需要知道,每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节。
但是,UTF-16 有两种长度:对于码点在U+0000到U+FFFF之间的字符,长度为16位(即2个字节);对于码点在U+10000到U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD800到0xDBFF之间,后两个字节在0xDC00到0xDFFF之间。举例来说,码点U+1D306对应的字符为𝌆,它写成 UTF-16 就是0xD834 0xDF06。
JavaScript 对 UTF-16 的支持是不完整的,由于历史原因,只支持两字节的字符,不支持四字节的字符。这是因为 JavaScript 第一版发布的时候,Unicode 的码点只编到U+FFFF,因此两字节足够表示了。后来,Unicode 纳入的字符越来越多,出现了四字节的编码。但是,JavaScript 的标准此时已经定型了,统一将字符长度限制在两字节,导致无法识别四字节的字符。上一节的那个四字节字符𝌆,浏览器会正确识别这是一个字符,但是 JavaScript 无法识别,会认为这是两个字符。
'𝌆'.length
2
参考链接:
阮一峰JavaScript教程