JS基础总结深入

1.数据类型

基本数据类型

String:任意字符串,Number:任意数字,Boolean:true 和 false,undefined,null。

引用数据类型

也就是对象,Object(无序),注意两种特殊的对象:

Function:函数对象,特点可以执行

Array:数组对象,特点有序

判断方式

判断数据类型有三种方式:

1. typeof:返回数据类型的字符串表达式

可以判断: undefined/ 数值 / 字符串 / 布尔值 / function

不能判断: null与object object与array

2.instanceof:A 是不是 B 的实例对象,判断对象的具体类型

3.===(全等), 可以判断: undefined, null

<script type="text/javascript">
  //1. 基本
  // typeof返回数据类型的字符串表达
  var a
  console.log(a, typeof a, typeof a==='undefined',a===undefined )  // undefined 'undefined' true true
  console.log(undefined==='undefined')
  a = 4
  console.log(typeof a==='number')
  a = 'atguigu'
  console.log(typeof a==='string')
  a = true
  console.log(typeof a==='boolean')
  a = null
  console.log(typeof a, a===null) // 'object'

  console.log('-----------------')
  //2. 对象
  var b1 = {
    b2: [1, 'abc', console.log],
    b3: function () {
      console.log('b3')
      return function () {
        return 'xfzhang'
      }
    }
  }

  console.log(b1 instanceof Object, b1 instanceof Array) // true  false
  console.log(b1.b2 instanceof Array, b1.b2 instanceof Object) // true true
  console.log(b1.b3 instanceof Function, b1.b3 instanceof Object) // true true

  console.log(typeof b1.b2, '-------') // 'object'

  console.log(typeof b1.b3==='function') // true

  console.log(typeof b1.b2[2]==='function')
  b1.b2[2](4)
  console.log(b1.b3()())

三个重要问题:

1. undefined与null的区别?

  * undefined代表定义未赋值

  * nulll定义并赋值了, 只是值为null

2. 什么时候给变量赋值为null呢?

  * 初始赋值, 表明将要赋值为对象

  * 结束前, 让对象成为垃圾对象(被垃圾回收器回收)

3. 严格区别变量类型与数据类型?

  * 数据的类型

    * 基本类型

    * 对象类型

  * 变量的类型(变量内存值的类型)

    * 基本类型: 保存就是基本类型的数据

    * 引用类型: 保存的是地址值

 

2.变量内存关系

1. 什么是数据?

  * 存储在内存中代表特定信息的'东东', 本质上是0101...

  * 数据的特点: 可传递, 可运算

  * 一切皆数据

  * 内存中所有操作的目标: 数据

    * 算术运算、逻辑运算、赋值、运行函数

2. 什么是内存?

  * 内存条通电后产生的可储存数据的空间(临时的)

  * 内存产生和死亡: 内存条(电路版)==>通电==>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失

  * 一块小内存的2个数据

     * 内部存储的数据

     * 地址值

  * 内存分类

    * 栈: 全局变量/局部变量

    * 堆: 对象

3. 什么是变量?

  * 可变化的量, 由变量名和变量值组成

  * 每个变量都对应的一块小内存, 变量名用来查找对应的内存, 变量值就是内存中保存的数据

4. 内存,数据, 变量三者之间的关系

  * 内存用来存储数据的空间

  * 变量是内存的标识

关于引用变量赋值问题

  * 2个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 另一个变量看到的是修改之后的数据(浅拷贝)

  * 2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象,其实此时有了三个对象

<script type="text/javascript">
  var obj1 = {name: 'Tom'}
  var obj2 = obj1
  obj2.age = 12
  console.log(obj1.age)  // 12
  function fn (obj) {
    obj.name = 'A'
  }
  fn(obj1)
  console.log(obj2.name) //A


  var a = {age: 12}
  var b = a
  a = {name: 'BOB', age: 13}//此时有了第三个对象
  b.age = 14
  console.log(b.age, a.name, a.age) // 14 Bob 13

  function fn2 (obj) {
    obj = {age: 15}
  }
  fn2(a)

  console.log(a.age)
