数据类型
1. 分类
基本类型
- String:任意字符串
- Number:任意数字
- Boolean:true/false
- Undefined:undefined
- Null:null
对象类型
- Object:任意对象
- Function:一种特别的对象(可以调用执行)
- Array:一种特别的对象(数值下标,内部数据是有序的)
2. 判断
- typeof:可以判断undefined / 数值 / 字符串 / 布尔值 / function;不能区分 null与object,array与object
- instanceof:判断对象的具体类型
- ===:可以判断undefined / null
var a;
console.log(a, typeof a);// undefined "undefined"
console.log(a === undefined);// true
a = 3;
console.log(typeof a === "number"); // true
a = "dudu";
console.log(typeof a === "string"); // true
a = true;
console.log(typeof a === "boolean"); // true
a = null;
console.log(typeof a); // object
console.log(a === null); // true
var b1 = {
b2: [1, 'abc', console.log],
b3: function () {
console.log("b3");
return function () {
return "太复杂了";
}
}
}
console.log(b1 instanceof Object); // true
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.b3 === 'function'); // true
b1.b2[2]("dudu"); // dudu
console.log(b1.b3()()); // b3 太复杂了
3. 相关问题
undefined 与 null 的区别
undefined 代表定义未赋值,null 代表定义且赋值为null
var a;
console.log(a);// undefined
a = null;
console.log(a);// null
什么时候给变量赋值为null
初始赋值,表明变量将要被赋值为对象
结束前赋值,便于进行垃圾回收
var b = null;
b = [1, "dudu"];
b = null;
严格区分变量类型与数据类型
数据的类型:基本类型,对象类型
变量的类型(变量内存值的类型):基本类型:保存的是基本类型数据;引用类型:保存的是地址值
数据,变量与内存
1. 什么是数据?
- 存储在内存中代表特定信息的‘东东’,本质上是0101…
- 数据的特点:可传递,可运算
- 一切皆数据
- 内存中所有操作的目标都是数据(算数运算,逻辑运算,赋值运算,运行函数)
2. 什么是内存
- 内存条通电以后产生的可存储数据的空间(临时的)
- 内存产生和死亡:内存条(电路板)==> 通电 ==> 产生内存空间 ==> 存储数据 ==> 处理数据 ==> 断电 ==> 内存空间和数据都消失
- 一块小内存的2个数据:内部存储的数据,地址值数据
- 内存分类:① 栈:全局变量和局部变量;② 堆:对象
3. 什么是变量
- 可变化的量,由变量名和变量值组成
- 每个变量都对应一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的内容
4. 内存,数据,变量三者之间的关系
- 内存时一个容器,用来存储程序运行需要操作的数据
- 变量是内存的标识,通过变量找到对应的内存,进而操作内存中的数据
5. 相关问题
关于赋值和内存的问题:var a = xxx, a内存中保底保存的是什么
- 如果xxx是基本数据,保存的就是这个数据
- 如果xxx是对象,保存的是对象的地址值
- 如果xxx是变量,保存的是xxx的内存内容(可能是基本数据,也可能是地址值)
关于引用变量赋值的问题
- 2个引用变量指向同一个对象,通过其中一个变量修改对象内部数据,另一个引用变量看到的是修改之后的数据
- 2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向原来的对象
在 js 调用函数时传递变量参数时,是值传递还是引用传递
- 理解1:都是值(基本值或地址值)传递
- 理解2:可能是值传递也可能是引用传递(传递的是地址值)
JS 引擎如何进行内存管理
- 内存生命周期:
- 分配小内存空间,得到使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
- 释放内存
- 局部变量:函数执行完自动释放
- 对象:成为垃圾对象 ==> 由垃圾回收器回收
对象
1. 什么是对象
- 多个数据的封装体
- 用来保存多个数据的容器
- 一个对象代表现实世界中的一个事物,是该事物在编程中的抽象
2. 为什么要用对象
- 统一管理多个数据
3. 对象的组成
- 属性:属性名(字符串) + 属性值(任意类型)
- 方法:一种特殊的属性(属性值是函数)
4. 如何访问对象内部数据
- 对象.属性名:编码简单,有时不能用
- 对象[属性名字符串]:编码复杂,可以通用
什么时候必须使用 [‘属性名’] 的方式
- 属性名包含特殊字符: - 空格
- 属性名不确定
函数
1. 什么是函数
- 实现特定功能的 n 条语句的封装体
- 只有函数是可以执行的,其他类型的数据不能执行
2. 为什么要用函数
- 提高代码复用
- 便于阅读交流
3. 如何定义函数
- 函数声明:
function f(params) { } - 表达式:
var f = function (params) { }
4. 如何调用(执行)函数
- 直接调用:
f() - 通过对象调用:
obj.f() - new 调用:
new f() - call 或 apply 调用:
f.call/apply(obj)临时让 f 成为 obj 的方法来调用
5. 回调函数
什么函数才是回调函数
- 你定义的
- 你没有调用
- 最终执行了(在某个时刻或某个条件下)
常见的回调函数
- dom 事件回调函数(this 是发生事件的 dom 元素)
document.getElementById("btn").onclick = function () { alert(this.innerHTML); }; - 定时器回调函数(this 是 window)
setTimeout(function () { alert("到点了!"); }, 2 * 1000); - ajax 请求回调函数
- 生命周期回调函数
6. IIFE
- 立即执行函数表达式
- 作用:① 隐藏实现;② 不会污染外部(全局)命名空间;③ 用它来编写 js 模块
(function () {
console.log("dudu");
})();
(function () {
var a = 3;
function test() {
console.log(++a);
}
// 可以不暴露所有函数
function f() {
console.log(a);
}
window.$ = function () {
// 向外暴露一个全局函数
return {
test: test,
};
};
})();
$().test(); // 4
7. 函数中的 this
this 是什么
- 所有函数内部都有的一个变量 this
- 它的值是调用函数的当前对象
如何确定 this 的值
- 任何函数本质上都是通过某个对象来调用的,如果没有直接指定,就是 window 调用
test()windownew test()新创建的对象obj.test()objtest.call/apply(obj)obj
137

被折叠的 条评论
为什么被折叠?



