发布时间:2023-04-24 文章分类:WEB开发, 电脑百科 投稿人:赵颖 字号: 默认 | | 超大 打印

文章目录

    • 【1】基本总结深入
      • 一、什么是数据
        • 1、数据类型
          • 基本(值)类型
          • 对象(引用)类型
        • 2、判断
        • 相关问题
      • 二、什么是内存
          • 1、什么是数据
          • 2、什么是内存?
          • 3、什么是变量
          • 4、内存、数据、变量三者之间的关系
          • 相关问题
            • 1、问题:var a = xxx,a内存中到底保存的是什么?
            • 2、关于引用变量赋值问题
            • 3、在js调用函数传递变量参数时,是值传递还是引用传递
            • 4、JS引擎如何管理内存
      • 三、什么是对象
          • 1、什么是对象
          • 2、为什么要用对象
          • 3、对象的组成
          • 4、如何访问对象内部数据
          • 5、什么时候必须使用[‘属性值’]的方式
      • 四、什么是函数
          • 1、什么是函数
          • 2、为什么用函数
          • 3、如何定义函数
          • 4、如何调用(执行)函数
          • 5、回调函数
            • 1、什么函数才是回调函数
            • 2、常见的回调函数
          • 6、IIFE
            • 1、理解
            • 2、作用
          • 7、函数中的this
            • 1、this是什么
            • 2、如何让确定this的值
    • 【2】函数高级
      • 一、原型与原型链
        • 1、原型
          • (1)函数的prototype属性
          • (2)给原型对象添加属性(一般都是方法)
        • 2、显示原型与隐式原型
          • (1)每个函数function都有一个prototype,即显示原型(属性)默认指向一个空的Object对象
          • (2)每个实例对象都有一个‘ _ _ proto _ _’,可称为隐式原型(属性)
          • (3)对象的隐式原型的值为其对应构造函数的显式原型的值
          • (4)内存构造(图)
          • (5)总结
        • 3、原型链
          • (1)原型链
          • (2)构造函数/原型实例对象的关系
          • (3)构造函数/原型实例对象的关系2
          • (4)相关问题
        • 4、原型链属性问题
        • 5、探索instanceof
          • 1、instanceof是如何判断的?
          • 2、Function是通过new自己产生的实例
        • 6、面试题
      • 二、执行上下文与执行上下文栈
        • 1、变量提升与函数提升
          • (1)变量声明提升
          • (2)函数声明提升
        • 2、执行上下文
          • (1)代码分类(位置)
          • (2)全局执行上下文
          • (3)函数执行上下文
        • 3、执行上下文栈
          • (1)在全局代码执行前,JS引擎就会创建一个栈来存储管理所有的执行上下文对象
          • (2)在全局执行上下文(window)确定后,将其添加到栈中(压栈)
          • (3)在函数执行上下文创建后,将其添加到栈中(压栈)
          • (4)在当前函数执行完后,将栈顶的对象移除(出栈)
          • (5)当所有的代码执行完后,栈中只剩下window
        • 4、面试题
      • 三、作用域与作用域链
        • 1、作用域
          • (1)理解
          • (2)分类
          • (3)作用
        • 2、作用域与执行上下文
          • (1)区别1
          • (2)区别2
          • (3)联系
        • 3、作用域链
          • (1)理解
          • (2)查找一个变量的查找规则
      • 四、闭包
        • 1、理解闭包
          • (1)如何产生闭包
          • (2)闭包到底是什么
          • (3)产生闭包的条件
        • 2、常见闭包
        • 3、闭包作用
          • (1)使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的声明周期)
          • (2)让函数外部可以操作(读写)到函数内部的数据(变量/函数)
          • (1)函数执行完后,函数内部声明的局部变量是否还存在?
          • (2)在函数外部能直接访问函数内部的局部变量吗?
        • 4、闭包生命周期
          • (1)产生:在嵌套内部函数定义执行完时就产生了(不是在调用)
          • (2)死亡:在嵌套的内部函数成为垃圾对象时
        • 5、闭包应用
          • 闭包的应用:定义JS模块
        • 6、闭包缺点
          • (1)缺点
          • (2)解决
          • (3)内存溢出
          • (4)内存泄漏
        • 五、面试题
    • 【3】对象高级
      • 一、对象创建模式
        • 方式一:Object构造函数模式
        • 方式二:对象字面量模式
        • 方式三:工厂模式
        • 方式四:自定义构造函数模式
      • 二、继承模式
        • 1、原型链继承
          • (1)套路
          • (2)关键
        • 2、借用构造函数继承(假的)
          • (1)套路
          • (2)关键
        • 3、组合继承
          • (1)原型链+借用构造函数的组合继承
    • 【4】线程机制与事件机制
      • 一、进程与进程
        • 1、进程
          • 2、线程
        • 3、图解
        • 4、相关知识
        • 5、相关问题
          • (1)何为多进程与多线程
          • (2)JS是单线程还是多线程
          • (3)比较单线程与多线程
          • (4)浏览器运行是单线程还是多线程
      • 二、浏览器内核
      • 三、定时器引发的思考
        • 1、定时器真的是定时执行的吗?
        • 2、定时器回调函数是在哪个线程执行的?
        • 3、定时器是如何实现的?
      • 四、JS是单线程执行
      • 五、浏览器的事件循环(轮询)模型

