目录
数据类型
分类
- 基本类型
String:任意字符串
Number:任意数字
boolean:布尔(true / false)
undefined:undefined
null:null
- 对象类型
Object:任意对象
Function:一种特别的对象(可以执行)
Array:一种特别的对象(数值下标,内部数据是有序的)
判断
- typeof:返回数据类型的字符串表达。可以判断undefined、数值、字符串、布尔值、function;不能判断null与Object、Object与Array
- instanceof:判断对象的具体类型,function也可以用typeof来判断
- ===:可以判断undefined、null
实例:
<script type="text/javascript">
// typeof: 返回的是数据类型的字符串表达形式
//基本类型
var a;
console.log(a, typeof a, a===undefined); // undefined 'undefined' true
console.log(a===typeof a); // false
a = 3;
console.log(typeof a === 'number');
a = 'xyy';
console.log(typeof a === 'string');
a = true;
console.log(typeof a === 'boolean');
a = null;
console.log(a===null); // true
console.log(typeof a); // 'object'
console.log('--------------------------------');
//对象类型
var b1 = {
b2: [2, 'abc', console.log],
b3: function () {
console.log('b3()')
}
};
console.log(b1 instanceof Object, typeof b1); // true 'object'
console.log(b1.b2 instanceof Array, typeof b1.b2); // true 'object'
console.log(b1.b3 instanceof Function, typeof b1.b3); // true 'function'
console.log(typeof b1.b2[2]); // 'function'
console.log(b1.b2[2]('abc'));// 'abc' undefined
</script>
问题
undefined与null的区别?
undefined代表定义未赋值;而null定义并赋值了,但值为null
什么时候给变量赋值为null呢?
初始赋值,表明将要赋值为对象;结束前赋值,让对象成为垃圾对象(被垃圾回收器回收)
严格区分变量类型与数据类型?
- 数据类型
基本类型和对象类型
- 变量类型
基本类型:保存的是基本类型的数据
对象类型:保存的是地址值
数据_变量_内存
数据
存储与内存中代表特定信息的东西称为数据,函数也是数据
数据的特点:可传递、可运算
程序中所有操作的目标:数据
算数运算、逻辑运算、赋值、调用函数传参
变量
值可以变化的量,由变量名和变量值组成。
一个变量对应一块小内存,变量名用来查找到内存,变量值就是内存中保存的内容。
内存
可存储数据的临时空间
内存的分类:
栈:全局变量、局部变量
堆:对象
数据、变量、内存三者之间的关系:
内存是一个容器,用来存储程序运行需要操作的数据;变量是内存的标识,我们通过变量找到对应的内存,进而操作(读 / 写)内存中的数据。
问题
关于赋值与内存的问题?
var a=xxx,a内存中到底保存的是什么?
三种情况:
- xxx是一个基本数据,保存的就是这个数据
- xxx是一个对象,保存的是对象的地址值
- xxx是一个变量,保存的是xxx的内存内容(可能是基本数据类型,也可能是地址值)
关于引用变量赋值的问题?
- 两个引用变量指向同一个对象,通过变量修改对象内部数据,另一个变量看到的是修改后的数据。
- 两个引用变量指向同一个对象,让其中一个变量指向另一个对象,另一个引用变量依然指向前一个对象。
在JS调用函数传递变量参数时,是值传递还是引用传递?
都是值传递
JS引擎如何管理内存?
- 内存生命周期
分配小内存空间,得到它的使用权;存储数据,可以反复进行操作;释放小内存空间
- 释放内存
局部变量:函数执行完自动释放
对象:成为垃圾对象
对象
多个数据的封装体(用来保存多个数据的容器)
对象的组成:属性和方法
问题
什么时候必须使用['属性名']的方式?
- 属性名包含特数字符:-、空格
- 属性名不确定
函数
实现特定功能的n条语句封装体。只有函数时可以执行,其他类型的数据不能执行
函数的三种不同种类
一般函数:直接调用
构造函数:通过new调用
对象:通过 . 调用内部属性或方法
回调函数
回调函数要满足三个条件:
1.你定义的 2.你没有调用 3.但最终执行了
常见的回调函数:
- dom事件回调函数:回调函数中的this为发生事件的dom元素
- 定时器回调函数:回调函数中的this为window
- ajax请求回调函数
- 生命周期回调函数
IIFE(匿名函数自调用)
全称:Immediately-Invoked Function Expression 立即调用函数表达式
作用:
- 隐藏实现
- 不会污染外部(全局)命名空间
- 用它来编写JS模块
<script type="text/javascript">
(function (){ //匿名函数自调用
console.log("……");
})();
(function () {
var a = 1;
function test() {
console.log(++a);
};
window.$ = function () { //向外暴露一个全局函数
return {
test: test
};
};
})();
$().test();//①$是一个函数;②$执行后返回的是一个对象
</script>
函数中的this
- test() window
- p.test() p
- new test() 新创建的对象
- p.call(obj) obj