一、分类
*.基本(值)类型
(1) String :任意字符串
(2) Number :任意数字
(3)boolean :true false
(4)undefined:undefined
(5) null:null
*.对象(引用)类型
(1)Object:任意对象
(2)Function:一种特别的函数(可执行)
(3)Array:一种特别的对象(数字下标,内部数据是有序的)
2.判断
(1)typeof // a = {} typeof a 返回数值类型 objct
(2) instanceof // a = {} console.log(a instanceof object) //返回Boolean true
(3)=== //
3.面试常问题目
(1)undefined 和 null 有啥区别?
*初始值为null表名为对象。unll定义并赋值为null undefined定义未赋值,最后要赋值为null为了垃圾回收
(3)什么时候给变量赋值为null呢?
初始赋值表名将要赋值为对象。结束前,让对象成为垃圾对象(将被垃圾回收器回收)
(6)严格区分变量类型和数据类型
*数据类型
基本类型
对象类型
*变量类型(变量内存值的类型)
基本类型:保存的就是基本类型的数据
引用类型:保存的是地址
二、数据——内存——变量
1、什么是数据?
*存储在内存的特定信息 本质是01010101
2、什么是内存?
*可存储数据的空间(临时的)
3、什么是变量?
*可变化的量,有变量名和变量值组成,每个变量都有一个内存,变量值就是内存中保存的数据
4、变量、内存、数据的关系? *内存用来存储数据,变量是内存的标识
5、var a =xxx 保存的是什么? 基本数据与地址值
6、在js调用函数是值传递还是地址传递
值传递输出的是3
7、js引擎如何管理内存 分配地址 释放地址
三、对象
1、什么是对象?
*多个数据的封装体
*用来保存多个数据的容器
*一个对象代表现实的一个物体
2、为啥要用对象 *统一管理多个数据
3、对象组成
*属性:属性名(字符串)和属性值(任意)组成
*方法:一种特别的属性(属性值为函数)
4、如何访问对象内部数据
.属性名 :有时不能用 1.包含特殊字符不能用 - 空格 p.content-type不可以 2.属性名不确定时候
[属性名] :任何时候都能用
四、函数
1、什么是函数
实现特定功能的n条语句
只有函数能执行,其他类型的数据不能执行
2、为啥要用函数
提高复用性
提高可读性
3、如何定义函数
function函数声明 function a 表达式 var a =
4、如何调用函数
test():直接调用 obj.test() 对象调用 new test() new调用 test.call/apply(obj):临时让test成为obj的方法进行调用
五、回调函数
1、什么函数才是回调函数
你没定义的 你没有调 但他最终执行了
2、常见的回调函数
dom事件回调 定时器 ajax回调 生命周期
六、立即执行函数 IIFE inmmediately-invoked-function-expression
隐藏实现:function()()匿名函数自调用,不会污染外部命名空间
七、函数的this指向
1、this是什么 所有函数内部都有一个变量this 他的值是调用函数的当前对像
2、如何确定this的值 test() window p.test() p new test():新创建的对象 p.call(obj) obj
八、JavaScript后面是否加分号 尤雨溪(vue创始人)
九、函数的prototype
1、函数的prototype属性图
每个函数都有一个prototype属性,它默认指向一个空对象(即成为:原型对象)
原型对象中有一个属性constructor,它默认指向函数对象
2、给原型对象添加属性(一般是方法)
作用:函数的所有实例对象自动拥有原型中的属性
3、程序员能操作显示原型但是不能直接操作隐式原型(es5之前)
每个函数function都有一个prototype,即显示原型
每个实例对象都有一个__proto__,可称为隐式原型 const obj = new Fn()
4、对象的隐式原型的值为其对应构造函数的显示原型的值
十、原型链
1、读取对象的属性值时:会自动到原型链中查找
2、设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
3、方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
十一、instanceof 是如何判断的?
表达式:A instanceof B
如果B函数的显示原型(prototype)对象在A对象的原型链(proto)上,返回true,否则false
Function是通过new 自己产生的实例
****要看线能不能连上注意两边的位置,还要注意箭头的方向不能反着走********
案例
十二、面试
十三、变量提升
1、变量的提升
通过var定义(声明)的变量,在定义语句之前就可以访问到,值:undefined
2、函数声明提升
通过function声明的函数,在之前就可以直接调用,值:函数定义(对象)
3、问题、变量提升和函数提升是如何产生的?
十四、执行上下文栈 所有函数调用一次,再加上自己调用的次数为总次数
函数提升在变量提升的后面
十五、全局作用域和局部作用域
十六、闭包******
1、如何产生闭包 当一个嵌套内部函数引用了嵌套外部函数变量时就产生了闭包
2、闭包是什么? 闭包时嵌套的内部函数(绝大多数人) 包含被引变量(函数)对象(极少数人)
3、产生闭包的条件 函数嵌套 内部函数引用外部函数的数据(变量/函数)
4、使用函数内部的变量在函数执行完后,任存活在内存中(延长了局部变量的生命周期)
5、让函数外部可以操作(读写)到函数内部的数据(变量/函数)
6、函数执行完后,函数内部声明的局部变量是否还存在? 一般不存在,存在于闭包中的变量才可能存在
7、在函数外部能直接访问函数内部的局部变量码? 不能,但我们可以通过闭包让外部操作它
十七、闭包的缺点(内存泄漏)
1、函数执行完,函数内的局部变量没有释放,占用内存事件会变长(缺点)
2、容易造成内存泄漏(缺点)
解决:能不用就不用 , 及时释放
3、内存溢出
*一个程序运行出现的错误 *当程序运行需要的内存操过剩于的内存时,就抛出内存溢出的错误 for(i=0,i<100000,;i++){new Array(1232131231)}
4、内存泄漏
*占用的内存没有及时释放 *内存泄漏多了就会变成内存溢出的错误
*常见的内存泄漏 :
(1)意外的全局变量 ()=>{a=10} 局部没有声明变成全局变量
(2)没有及时清理的计时器或回调函数
(3)闭包
十八、闭包的面试
指向的是window(不是闭包因为没有用到外部变量)
十九、对象创建的方式
*new Object() {}创建 工厂模式 自定义构造函数
(结束)