JS的数据类型

184 阅读4分钟

七种数据类型

number :64位浮点数,

整数,小数,科学计数法,八进制写法,十六进制写法,二进制写法

正0和负0不一样,和0也不一样

无穷大,1/0,infinity,1/-0:-infinity

无法表达的数字:NaN(not a number)表示因为知识受限而无法表示的数字,它是一个数字

0/0 NaN 不等于自身

浮点数:浮动的点,小数点会乱动

1636079029759.png

符号占一位,指数占11位,有效数字占52位。

(忽略符号位)

Number.MAX_VALUE:1.7976931348623157e+308

Number.MIN_VALUE: 5e-324

精度:大于16位有效数字的数字且大于90开头存不下来,2的52次方


string :字符串

每个字符两个字节。

单引号、双引号、反引号。引号不属于字符串的一部分。

转义 'it\'s ok.' 或者交替使用。

'\u4f60' 就是'你',表示对应的Unicode字符

'\xFF'是前256个Unicode字符

用反引号包字符串,可以直接打回车。

字符串的属性:(不应该有,只有对象才能有属性)

string.length(`\n\t\r`)   //3

空字符串和一个空格字符串长度不一样,分别为0、1。

string[index]           //从0开始,到n-1

btoa('string') 编码 反编码atob

bool

true false

if 配bool

if value不是bool怎么办。

五个falsy值(两个空,两个数字,一个字符串)

null undefined 0、NaN ''


symbol


null

undefined

本质上没有区别。

undefined:默认的空。

如果一个变量声明了但没有赋值,默认为undefined

如果一个函数没有写return,默认返回undefined

习惯将非对象的值写为undefined,把对象的空值写为null


object(对象),唯一一种复杂类型

  • 无序的数据集合
  • 键值对的集合

声明方法:

let obj={'name': '111', 'age': '18'}
let obj =  new Object({'name': '111'})
console.log ({'name': '111', 'age': '18'})
Object.keys(obj)  //得到obj的所有key

键名是字符串,不能是标识符,可以包含任意字符

引号是可以省略的,省略之后就只能写标识符(不能以数字开头),没有数字下标,没有数字key。

属性名:属性值

加引号是最安全的键值写法。

​ 如果key为1e2、0xFF,JS会先计算。

变量作为属性名:

let a = 'xxx'

let obj = {
[a]: 111    //不加[]的属性名会自动变成字符串,加了的会当做变量求值
}

对象的隐藏属性 (共有属性)

__proto__

隐藏属性储存着原型的地址。

共有属性组成的对象叫做原型。

对象的增删改查

删除属性

let obj = {name:'simon',age: '18'}
obj.name = undefined                     //删的是属性值
delete obj.name                 
delete obj['name']                       //删的是属性名
'name' in obj                            //检查删除是否成功
'name' in obj &&obj.name === undefined   //含有属性名,但是值为undefined

判断属性名是否在对象中只能用 in

没有就是没有,undefined就是undefined

读属性

Object.keys(obj1)               //查看自身所有属性
Object.value(obj1)
console.dir(obj1)               //除了自身属性害可以看公有属性,以目录的形式打出来
obj1.hasOwnProperty('toString') //false 该属性不是自身的,而是共有的

原型

每个对象都有原型,原型里存着对象的共有属性。

对象的原型也是对象。是对象的根。

原型的原型是空(null)。

查看属性

let obj = {name: '1'; age: '18'}
obj['name']                         //优先 中括号中的字符串都有引号
obj.name
obj[name]                           //undefined  是一个变量
obj['na'+'me']                      //  '1'
obj[console.log('name')]            //undefined ,会打印出'name',log的返回值是undefined

修改或增加属性

直接赋值

let obj = {name: 'frank'} // name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank' 
obj[name] = 'frank' // 错,因 name 值不确定
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

也可以将原型改掉,其实是在原原型对象上创建一个父元素,名字也为__proto__

let person = Object.create(common)//以common为原型创建person

改和增不会看原型链,查的时候会看。