【1】基本总结深入

一、什么是数据

1、数据类型

2、判断

相关问题

1、underfine与null的区别

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

3、严格区别变量类型与数据类型

二、什么是内存

1、什么是数据
2、什么是内存?
3、什么是变量
4、内存、数据、变量三者之间的关系
相关问题
1、问题:var a = xxx,a内存中到底保存的是什么?
2、关于引用变量赋值问题
var obj1 = {name:'Tom'}
var obj2 = obj1;
function fn1(obj) {
    obj.name = 'A';
}
fn1(obj1)
console.log(obj2.name)//A
function fn2(obj) {
	obj = {name: 'B'}
}
fn2(obj1)
console.log(obj1.name) //A
3、在js调用函数传递变量参数时,是值传递还是引用传递
4、JS引擎如何管理内存

1、内存生命周期

2、释放内存

var a = 3
var obj = {}
function fn() {
	var b = {}
}
fn()//b是自动释放,b所指向的对象是在后面的某个时刻由垃圾回收器回收

三、什么是对象

1、什么是对象
2、为什么要用对象
3、对象的组成
4、如何访问对象内部数据
5、什么时候必须使用[‘属性值’]的方式

​ 1、属性名包含特殊字符: - 空格

​ 2、属性值不确定

var p = {}
//1、给p对象添加一个属性:content type: text/json
//p.content-type = 'text/json' //不能用
p['content-type'] = 'text/json'
var propName = 'myAge'
var value = 18
//p.propName = value //不能用
p[propName] = value
console.log(p[propName])

四、什么是函数

1、什么是函数
2、为什么用函数
3、如何定义函数
//1.函数声明
function fn1() {
	console.log(1)
}
//2.表达式
fn2 = function() {
	console.log(2)
}
4、如何调用(执行)函数
var obj = {}
function test(){
	this.xxx="atguigu"
}
//obj.test() 不能直接调用
test.call(obj) //相当于obj.test()
console.log(obj.xxx) // atguigu
5、回调函数
1、什么函数才是回调函数
2、常见的回调函数
6、IIFE
1、理解
2、作用
(function () { //匿名函数调用
    var a = 3
    console.log(a + 3)
})()
var a = 4
console.log(a)
;(function () {
    var a = 1
    function test () {
        console.log(++a)
    }
    window.$ = function () { //向外暴露一个全局函数
        return {
            test:test
        }
    }
})()
$.test() //1. $是一个函数 2.$执行后返回的是一个对象
//6
//4
//2
7、函数中的this
1、this是什么
2、如何让确定this的值
function Person(color) {
	console.log(this)
    this.color = color;
    this.getColor = function () {
        console.log(this)
        return this.color 
    };
    this.setColor = function () {
        console.log(this)
        return this.color 
    };
}
Person("red"); //this是谁? window
var p = new Person("yello");  //this是谁? p
p.getColor(); //this是谁? p
var obj = {};
p.serColor.call(obj,"black"); //this是谁? obj
var test = p.setColor;
test(); //this是谁? window
function fn1() {
    function fn2() {
        console.log(this);
    }
    fn2();//this是谁? window
}
fn1;

