JS的基本数据类型

254 阅读4分钟

JS总共有7种数据类型。简称“四基两空一对象”。
(新版ES6语法新增了bigint,主要为了弥补number类型的精度不足问题。因此总共有8种数据类型。)

四种基本数据类型

1.number

64位浮点数。浮点数:浮动的点,小数点会乱动。符号占一位,指数占11位,有效数字占52位,共64位。

image.png 整数,小数,科学计数法,八进制写法,十六进制写法,二进制写法等都是。

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__