JS高级01_类型、对象、函数、Git基本操作

1. 数据类型的分类和判断

1). 基本(值)类型

Number ----- 任意数值 -------- typeof
String ----- 任意字符串 ------ typeof
Boolean ---- true/false ----- typeof
undefined --- undefined ----- typeof/===
null -------- null ---------- ===

2). 对象(引用)类型

Object ----- typeof/instanceof
Array ------ instanceof
Function ---- typeof/instanceof
  1. 数据类型分类(2大类)

  • 基本(值)类型(赋值的时候 值传递)

    • Number: 任意数值
    • String: 任意文本
    • Boolean: true/false
    • undefined: undefined
    • null: null
  • 对象(引用)类型(赋值的时候 引用传递)

    • Object: 任意对象

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      var obj = {name : 'kobe'}; 
      //obj是一个变量在栈里面 指向一个 在堆里的对象的 地址。=后面是一个对象的值

      var a = null;
      a = 123;
      var b = a;//值传递 因为此处把a指向的,即一个值赋值给了b
      b = 234;//b就改值了,不关a的事
      console. log(a); // 123


      var obj = {name: "kobe"};
      var obj2 = obj;//因为是地址的传递 指向堆里面的对象的地址了
      obj2.name = 'wade';//然后此处直接指人家里,把人名改了
      console.log(obj);//wade

      var arr = [12,3,4];
      var arr2 = arr;//引用传 arr2[1]= 234;
      console.log(arr); // [12,234,4]

    • Array: 特别的对象类型(下标/内部数据有序)

    • Function: 特别的对象类型(可执行)

  1. 判断

  • typeof:检测数据类型

    • 可以区别: string number booLean undefined object(null、array也是o) function
    • 不能区别: null与对象, 数组与一般对象
  • instanceof

    1
    A instanceof B 判断A是否是B的实例
    • 专门用来判断对象数据的类型: Object, Array与Function
  • ===

    • 可以判断: undefined和null
  1. undefined与null的区别?

  • undefined代表没有赋值,未定义

  • null代表赋值了, 只是值为null

    1
    2
    console.log(null == undefined); //true undefined来自于null
    console.log(null=== undefined); // false 类型不一样
  1. 什么时候给变量赋值为null呢?

  • var a = null //a将指向一个对象, 但对象此时还没有确定
  • a = null //让a指向的对象成为垃圾对象
  1. 严格区别变量类型与数据类型?
  • js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型
  • 变量类型:
    • 基本类型: 保存基本类型数据的变量
    • 引用类型: 保存对象地址值的变量
  • 数据对象
    • 基本类型
    • 对象类型

2. 数据,变量, 内存的理解

1
2
3
4
5
6
7
8
问题: JS引擎如何管理内存?
1. 内存生命周期
1). 分配需要的内存
2). 使用分配到的内存
3). 不需要时将其释放/归还
2. 释放内存
* 为执行函数分配的栈空间内存: 函数执行完自动释放
* 存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存

1). 什么是数据?

在内存中可读的, 可传递的保存了特定信息的'东东'
一切皆数据, 函数也是数据
在内存中的所有操作的目标: 数据

2). 什么是变量?

在程序运行过程中它的值是允许改变的量
一个变量对应一块小内存, 它的值保存在此内存中  

3). 什么是内存?

内存条通电后产生的存储空间(临时的)
一块内存包含2个方面的数据
    内部存储的数据
    地址值数据
内存空间的分类
    栈空间: 全局变量和局部变量
    堆空间: 对象 

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

内存是容器, 用来存储不同数据
变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据  

3. 对象的理解和使用

1). 什么是对象?

多个数据(对象)的集合
用来保存多个数据(对象)的容器

2). 属性组成:

属性名 : 字符串(标识)
属性值 : 任意类型

3). 属性的分类:

一般 : 属性值不是function  描述对象的状态
方法 : 属性值为function的属性  描述对象的行为

4). 特别的对象

数组: 属性名是0,1,2,3之类的索引
函数: 可以执行的

5). 如何操作内部属性(方法)

对象.属性名 = 
对象['属性名'] = 属性名有特殊字符/属性名是一个变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
对象[变量] = 此时不加单引号,直接引用了变量的值
var xxx = 'sex';
var obj = {
str: 'abc',
num: 123}
console.log(obj.str);
//对象中的key一定是字符串
obj[xxx] ='男';
console.log(obj);// {sex:'男'}!

