JS基础系列(一): JS里的数据
JS数据类型
-
基本类型
number
string
boolean
undefined
null
symbol(不常用) -
引用类型
object
number类型
number就是数字类型, 支持多种写法
十进制
整数 1 2 3 4 5 6 7 8 100
小数 1.1 2.3 0.125 4.235 .5 .6 .7
科学计数法 1.35e2表示135
二进制
0b10 0b11 0b1101
八进制
0b10 0b12
十六进制
0xff 0x11 0x4a
string类型
单行字符串
用''
或者""
包含的数值, 如
'abc'
表示字符串abc
'10'
表示字符串10, 并非数字10
"d23"
表示字符串d23
''
引号之间什么都不加表示空字符串, 长度为0
' '
引号中间有空表表示一个空格字符串, 长度为1, 这点需要注意
字符串转义
某些特殊的字符会产生歧义, 这时候我们需要用转义符来表示, 比如
我们需要表示一个'
单引号字符串,如果直接输入三个引号'''
, JS就会不知道该怎么解析, 到底是前两个引号是一组, 最后一个是另外一个引号还是第一个和第三个是一组, 中间的是字符串, 通常情况下, JS对这种情况会解析为前两个是一组引号, 最后一个是多余的单引号,这样会报错, 这种情况下, 就需要借助转义符了
我们用\
后面跟一个字符表示转义,比如刚才的情况, 我们可以下写成'\''
, 这样JS就会把\
后面紧跟的那个符号解析成字符了
这里需要注意\'
的长为1, \
不占长度的
下面列出JS常用转义符
符号 | 功能 |
---|---|
\' |
单引号字符串 |
\" |
双引号字符串 |
\& |
和号字符串 |
\\ |
反斜杠字符串 |
\n |
换行 |
\r |
回车 |
\t |
制表 |
\b |
退格 |
\f |
换页 |
多行字符串
当我们需要输入多行字符串的时候我们可以用以下方法
let a = '12334\
dfdfdfdsf\
fdfddf'
let b = "dffdfdf\
ddf1111\
dfdffdf"
这里需要注意\
后面必须紧跟着输入回车键, 不能有空格等任何字符, 不然JS会报错
模板字符串
ES6引入了模板字符串, 这个使得字符串更容易输出了
模板字符串使用两个``符号(键盘上数字1旁边那个键)包裹字符串,
比如上面的多行字符串, 我们可以不用转义符号
let a = `asdfd
cvvbf`
这里有个坑, a的长度是11, 因为回车也被认为是一个字符
模板字符串里还可以包含变量, 变量在模板字符串中用${变量名}
表示
let a = 'hello'
let b =`${a} world`
//输出结果为hello world
boolean类型
boolean只有两个值true
和false
, 用来判断逻辑真和假的值, 比如我们常用的if语句的判断条件
let a =3
if(a < 3) {
console.log(1)
} else if(a>2) {
console.log(2)
}
//打印出2, 因为a<3的值是false, a>2的值为true所以执行条件为a>2的语句
&&
与||
&&
表示逻辑与, 表达式中有一个值为false, 则整个表达式的值为false
true && true = true
true && false = false
false && false = false
||
表示逻辑或, 表达式中有一个值为true, 整个表达式的值为true
true || true = true
true || false = true
false || false = false
null类型和undefined类型
这两个类型都是只有一个值, 都表示什么也没有, 为什么表示什么也没有会有两个值呢, 大家可以理解为这是js设计的一个bug, 下面来说下这两个值得细微差别
- 如果一个变量没赋值, 则是undefined
- 有一个对象object, 暂时不想赋值, 可以给个null,
- 基于以上两点, 我们可以认为null是空对象, undefined是空的基本类型
请记住上面三点即可
object类型
object就是对象, 表示一个哈希表, 对象里面可以包含若干个简单类型及复杂类型的键值对
let obj = {
name: 'Adam', //string类型
age: 25, //number类型
gender: 'male' //string类型
}
obj.name //输出Adam
obj.age //输出25
obj.job //输出undefined, 没有定义
obj['name'] //等同于obj.name, 输出Adam
上面的例子应该很好理解, 但是这里有一个需要注意的obj.name中的name并不是变量而是字符串实际上就是'name', 假设我们有以下代码
let a = 'name'
let obj = {
name: 'Adam',
age: 25,
gender: 'male'
}
obj.a // 这里打出的是undefined, 因为a是字符串'a', 而不是变量a
obj[a] //这个可以打出Adam
我们对象里面可以再添加对象吗, 答案是可以
let obj = {
name: 'Adam', //string类型
age: 25, //number类型
gender: 'male', //string类型
son: {
name: 'Tomy',
age: 2,
gender: 'male'
}
}
obj.son.name //输出Tomy
bbj.son.age //输出2
我们甚至还能添加个空字符串当key
let obj = {
name: 'Adam', //string类型
age: 25, //number类型
gender: 'male', //string类型
son: {
name: 'Tomy',
age: 2,
gender: 'male'
},
'': 'blank'
}
这里还有一点需要注意, 对象的key也是可以加引号的, 不加引号的情况下, key必须符合js的命名规则, 即9a或者a b都是不合法的, 但是如果加上引号, 则'9a'和'a b'则是合法的key名称
let obj = {
9a: 'xxx', //不合法, 会报错
'9a': 'xxx' //合法, 不会报错
}
delete, in, for in 和 typeof
delete 和 in
delete用来删除对象里的内容, in用来查看键值对是否在对象中
let obj = {
name: 'Adam',
age: 25,
gender: 'male'
}
'name' in obj //true 表示obj中有name键值对
delete obj['name']
obj.name //name: 'Adame'已经被删除,所以是undefined
'name' in obj //false
for...in
for in用来遍历对象中的key,
我们有以下代码, 用来打印出obj中的key, 但是需要注意的是, 由于对象中的key是无序排列的, 所以先打出来name还是age还是gender, 这个看运气了
let obj = {
name: 'Adam',
age: 25,
gender: 'male'
}
for(let key in obj) {
console.log(key)
} //随机顺序打印出name, age, gender
typeof
用来检测变量的类型, 比如
let a = 'adf'
let b = 123
typeof a // string
typeof b // number
这里又有两个个bug
- null的typeof是object
- 函数的typeof是function