【2】函数高级

一、原型与原型链

1、原型

(1)函数的prototype属性
(2)给原型对象添加属性(一般都是方法)
//每个函数都有一个prototype属性,它默认指向一个Object空对象(原型对象)
console.log(Data.prototype, typeof Date.prototype) //...    object
function Fun {}
console.log(Fun.prototype) //默认指向一个Object空对象
//原型对象中由一个属性constructor,它指向函数对象
console.log(Fun.prototype.constructor === Fun) //true
console.log(Date.prototype.constructor === Date) //true
//给原型对象添加属性(一般是方法) ===> 实例对象可以访问
Fun.prototype.test = function() {
    console.log('test()')
}
var fun = new Fun()
fun.test() //test()

2、显示原型与隐式原型

(1)每个函数function都有一个prototype,即显示原型(属性)默认指向一个空的Object对象
(2)每个实例对象都有一个‘ _ _ proto _ _’,可称为隐式原型(属性)
(3)对象的隐式原型的值为其对应构造函数的显式原型的值
(4)内存构造(图)

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

function Fn() {
    //内部语句:this.prototype = {}
}
//1、每个函数function都有一个prototype,即显示原型(属性)默认指向一个空的Object对象
console.log(Fn.prototype)
//2、每个实例对象都有一个__ proto__,可称为隐式原型(属性)
//创造实例对象
var fn = new Fn() //内部语句:this.__proto__ = Fn.prototype
//3、对象的隐式原型的值为其对应构造函数的显式原型的值
console.log(fn.__proto__ == Fn.prototype) // true
//给原型添加方法
Fn.prototype.test = function() {
    console.log('test()')
}
fn.test() // test()
(5)总结

3、原型链

(1)原型链

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

function Fn() {
    this.test1 = function() {
        console.log('test1()')
    }
}
Fn.prototype.test2 = function() {
        console.log('test1()')
}
var fn = new Fn()
fn.test1()
fn.test2()
console.log(fn.toString())
fn.test3() //报错
(2)构造函数/原型实例对象的关系

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

(3)构造函数/原型实例对象的关系2

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

(4)相关问题
//1.函数的显示原型指向的对象默认时空Object实例对象(但Object不满足)
console.log(Fn.prototype instanceof Object) //true
console.log(Object.prototype instanceof Object) // false
console.log(Function.prototype instanceof Object) // true
//2.所有函数都是Function的实例(包含Function)
console.log(Function.__protp__ === Function.prototype) // true
//3.Object的原型对象是原型链尽头
console.log(Object.prototype.__proto__) //null

4、原型链属性问题

  1. 读取对象的属性值时:会自动到原型链中查找
  2. 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
  3. 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
function Fn() {}
Fn.prototype.a = 'xxx'
var fn1 = new Fn()
console.log(fn1.a, fn1) // xxx
var fn2 = new Fn()
fn2.a = 'yyy'
console.log(fn1.a,fn2.a,fn2) // xxx yyy 
function Person(name, age) {
    this.name = name
    this.age = age
}
Person.prototype.setName = function(name) {
    this.name = name
}
var p1 = new Person('Tom', 12)
p1.setName('Bob')
console.log(p1) //Bob 12
var p2 = new Person('jack', 12)
p2.setName('Cat')
console.log(p2) // Cat 12
console.log(p1.__proto__ == p2.__proto__) // true 实例对象的隐式原型对象指向构造函数的显示原型对象

