7种数据类型
数值/数字(number):整数和小数
字符串(string):文本
布尔(boolean):两个特殊值表示 true 和 false
符号(symbol)
null:空值
undefined:未定义 不存在
对象(object):各种值组成的集合,除上述六种之外的数据都是对象
前6种为基本(简单)类型,对象为复杂类型。
数值/数字(number)
十进制
没有前导 0 的数值
1
1.1 // .1
1.23e2 // 123 e大小写都可
二进制
0b
或者 0B
开头
0b1 // 1
0B10 // 2
八进制
前导 0 开头且只有 0-7 八个阿拉伯数字的数值,或者 0o
和 0O
开头
011 // 9
使用注意:比如用一个变量来表示电话号码(01开头),如果用数值来存,系统可能会默认当做八进制数值,所以当遇到这种情况,应该以字符串的形式来存电话号码。
十六进制
0x
或者 0X
开头
0x11 // 17
字符串(string)
放在 ''
或者 ""
之中
"hello"
'hello'
可以是空字符串
"" // length: 0
''
也可以是空格字符串
" " // length: 1
' '
注意
-
单引号字符串内部可以使用双引号,反之亦然
'"' // 表示单个双引号的字符串 "'" // 表示单个单引号的字符串 ''' // unexpected token
-
单引号字符串内部如要使用单引号,则必须添加反斜杠来转义,双引号字符串内部要用双引号,也是这样
'\'' // 表示单个单引号的字符串 "\"" // 表示单个双引号的字符串
-
转义符的日常应用
转义符 含义 \0
(\u0000
)null \b
(\u0008
)后退键 \f
(\u000C
)换页符 \n
(\u000A
)换行符 \r
(\u000D
)回车键 \t
(\u0009
)制表键 \v
(\u000B
)垂直制表符 \'
(\u0027
)单引号 \"
(\u0022
)双引号 \\
(\u005C
)反斜杠 -
多行字符串 (不是字符串内部)
类似命令行
var s = '12345 \ 67890'; // '12345 67890' // 该换行方式不推荐使用,如果 \ 后有空格则会报错 // 会被认为给空格转义 var s ='12345 67890'; // unexpected token var s = '12345 ' + '67890'; // '12345 67890' var s = '12345 ' + '67890'; // '12345 67890'
-
多行字符串 (字符串内部)
var s = `12345 67890`; // ES6 新语法,反引号内可表示多行字符串 // 注意每行开头和结尾的空格 // 此处5后无空格,6前有一个空格 // '12345 // 67890' // s.length 为 12,10个数字,1个回车,1个空格
-
布尔(boolean)
取值:
true
和false
-
a && b
运算a
和·b
都为true
,a && b
为true
-
a || b
运算a
和·b
都为false
,a || b
为false
null 和 undefined
变量没有值,则为 undefined
使用惯例:`
-
有一个对象(object),但现在不想赋值,推荐
null
,表示空对象var obj = null
-
有一个非对象,,但现在不想赋值,推荐
undefined
,表示空非对象var n
对象(object)
复杂类型数据,简单说就是是由前6种简单类型数据组成的,许多 key: value
的集合。
键名 (key)
键名 key
又可以称为属性 property
举例
var obj = {
line1: 'hello',
line2: 'world',
line1line2: '表达式',
'9a': '键名不符合标识符',
9: '键名是数字',
'': '空字符串键名',
'a b': '含空格键名',
'a+b': '含运算符键名'
}
// 冒号左边是 key 是字符串,会被自动转成字符串
// 无论是否有引号,可以省略
// key 如果不符合标识符且不是数字,则必须加引号不然报错
// ES6 引入了 Symbol值也可以作为 key
// 冒号右边是 value 如果有引号,不能省略
读取属性
如果要取出 line2
这个key
的 value
, 我们可以使用方括号运算符([]
),此时不能省略 key
的单引号,否则会被当变量处理
obj['line2'] // 'world'
var line2 = 'line1'
obj[line2] // 'hello'
// 引号不能省略,这里line2被看做了变量
obj['line1' + 'line2'] // '表达式'
// 键名等价于 'line1line2'
obj[3+6] // '键名是数字'
// 键名等价于 '9'
obj[9 + 'a'] // '键名不符合标识符'
// 键名等价于 '9a'
// [] 内可以用表达式,数字可以不加引号,会自动转化成字符串
如果键名符合标识符的条件,上述读取 line2
属性,我们可以使用点运算符 (.
)
obj.line2 // 等价于 obj['line2']
赋值属性
我们同样可以用方括号运算符([]
)和点运算符 (.
)来进行赋值。
var obj = {};
obj.name = 'xxx';
// 属性赋值不需要属性已经存在
// 可已随时增加新属性
删除属性
delete obj.line2 // ture 同时删除 key 和 value
obj.line2 // undefined 没有键值
'line2' in obj // false 没有键名
var obj.line2 = undefined // 只删除键值
obj.line2 // undefined 没有键值
'line2' in obj // true 键名仍旧存在
遍历属性(key)
for (var key in obj) {
console.log(key)
}
// 打印key
for (var key in obj) {
console.log(key,obj[key])
}
// 打印key和value,注意这里key是变量
// 所以不能写成 obj.key或者 obj['key']
注意点:
in
运算符检查的是属性而不是键值,存在返回true
,反之false
-
for (var key in obj) {}
循环遍历的属性必须是可遍历的,同时不仅遍历对象自身的属性同时遍历继承的属性
查看属性
使用 Object.keys
来查看对象的所有属性
var obj = {
line1: 'hello',
line2: 'world'
}
Object.keys(obj); // ["line1", "line2"]
键值 (value)
键值 value
可以是任何数据类型,不单单是字符串
var obj = {
testBoolean: true,
testNumber: 10,
testString: 'hello world',
testNull: null,
testUndefined: undefined,
testSymbol: Symbol('a'),
testObject: {name: 'XXX', age:20, male: true},
self: obj
}
typeof 运算符
返回一个值的数据类型
// 1. 数值 number
typeof 1 // 'number'
// 2. 字符串 string
typeof '1' // 'string'
// 3. 布尔值 boolean
typeof true // 'boolean'
// 4. undefined
typeof undefined // 'undefined'
// 5. 对象 object
typeof {} // 'object'
typeof [] // 'object'
// 6. null
typeof null // 'object'
// 7. 符号 symbol
typeof Symbol() // 'symbol'
// 8. 函数 function
function f(){}
typeof f // 'function'
typeof Symbol // 'function'
// 9. 未声明的变量
g // Error: g is not defined
typeof g // 'undefined' 不会报错