js基础整理--变量(基本类型,object类型,变量的存储、复制、类型检测)

187 阅读4分钟

最近在重读红宝书。参考红宝书、MDN和一些网上的资料在整理基础知识,就随手总结下来。这是第一篇--js变量

数据类型

基本数据类型

Undefined

  1. 已声明未初始化的变量

    • 变量的类型是undefined
    • 变量的默认为undefined
  2. 未声明的变量

    • 变量的类型是undefined
    • 变量没有值,使用时报错
    • 未声明的变量只能执行typeof操作符,其他操作都会报错
  3. e.g.

    var a;
    var b = undefined;
    alert(a) //undefined
    alert(b) //undefined
    alert(c) //报错
    
    alert(typeof a) //undefined
    alert(typeof b) //undefined
    alert(typeof c) //undefined
    

Null

  1. null是一个空对象指针 alert(typeof null) //object
  2. null的作用:当需要指定一个变量为对象而该对象暂时没有值时可以先定义为空指针,以便通过检查该对象是否为null来确定该对象是否有值

Boolean

  1. true/false区分大小写
  2. 其他类型转换为boolean类型:Boolean(变量名)
数据类型 true false
string 非空
number 非0 0和NaN
Object 非null null
undefined - 全部
undefined - 全部

Number

  1. 进制

    • 十进制
    • 八进制 +0 严格模式下无效
    • 十六进制 +0x
  2. 浮点数

    • 浮点数的表示
      (1) 整数部分.小数部分
      (2) e表示法
    • 浮点数转整数:
      (1) .后无内容
      (2) 本身就是整数,如1.0
    • 浮点数的误差
      0.1+0.2不等于0.3
  3. NaN

    • 作用:当number类型相关数据运算发生错误时
    • NaN与任何值不想等,包括NaN
    • 函数isNaN(变量):判断该变量是不是NaN

    总结:undefined、null、NaN

    name undefined null NaN
    typeof undefined object number
    表示 任意声明未赋值的变量 对象为空 number发生错误
    赋值 无需手动赋值 需要手动赋值
    数据类型 数据类型 Number的一个值
  4. 其他类型转换成Number

    • null:0
    • undefined:NaN
    • boolean:0/1
    • string:
    函数 Number() parseInt() parseFloat()
    转换类型 任意 整型 浮点型
    转换空字符串 0 NaN NaN
    前面数字后面字符
    如"123qwe"
    NaN 转换到最后一个数字
    123
    转换到最后一个数字
    123
    前面字符+后面任意 NaN NaN NaN
    前面0+后面其他数字 0后的数字 0后的数字 0后的数字
    带一个小数点 转换成浮点型 只转小数点前部分 转换成浮点型
    十六进制
    0x前缀
    转16进制 转16进制 不转,0
    八进制
    0前缀
    忽略0 不一定 忽略0
    参数 一个 (两个变量,进制)/一个 一个

    注:parseInt()可以传两个参数,第一个是要转换的值,第二个指定进制,最好传两个参数,手动指定进制

  5. Number的范围

String

字符串的值不可变
并不是说变量中保存了字符串,该变量就不能变了而是字符串不能做改变
如果要增加某字符串的内容,不是直接在原来的字符串上修改,而是改成新字符串后销毁原来的字符串

Object类型

  1. 数据和功能的集合

  2. 可以动态添加/删除/修改对象里的属性

    var o = new Object() // 定义一个object
    o.name = 'name1' // 添加属性
    o.name = 'name2' // 修改属性值
    delete o.name // 删除属性
    
    
  3. (object的内容很多,整理在后面的笔记里)

数据类型检测

typeof操作符

  1. 语法typeof 变量
  2. 返回值:undefined,boolean,string,number,object,function
  3. null:返回object
  4. function:有的浏览器返回function有的返回object;因为js中函数是对象,而不是数据类型
  5. 可检测所有类型
  6. object类型检测不准确,只能知道是object类型,不能知道是object的什么类型

instanceof操作符

  1. 语法 变量 instanceof 某个引用类型
  2. 作用:准确检测某个object类型的变量是什么类型的object
  3. 不能用于基本类型检测,检测基本类型都会返回false
  4. 检测的object类型:js的内置对象(Array,RegExp),自定义类型
```
var a = null
a instanceof Object // false
```

变量的存储

基本类型

存储在栈内存

引用类型

  1. 引用类型的值:堆内存
  2. 变量标识符(存堆内存的地址):栈内存

变量的复制

基本类型

将原来的变量拷贝一个副本到新的变量,两个变量改变值互不影响

对象类型

浅拷贝

复制变量标识符到新的变量,两个变量指向同一个堆内存;改变其中一个,另一个会受影响
实现
直接赋值var b = a

深拷贝

在堆中重新分配内存,新的变量和原来的互不影响

  1. JSON.stringify()

  2. JSON.parse()

  3. 遍历对象中的每一个值到新的对象中

  4. (数组深拷贝)concat() concat()的作用:连接两个数组并返回新数组arr1.concat(arr2)

    var arr = [1,2,3]
    var arrNew = arr.concat()
    
  5. (数组深拷贝)slice()
    slice()的作用:截取数组的一部分并返回新数组
    arr1.slice(start,end) //截取数组从slice到end的部分(包括start,不包括end)
    深拷贝:

     ```
     var arr = [1,2,3]
     var arrNew = arr.slice(0)
     ```