5、探索instanceof

1、instanceof是如何判断的?
2、Function是通过new自己产生的实例
function Foo() {}
var f1 = new Foo()
console.log(f1 instanceof Foo) //true
console.log(f1 instanceof Obeject) // true
console.log(Object instanceof Function) //true
console.log(Object instanceof Object) //true
console.log(Function instanceof Function) //true
console.log(Function instanceof Object) //true
function Foo(){}
console.log(Object instaenceof Foo) //false

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-968lJYs1-1650793106729)(C:\Users\hello world\AppData\Roaming\Typora\typora-user-images\1643304158857.png)]

6、面试题

//测试1
function A(){}
A.prototype.n = 1
var b = new A()
A.prototype = {
	n: 2,
	m: 3
}
var c = new A()
console.log(b.n, b.m, c.n, c.m) // 1 undenfine 2 3
//测试2
var F = function() {}
Object.prototype.a = function() {
    console.log('a()')
}
Function.prototype.b = function() {
    console.log('b()')
}
var f = new F()
f.a() //a()
f.b() //报错
F.a() //a()
F.b() //b()

二、执行上下文与执行上下文栈

1、变量提升与函数提升

(1)变量声明提升
(2)函数声明提升
var a = 3
function fn1() {
    console.log(a)
    var a = 4
}
fn1() //undenfine 变量提升,fn1函数相当于 var a; console.log(a); a = 4
console.log(b) //undefined 变量提升
var b = 3
fn2() //可调用 函数提升
function fn2() {
    console.log('fn2()')
}
fn3() //不能 变量提升
var fn3 = function(){}

2、执行上下文

(1)代码分类(位置)
(2)全局执行上下文
(3)函数执行上下文

3、执行上下文栈

(1)在全局代码执行前,JS引擎就会创建一个栈来存储管理所有的执行上下文对象
(2)在全局执行上下文(window)确定后,将其添加到栈中(压栈)
(3)在函数执行上下文创建后,将其添加到栈中(压栈)
(4)在当前函数执行完后,将栈顶的对象移除(出栈)
(5)当所有的代码执行完后,栈中只剩下window
//1.进入全局执行上下文
var a = 10
var bar = function (x) {
    var b = 5
//3.进入foo函数执行上下文 
    foo(x + b)
}
var foo = function (y) {
    var c== 5
    console.log(a + c + y)
}
//2.进入bar函数执行上下文 
bar(10) 

4、面试题

console.log('gb: '+i)
var i = 1
foo(1)
function foo(i) {
    if(i == 4) {
        return 
    }
    console.log('fb: ' + i)
    foo(i + 1)
    console.log('fe: ' + i)
}
console.log('ge: ' + i)
//gb: undefine
//fb: 1
//fb: 2
//fb: 3
//fe: 3
//fe: 2
//fe: 1
//ge: 4
//执行上下文5个
//测试题1
function a() {}
var a;
console.log(typeof a)
//测试题2
if(!(b in window)) {
    var b = 1
}
console.log(b) //undefine
//测试题3
var c = 1
function c(c) {
    console.log(c)
    var c = 3
}
c(2) //报错,c不是一个函数
//其实代码相当于
var c
function c(c) {
    console.log(c)
    var c = 3
}
c = 1
c(2)

三、作用域与作用域链

1、作用域

(1)理解
(2)分类
(3)作用

2、作用域与执行上下文

(1)区别1
(2)区别2
(3)联系

3、作用域链

(1)理解
(2)查找一个变量的查找规则
var x = 10
function fn() {
    console.log(x)
}
function show(f) {
    var x = 20
    f()
}
show(fn)//10
var fn = function() {
	console.log(fn)
}
fn() //输出函数
var obj = {
    fn2: function() {
        console.log(fn2) // 报错
        console.log(this.fn2) //正常输出函数
    }
}
obj.fn2()

