JS数据类型

209 阅读3分钟

变量声明

三种声明方式:

  • var a = 1 过时的,不好用
  • let a = 1 新的一般用于变量声明
  • const a = 1 用于常量声明,声明时必须赋值,且不能更改

let

  • 遵循块作用域,适用范围不能超出{}
  • 不能重复声明
  • 是否赋值随意
  • 必须先声明在使用
  • 全局声明的let属性不会变成window的属性
  • for循环配合let有奇效

七种数据类型

JS一共有七种数据类型,六种简单类型,一种复杂类型

六种简单类型

  • 数字 number(以64位浮点数存储)一些特殊值
    • 0 ,+0 ,-0
    • 无穷大 :infinity ,+infinity ,-infinity
    • NaN
  • 字符串 string
    • '单引号'
    • "双引号"
    • 、`反引号` 可以加回车
  • 布尔 bool
    • true和false
    • 五个falsy值:undefined、null、0、NaN、''(空)
  • 符号 symbol
  • 空 undefined
  • 空 null

一种复杂数据类型——对象object

定义

  • 无序的数据集合
  • 键值对的集合
  • 数组、函数、日期、正则都属于对象

写法举例

  • let obj = { 'name':'hu','age':18}
  • let obj = new Object ({'name':'frank'})
  • console.log({'name':'hu','age':'18'})

细节

  • 键名是字符串不是标识符,可以包含任意字符
  • 引号可以省略,但省略后只能用标识符
  • 就算省略了引号,键名也还是字符串

属性

  • 属性名:每个key都是对象的属性名(property)
  • 属性值:每个value都是对象的属性值
  • Object.keys(obj)可以得到obj的所有key
  • Object.values(obj)可以得到obj的所有value
  • Object.entries(obj)可以得到obj的所有key和value

  • 变量作属性名
let p1 = 'name'
let obj = {p1:'hu'}   //属性名为 'p1'
let p1 = 'name'
let obj = {[p1]:'hu'}   //属性名为 'name'
    • 不加[]的属性名会自动变成字符串
    • 加了[]则会被当做变量求值
    • 值如果不是字符串,则会自动变成字符串

  • 隐藏属性
    • JS中每一个对象都有一个隐藏属性
    • 这个隐藏属性储存着其共有属性组成的对象的地址
    • 这个共有属性叫做原型

增删改查

对对象的属性进行增删改查

delete obj.xxxdelete obj['xxx']即可删除objxxx属性

  • 注意:obj.xxx === undefined不能断定xxx是否为obj的属性
  • obj含有name属性,但是值为undefinedobj2就直接没有name这个属性名
  • 可以通过in来查看是否有属性名

  • 查看自身所有属性
    • Object.keys(obj)
  • 查看自身+共有属性
    • console.dir(obj)
    • 或者依次用Object.keys打印出obj.__proto__
  • 判断一个属性是自身的还是共有的
    • obj.hasOwnProperty('toString')

  • **inhasOwnProperty**的区别
    • in可以查看是否含有某属性,但是不可以区分是自身属性还是共有属性
    • hasOwnProperty可以判断一个属性是自身的还是共有的

改和增

  • 直接赋值

    • let obj = {name:'hu'} //name是字符串
    • obj.name = 'hu' //name是字符串
    • obj['name'] = 'hu' //name是字符串
    • obj[name] = 'hu' //错,name是变量
    • obj['na'+'me'] = 'hu' //
    • let key = 'name'; obj[key] = 'hu' //
    • let key = 'name'; obj.key = 'hu' //错 obj.key等价于obj['key'],而obj[key]是变量
  • 批量赋值

    • Object.assign(obj,{age:18,gender:'man'})
  • 修改或增加共有属性

    • 无法通过自身修改或增加共有属性
    • let obj ={},obj2={}    //obj和obj2共有toString
      obj.toString = 'xxx'   //只会改obj自身属性
      obj2.toString还在原型上
      

  • 原型隐藏属性也可以改,但是不推荐改,所以这里就不写了

原型

  • 每个对象都有原型
  • 原型里存着对象的共有属性
    • 比如:obj的原型就是一个对象,obj.__proto__存着这个对象的地址
    • 这个对象里有toString/constructor/valueOf等属性
  • 对象的原型也是对象
  • 所以对象的原型也是对象
  • obj = {}的原型即为所有对象的原型
  • 这个对象包含所有对象的共有属性,是对象的根
  • 这个原型也有原型,是null