基础总结深入:数据类型的分类和判断(数据、内存、变量) 对象 函数 回调函数 IIFE 函数中的this 分号


数据类型的分类和判断

基本(值)类型----值----判断

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

对象(引用)类型----值----判断

Object ----- 任意对象 ---- typeof/instanceof
Array ------ 一种特别的对象,可以执行 ---- instanceof
Function ---- 一种特别的对象,数值下标,内部数据是有序的 ---- typeof

判断

typeof
可以判断:undefined/数值/字符串/布尔值/function(例如:typeof a === "undefined"/a === undefined)
不可以判断:null与object       array与object
instanceof
判断对象的具体类型
===
可以判断:undefined/null

注意

函数加()来执行,()前是函数。
对象不可以执行,对象用来存数据,函数存的是代码数据,所以可以执行。
instanceof 用来检查一个对象是否是一个类的实例。
console.log方法可以接受一个或多个参数,将它们连接起来输出。(参数用","隔开,因为它是函数)
typeof返回一个描述类型的字符串。
类是个对象(类型对象),类就是构造函数。

undefined与null的区别?

undefined代表定义未赋值
null代表定义并赋值了,只是值为null

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

初始赋值,表明将要赋值为对象
结束前赋值,让对象成为垃圾对象(被垃圾回收器回收)

严格区分变量类型和数据类型?(了解即可,一般不区分,变量本身是没有类型的)

数据的类型
基本类型
对象类型
变量的类型(变量内存值的类型)
基本类型:保存的是基本类型的数据
引用类型:保存的是地址值

数据、内存、变量

1.什么是数据?

存储在内存中代表特定信息的“东东”,本质上是0101...
数据的特点:可传递,可运算
一切皆数据
内存中所有操作的目标:数据
操作:算术运算、逻辑运算、赋值、运行函数

2.什么是内存?

内存条通电后产生的可存储数据的空间(临时的)
内存产生和死亡:内存条(电路板)——>通电——>产生内存空间——>存储数据——>处理数据——>断电——>内存空间和数据都消失
一块小内存上的2个数据:内部存储的数据、地址值
内存分类
栈:全局变量、局部变量(空间较小)
堆:对象(空间较大)

3.什么是变量?

可变化的量,由变量名和值组成
每个变量都对应一块小内存,变量名用来查找对应内存,变量值就是内存中保存的数据

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

内存用来存储数据的空间
变量是内存的标识,我们通过变量找到对应的内存,进而操作(读/写)内存中的数据

注意

变量之间的赋值,就是原变量的值拷贝一份给新变量。
对象里的属性名不是全局变量或局部变量。
函数名在栈空间,函数在堆空间,对象在堆空间,标识这个对象的变量在栈空间。
永久空间是硬盘,代码文本(文本就是一个大的数据串,有特定格式,按照语法规则写才可以解析)从硬盘加载到内存空间来执行。

var a = xxx,a内存中到底保存的是什么?

xxx是基本数据,保存的就是这个数据
xxx是对象,保存的是对象的地址值
xxx是一个变量,保存的xxx的内存内容 (可能是基本数据,也可能是地址值)

关于引用变量赋值问题

2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据
2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量任然指向前一个对象

在js调用函数传递变量参数时,是值传递还是引用传递?
理解1:都是值(基本/地址值)传递
理解2:可能是值传递,也可能是引用传递(地址值)

JS引擎如何管理内存?
1.内存生命周期
分配小内存空间,得到它的使用权(分配内存:声明变量和函数或创建对象时,JS引擎会自动为此分配一定大小的内存来存放对应的数据)
存储数据,可以反复进行操作
释放小内存空间(释放内存:清空内存中的数据,标识内存可以再分配使用,内存不释放就不能复用)
2.释放内存
局部变量:函数执行完自动释放
对象:成为垃圾对象——>某个时刻由垃圾回收器回收

对象

1.什么是对象?

多个数据的封装体
用来保存多个数据的容器
一个对象代表现实中的一个事物

2.为什么要用对象?

统一管理多个数据

3.对象的组成

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

代表现实事物的状态数据

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

代表现实事物的行为数据 

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

.属性名:编码简单,有时候不能用
["属性名"]:编码简单,能通用

什么时候必须使用["属性名"]的方式?
(1)属性名包含特殊字符:- 空格(["属性名"])
(2)属性名不确定,属性名是一个变量([属性名])

函数

1.什么是函数?

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

2.为什么要用函数?

提高代码复用
便于阅读交流

3.如何定义函数?

函数声明
表达式

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

test():直接调用
obj.test():通过对象调用
new test():new调用
test.call/apply(obj):临时让test成为obj的方法进行调用,可以让一个函数成为指定任意对象的方法进行调用

注意

形参的本质就是一个局部变量
实参的本质就是一个数据(一个变量的值),传实参就是传一个值

回调函数

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

(1)你定义的
(2)你没有调用
(3)但它最终执行了(在某个时刻或条件下)

2.常见的回调函数?

dom事件回调函数--------------------与用户交互的关键

1 document.getElementById("btn").onclick = function () {
2     alert(this.innerHTML);
3 }

定时器回调函数

1 setTimeout(function () {
2     alert("到点了");
3 }, 2000)

ajax请求回调函数(后面讲)--------------------与后台交互的关键
生命周期回调函数(后面讲)

IIFE

1.理解

英文全称意思为:立即执行函数(也叫匿名函数自调用)

2.作用

隐藏实现
不会污染外部(全局)命名空间
用它来编写js模块

1 (function () {
2     var a = 3;
3     console.log(++a);
4 })()

函数中的this

1.this是什么?

任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
所有函数内部都有一个变量this,它的值是调用函数的当前对象

2.如何确定this的值?

test():window
p.test():p
new test():新创建的对象(不懂看js基础笔记中的构造函数执行流程)
p.call(obj):obj
dom事件回调函数中的this:发生事件的dom元素对象
定时器回调函数中的this:window

分号

1.js一条语句的后面可以不加分号
2.是否加分号是编码风格问题,没有应不应该,只有你自己喜不喜欢。
3.在下面2种情况下不加分号会有问题
(1)小括号开头的前一条语句
(2)中括号开头的前一条语句
4.解决办法:在行首加分号。
5.强有力的例子:vue.js库
6.return、break和continue如果这三个关键字后面跟着换行,js引擎会在换行处填补分号,可以添加括号解决。

学识浅薄,如有错误,恳请斧正,在下不胜感激。

相关