//对象中的key一定是字符串 也就是a[]框里的就是key,自动调用了toString
console.log(num.toString());
console.log(obj1.toString());//[object Object]
var a = {}
var obj1 = {n: 2}
var obj2 = {m: 3}
a[obj1] = 4
//调用对象的时候用了toString 相当于两行a['[object Object]'] = 4,5
a[obj2] = 5
console.log(a[obj1]) // 输出多少? 5
1
2
3
var obj ={name: 'kobe'}
obj = {name : 'kobe'} //指向了一个新对象(栈里存的 堆内存的地址变了),只不过对象和刚才长得一样。
obj.name = 'wade'//这个没指向新的,只是在上面的对象属性里修改了。

4. 函数的理解和使用

1). 什么是函数?

用来实现特定功能的, n条语句的封装体
只有函数类型的数据是可以执行的, 其它的都不可以

2). 为什么要用函数?

提高复用性
便于阅读交流

3). 函数也是对象

instanceof Object===true
函数有属性: prototype
函数有方法: call()/apply()
可以添加新的属性/方法

4). 函数的调用

1一般函数 : 直接调用 函数自调用 === window.函数调用

2构造函数 : 通过new调用 实例化对象。this指向的当前构造函数的实例对象。
构造函数名可以是小写。但是一般构造函数都是首字母大写

function person(name,age) {
    this.name = name;
    this.age = age;
    this.eat = function () iconsole.log( '吃东西");}
    }
    
    var person1 = new Person( ' kobe' ,42);
    var person2 = new Person( " wade' ,38);|

​ 3回调函数 : callback 事件的回调 定时器的回调

​ 4call apply 强制改变this,我理解即指定对象调用函数。

1
2
3
4
5
6
7
var obj4 = {name: 'kobe'}
function fun3( ){
console.log(this)
}
fun3(); \\ this ---> window
fun3.call(obj4)
fun3.apply(obj4)

5). 函数中的this

this是什么?
1 一个关键字, 一个内置的引用变量

2 this本身是一个内置的变量 此变量用于指向一个对象

3 this有两种:

  • 全局this = window
    两种的例子:
1
2
3
4
5
6
    function fun() {
console.log(this);
this.name = 'kobe'//可以不写死
}

window.fun();//this 是 window
  • 局部(函数)this = 调用此函数的对象;

构造函数this = 当前构造函数的实例对象

1
2
3
new fun();//只要new了,里面的this就一定指的实例对象。这里的this是实例对象,只不过不像下面一行有接收,所以这里this显示为undefined

//fun 其实等于var fun1 = new fun();实例对象fun1 上面只不过没定义接收的变量

​ 另:new操作符语法: new function( );
​ 1.创建空对象
​ 2.执行函数
​ 3.确认this 的指向 指向堆中的哪里: this —>创建空对象
​ 4.返回执行的结果
​ 可以拿一个构造函数来理解

1
2
3
4
5
6
7
8
function Person( name, age) {
//1.创建空对象{}
this.name = name;
this.age = age;
}

var person1 = new Person( 'KOBE'41)
// {name : 'xxx' , age: xxx}

4 特殊this:call apply 强制修改this

1
fun.call(obj);//obj

​ 显式指定谁: obj.xxx()
​ 通过call/apply指定谁调用: xxx.call(obj)
​ 不指定谁调用: xxx() : window
​ 回调函数: 看背后是通过谁来调用的: window/其它

6). 匿名函数自调用(立即调用):IIEF

特点:

特点:
1.只执行一次
2.什么时候执行:代码执行到函数位置立即执行
3.内部的数据是私有的
-----------------
//内部的数据是私有的
(function () {
var num = 123;
})()
console.Log(num);//报错,num未定义。因为看不到自调用函数里面数据了

-----------------
(function(){
  //实现代码
})()
专业术语为: IIFE (Immediately Invoked Function Expression) 立即调用函数表达式                          

7). 回调函数的理解△

1什么函数才是回调函数?
    你定义的
    你没有调用
    但它最终执行了(在一定条件下 或某个时刻) 回头调用!!
2常用的回调函数
    dom事件回调函数(如按钮)
    定时器回调函数
    ajax请求回调函数(后面讲解)
    生命周期回调函数(后面讲解)

git管理项目

1). 创建本地仓库

创建.gitignore配置文件
git init
git add *
git commit -m "xxx"

2). 创建github远程仓库

New Repository
指定名称
创建

3). 将本地仓库推送到远程仓库

git remote add origin https://github.com/zxfjd3g/170612_JSAdvance.git 关联远程仓库
git push origin master

4). push本地的更新

git add *
git commit -m "xxx"
git push origin master

5). 克隆github上的项目:

git clone https://github.com/zxfjd3g/170612_JSAdvance.git

6). pull远程的更新

git pull origin master

7). 撤消本地修改

git status  查看变化
git checkout -- xxx文件  撤消指定文件的修改