四、闭包

1、理解闭包

(1)如何产生闭包
(2)闭包到底是什么
function fn1() {
    var a = 2
    var b = 'abc'
    function fn2() { //执行函数定义就会产生闭包(不用调用内部函数)
        console.log(a)
    }
    fn2()
}
fn1() //需要调用外部函数
(3)产生闭包的条件

2、常见闭包

//1.将函数作为另一个函数的返回值
function fn1() {
    var a = 2
    function fn2() {
        a++
        console.log(a)
    }
    return fn2 
}
var f = fn1() //执行外部函数
f() //3 执行内部函数
f() //4 执行内部函数
//2.将函数作为实参传递给另一个函数调用
function showDelay(msg, time) {
    setTimeout(function() {
        alert(msg)
    },time)
}
showDelay('atguigu',2000)

3、闭包作用

(1)使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的声明周期)
(2)让函数外部可以操作(读写)到函数内部的数据(变量/函数)

问题:

(1)函数执行完后,函数内部声明的局部变量是否还存在?
(2)在函数外部能直接访问函数内部的局部变量吗?
//1.将函数作为另一个函数的返回值
function fn1() {
    var a = 2
    function fn2() {
        a++
        console.log(a)
    }
    return fn2 
}
var f = fn1() //执行外部函数 指向fn2,导致fn2不释放
f() //3 执行内部函数 
f() //4 执行内部函数

4、闭包生命周期

(1)产生:在嵌套内部函数定义执行完时就产生了(不是在调用)
(2)死亡:在嵌套的内部函数成为垃圾对象时
function fn1() {
//此时闭包就已经产生了(函数提升,内部函数对象已经创建了)
    var a = 2
    function fn2() {
        a++
        console.log(a)
    }
    //var fn2 = function () {
    // 	a++
    //  console.log(a)
	//} 闭包在此句完成才产生
    return fn2 
}
var f = fn1() //执行外部函数 指向fn2,导致fn2不释放
f() //3 执行内部函数 
f() //4 执行内部函数
f = null // 闭包死亡(包含闭包的函数对象成为垃圾对象)

5、闭包应用

闭包的应用:定义JS模块
function myModule() {
    //私有数据
    var msg = 'My atguigu'
    //操作数据的函数
    function doSomething() {
        console.log('doSomething()' + msg.toUpperCase)
    }
    function doOtherting() {
        console.log('doOtherting()' + msg.toLowerCase)
    }
    //向外暴露对象(给外部使用的方法)
    return {
        doSomething: doSomething,
        doOtherthing:doOtherting
	}
}
//
var module = myModule()
module.doSomething()
module.doOtherthing()
(function(window) {
    //私有数据
    var msg = 'My atguigu'
    //操作数据的函数
    function doSomething() {
        console.log('doSomething()' + msg.toUpperCase)
    }
    function doOtherting() {
        console.log('doOtherting()' + msg.toLowerCase)
    }
    //向外暴露对象(给外部使用的方法)
    window.myModule = {
        doSomething: doSomething,
        doOtherthing:doOtherting
    }
})(window)
myModule.doSomething()
mymodule.doOtherthing()

6、闭包缺点

(1)缺点
(2)解决
function fn1(){
    var arr = new Array[10000]
    function fn2() {
        console.log(arr.length)
    }
    return fn2
}
var f = fn1()
f()
f = null//让内部函数成为垃圾对象 -->回收闭包 
(3)内存溢出
(4)内存泄漏
//意外的全局变量
function fn1() {
    a = new Array(1000)
}
//没有及时清理的计时器或回调函数
var intervalId = setInterval(function(){ //启动循环定时器后不清理
	console.log('------') 
},1000)
//clearInterval(intervalId)
//闭包
function fn1() {
	var a = 1;
    function fn2() {
        a++ 
        console.log(a)
    }
    return fn2
}
var f = fn1()
f()
//f = null