</script>

问题: JS引擎如何管理内存?

1. 内存生命周期

  * 分配小内存空间, 得到它的使用权

  * 存储数据, 可以反复进行操作

  * 释放小内存空间

2. 释放内存

  * 局部变量: 函数执行完自动释放

  * 对象: 成为垃圾对象==>垃圾回收器回收

 

3.对象

1. 什么是对象?

  * 多个数据的封装体

  * 用来保存多个数据的容器

  * 一个对象代表现实中的一个事物

2. 为什么要用对象?

  * 统一管理多个数据

3. 对象的组成

  * 属性: 属性名(字符串)和属性值(任意)组成

  * 方法: 一种特别的属性(属性值是函数)

4. 如何访问对象内部数据?

  * .属性名: 编码简单, 有时不能用

  * ['属性名']: 编码麻烦, 能通用

问题: 什么时候必须使用['属性名']的方式?

  1. 属性名包含特殊字符: - 空格

  2. 属性名不确定

var p = {}
  //1. 给p对象添加一个属性: content type: text/json
  // p.content-type = 'text/json' //不能用
  p['content-type'] = 'text/json'
  console.log(p['content-type'])

  //2. 属性名不确定
  var propName = 'myAge'
  var value = 18
  // p.propName = value //不能用
  p[propName] = value
  console.log(p[propName])

4.函数(回调函数、立即执行函数)

 

1. 什么是函数?

  * 实现特定功能的n条语句的封装体

  * 只有函数是可以执行的, 其它类型的数据不能执行

2. 为什么要用函数?

  * 提高代码复用

  * 便于阅读交流

3. 如何定义函数?

  * 函数声明

  * 表达式

4. 如何调用(执行)函数?

  * test(): 直接调用

  * obj.test(): 通过对象调用

  * new test(): new调用

  * test.call/apply(obj): 临时让test成为obj的方法进行调用

回调函数

1. 什么函数才是回调函数?

  1). 你定义的

  2). 你没有调

  3). 但最终它执行了(在某个时刻或某个条件下)

2. 常见的回调函数?

  * dom事件回调函数 ==>发生事件的dom元素

  * 定时器回调函数 ===>window

  * ajax请求回调函数

  * 生命周期回调函数

 立即执行函数

1. 理解

  * 全称: Immediately-Invoked Function Expression

2. 作用

  * 隐藏实现

  * 不会污染外部(全局)命名空间

  * 用它来编码js模块

 (function () { //匿名函数自调用
    var a = 3
    console.log(a + 3)
  })()
  var a = 4
  console.log(a)

  ;(function () {
    var a = 1
    function test () {
      console.log(++a)
    }
    window.$ = function () { // 向外暴露一个全局函数
      return {
        test: test
      }
    }
  })()

  $().test() // 1. $是一个函数 2. $执行后返回的是一个对象

5.函数中this指向

1. this是什么?

  * 任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window

  * 所有函数内部都有一个变量this

  * 它的值是调用函数的当前对象

2. 如何确定this的值?

  * test(): window

  * p.test(): p

  * new test(): 新创建的对象

  * p.call(obj): obj

  function Person(color) {
    console.log(this)
    this.color = color;
    this.getColor = function () {
      console.log(this)
      return this.color;
    };
    this.setColor = function (color) {
      console.log(this)
      this.color = color;
    };
  }

  Person("red"); //this是谁? window

  var p = new Person("yello"); //this是谁? p

  p.getColor(); //this是谁? p

  var obj = {};
  p.setColor.call(obj, "black"); //this是谁? obj

  var test = p.setColor;
  test(); //this是谁? window

  function fun1() {
    function fun2() {
      console.log(this);
    }

    fun2(); //this是谁? window
  }
  fun1();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值