JS总共有7种数据类型。简称“四基两空一对象”。
(新版ES6语法新增了bigint,主要为了弥补number类型的精度不足问题。因此总共有8种数据类型。)
四种基本数据类型
1.number
64位浮点数。浮点数:浮动的点,小数点会乱动。符号占一位,指数占11位,有效数字占52位,共64位。
整数,小数,科学计数法,八进制写法,十六进制写法,二进制写法等都是。
tips
- 正0和负0不一样,和0也不一样。
- 无穷大分正负:1/0,infinity,1/-0:-infinity。
- 无法表达的数字:NaN(not a number)表示因为知识受限而无法表示的数字,它是一个数字。
- NaN !== NaN。
- 精度:大于16位有效数字的数字且大于90开头存不下来,2的52次方.
Number.MAX_VALUE:1.7976931348623157e+308
Number.MIN_VALUE: 5e-324
2.string :字符串
每个字符两个字节。单引号、双引号、反引号括起来表示。引号不属于字符串的一部分,引号内才是。
字符串的属性:(不应该有,只有对象才能有属性)
string.length(`\n\t\r`) //3
空字符串和一个空格字符串长度不一样,分别为0、1。
tips
- 用反引号包字符串,直接打回车,可以实现回车换行的效果。
btoa('string') //反编码atob
3.bool
true false
五个falsy值(两个空,两个数字,一个空字符串) null、undefined、''、NaN、0
4.symbol
符号。暂时了解较少。
两种空类型
本质上没有区别。
习惯将非对象的值写为undefined,把对象的空值写为null。
console.log(null==undefined)//true
console.log(null===undefined)//false
tips
转为数值时,值不一样,undefined转为数值NaN,null转为数值0。
1. null
null表示"没有对象",即该处不应该有值。
典型用法是:
- 作为函数的参数,表示该函数的参数不是对象。
- 作为对象原型链的终点。
2.undefined
undefined:表示"缺少值",就是此处应该有一个值,但是还没有定义。
典型用法是:
- 变量被声明了,但没有赋值时,就等于undefined。
- 调用函数时,应该提供的参数没有提供,该参数等于undefined。
- 对象没有赋值的属性,该属性的值为undefined。
- 函数没有返回值时或者return后面什么也没有,返回undefined。
3.object(对象),唯一一种复杂类型
定义:
- 无序的数据集合。
- 键值对的集合。
声明方法:
let obj={'name': 'aaa', 'age': '18'}
let obj = new Object({'name': 'aaa', 'age': '18'})
console.log ({'name': 'aaa', 'age': '18'})
Object.keys(obj) //得到obj的所有key
键名是字符串,不能是标识符,可以包含任意字符。
引号是可以省略的,省略之后就只能写标识符(不能以数字开头),没有数字下标,没有数字key。
用变量做属性名:
let a = 'xxx'
let obj = {
[a]: 111 //不加[]的属性名会自动变成字符串,加了的会当做变量求值
}
如果属性名不是字符串,会自动变成字符串。
对象的隐藏属性 (共有属性),隐藏属性储存着原型的地址。共有属性组成的对象叫做原型。
tips
- 加引号是最安全的键值写法。
- 如果key为1e2、0xFF等,JS会先计算。
- symbol也能做属性名。
删除属性
let obj = {name:'zach',age: '18'}
obj.name = undefined //删的是属性值
delete obj.name
delete obj['name'] //删的是属性名
'name' in obj //检查删除是否成功
'name' in obj &&obj.name === undefined //含有属性名,但是值为undefined
查看属性
`'xxx' in obj` //查看xxx属性是否在obj内
Object.keys(obj) //查看自身所有属性
obj.key
Object.value(obj)
console.dir(obj) //除了自身属性害可以看公有属性,以目录的形式打出来
obj1.hasOwnProperty('xxx') //false 该属性不是自身的,而是共有的
没有就是没有,undefined就是undefined,含义不一样。
修改、增加属性
直接赋值
let obj = {name: 'frank'}
obj.name = 'frank'
obj['name'] = 'frank'
obj['na'+'me'] = 'frank'
let key = 'name'; obj[key] = 'frank' // 通过声明一个变量来进行赋值
let key = 'name'; obj.key = 'frank' // 错,因为 obj.key 等价于 obj['key'],不是变量
批量赋值
Object.assign(obj, {age: 18, gender: 'man'}) //第一个参数是要赋值对象的名字,第二个是赋值的东西
修改共有属性
obj.__proto__.toString = 'xxx' //可以修改,但不推荐
window.Object.prototype.toString //如果一定要修改,推荐这种方法
obj.__proto__ = null//删除了原型
let person = Object.create(common)//以common为原型创建person。其实是在原原型对象上创建一个父元素,名字也为__proto__