五、面试题

var name1 = "the window"
var object1 = {
    name1: "my Object"
    getNameFunc: function() {
        //没有闭包
        return function() {
            return this.name
        }
    }
}
console.log(object1.getNameFunc()()) //the window
var name2 = "the window"
var object1 = {
    name2: "my Object"
    getNameFunc: function() {
        var that = this // 闭包
        return function() {
            return that.name2
        }
    }
}
console.log(object2.getNameFunc()()) //my object
function fun(n,o) {
    console.log(o)
    return {
        fun: function(m){
            return fun(m,n) //  
        }
    }
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3) //undefine 0 0 0
var b = fun(0).fun(1).fun(2).fun(3); //undefine 0 1 2
var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefine 0 1 1

【3】对象高级

一、对象创建模式

方式一:Object构造函数模式

var p = new Object()
p.name = 'Tom'
p.age = 12
p.setName = function(name) {
    this.name = name
}

方式二:对象字面量模式

var p = {
	name: 'Tom',
	age: 12,
	setName: function(name) {
    	this.name = name
	}
}

方式三:工厂模式

function createPerson(name,age) {
    var obj = {
        name: name,
        age: age,
        setName: function(name) {
            this.name = name
        }
    }
    return obj
}
//创建
var p1 = createPerson('Tome',12)
var p1 = createPerson('BOb',12)
function Person(name,age) {
    this.name = name
    this.age = age
    this.setName = function(name) {
    	this.name = name
    }
}
function Student(name,age) {
	this.name = name
    this.age = age
    this.setName = function(name) {
    	this.name = name
    }
}
var p = new Person('Tom',12)
var s = new Student('Jack',12)
console.log(p instanceof Person) // true
console.log(s instanceof Student) // true

二、继承模式

1、原型链继承

(1)套路
(2)关键
//父类型
function Supper() {
    this.supProp = 'Supper property'
}
Supper.prototype.showSupperProp = function() {
    console.log(this.supProp)
} 
//子类型
function Sub() {
    this.supProp = 'Sub property'
}
//子类型的原型为父类的一个实例对象
Sub.proeotype = new Supper()
//让子类型的原型的constructor指向SUb
Sub.proeotype.constructor = Sub
Sub.prototype.showSubProp = function() {
    console.log(this.supProp)
} 
var sub = new Sub() 
sub.showSupperProp() //Supper property'

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

2、借用构造函数继承(假的)

(1)套路
(2)关键
function Person(name, age) {
    this.name = name
    this.age = age
}
function Student(name, age, price) {
	Person.call(this,name, age) //相当于:this.Preson(name, age)
    this.price = price
}
var s = new Student('Jack', 12, 14000)

3、组合继承

(1)原型链+借用构造函数的组合继承
function Person(name, age) {
    this.name = name
    this.age = age
}
Person.prototype.setName = function (name) {
    this.name = name
}
function Student(name, age, price) {
	Person.call(this,name, age) //为了得到属性
    this.price = price
}
Student.prototype = new Person() //为了看见父类型的方法
Student.prototype.constructor = Student //修正constructor属性
Student.prototype.setPrice = {
    this.price = price
}
var s = new Student('Jack', 12, 14000)

【4】线程机制与事件机制

一、进程与进程

1、进程

2、线程

3、图解

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)

4、相关知识

5、相关问题

(1)何为多进程与多线程
(2)JS是单线程还是多线程
(3)比较单线程与多线程
(4)浏览器运行是单线程还是多线程

有的单线程有的多线程

二、浏览器内核

支持浏览器运行的最核心的程序

三、定时器引发的思考

1、定时器真的是定时执行的吗?

2、定时器回调函数是在哪个线程执行的?

3、定时器是如何实现的?

四、JS是单线程执行

五、浏览器的事件循环(轮询)模型

【javaScript】学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)