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

Posted 土狗1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javaScript学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)相关的知识,希望对你有一定的参考价值。

文章目录

【1】基本总结深入

一、什么是数据

1、数据类型

  • 基本(值)类型
    • String:任意的字符串
    • Nubmer:任意数字
    • booleans :true/false
    • underfine :underfine
    • null:null
  • 对象(引用)类型
    • Object:任意对象
    • Function:一种特别的对象(可以执行)
    • Array:一种特别的对象(数值下标,内部数据是有序的)

2、判断

  • typeof 返回数据类型的字符串表达

    • 可以判断:underfine/数值/字符串/布尔值/function
    • 不能判断:null与object, object与array
    var b1 = 
    	b2:[1,'abc',console.log],
        b3:function()
            console.log('b3')
            return function()
                return 'xfzhang'
            
        
    
    
    console.log(typeof b1.b2)//'object'
    
  • instanceof

    • 判断对象的基本类型
  • ===

    • 可以判断:undefine,null

相关问题

1、underfine与null的区别

  • underfine 代表定义未赋值
  • null定义了并赋值,值为null

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

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

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

  • 数据类型

    • 基本类型
    • 对象类型
  • 变量的类型(变量内存值的类型)

    • 基本类型:保存就是基本类型的数据
    • 引用类型:保存的是地址值

二、什么是内存

1、什么是数据
  • 存储在内存中代表特定信息的东西,本质上是0101……
  • 数据的特点:可传递,可运算
  • 一切皆数据
  • 内存中所有操作的目标:数据
    • 算术运算
    • 逻辑运算
    • 赋值
    • 运行函数
2、什么是内存?
  • 内存条通电后产生的可存储数据的空间(临时的)

  • 内存的产生和死亡:内存条==>通电==>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失

  • 一块小内存的2个数据

    • 内部存储的数据
    • 地址值
  • 内存分类

    • 栈:全局变量/局部变量(空间较小)
    • 堆:对象(空间较大)
3、什么是变量
  • 可变化的量,由变量名和变量值组成
  • 每个变量都对应的一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
4、内存、数据、变量三者之间的关系
  • 内存是用来存储数据的空间
  • 变量是内存的标识
相关问题
1、问题:var a = xxx,a内存中到底保存的是什么?
  • xxx是基本数据,保存的就是这个数据
  • xxx是对象,保存的是对象的地址值
  • xxx是一个变量,保存的xxx的内存内容(可能是基本数据,也可能是地址值)
2、关于引用变量赋值问题
  • 2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据
  • 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调用函数传递变量参数时,是值传递还是引用传递
  • 理解1:都是值(基本/地址值)传递
  • 理解2:可能值传递,也可能是引用传递(地址值)
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、什么是函数
  • 实现特定功能的n条语句的封装体
  • 只有函数是可以执行的,其他类型的数据不能执行
2、为什么用函数
  • 提高代码复用

  • 便于阅读交流

3、如何定义函数
//1.函数声明
function fn1() 
	console.log(1)

//2.表达式
fn2 = function() 
	console.log(2)

4、如何调用(执行)函数
  • test():直接调用
  • obj.test():通过对象调用
  • new test():new调用
  • test.call/apply(obj):临时让test成为obj的方法调用
var obj = 
function test()
	this.xxx="atguigu"

//obj.test() 不能直接调用
test.call(obj) //相当于obj.test()
console.log(obj.xxx) // atguigu
5、回调函数
1、什么函数才是回调函数
  • 你定义的
  • 你没有调用
  • 最终它执行了
2、常见的回调函数
  • dom事件回调函数
  • 定时器回调函数
  • ajax请求回调函数
  • 生命周期回调函数
6、IIFE
1、理解
  • 全称:Imm-Invoked Function Expression
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是什么
  • 任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
  • 所有函数内部都有一个变量this
  • 它的值是调用函数的当前对象
2、如何让确定this的值
  • test():window
  • p.test():p
  • new test():新创建的对象
  • p.call(obj):obj
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属性
  • 每个函数都有一个prototype属性,它默认指向一个Object空对象(原型对象)
  • 原型对象中一个属性constructor,它指向函数对象
(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)内存构造(图)

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)总结
  • 函数的prototype属性:定义函数时自动添加的,默认值时一个空Object对象
  • 对象的_ _ proto _ _属性:创建对象时自动添加到,默认值为构造函数的prototype属性值
  • 程序员能直接操作显示原型,但不能直接操作隐式原型(ES6之前)

3、原型链

(1)原型链
  • 访问一个对象的属性值
    • 先在自身属性中查找,找到返回
    • 如果没有,再沿着 _ _ proto _ _ 这条链向上查找,找到返回
    • 如果最终没找到,返回underfined
  • 别名:隐式原型链
  • 作用:查找对象的属性(方法)

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)构造函数/原型实例对象的关系

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

(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是如何判断的?
  • 表达式:A instanceof B
  • 如果B函数的显示原型对象在A对象的原型链上,返回true,否则返回false
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)变量声明提升
  • 通过var定义(声明)的变量,在定义语句之前就可以访问到
  • 值:undefined
(2)函数声明提升
  • 通过function声明的函数,在之前就可以直接调用
  • 值:函数定义(对象)
var a = 3
function fn1() 
    console.log(a)
    var a = 4

fn1() //undenfine 变量提升,fn1函数相当于 var a; console.log(a); a = 4

console.log(b)

以上是关于javaScript学完js基础,顺便把js高级语法学了(尚硅谷视频学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章

js 之 箭头函数 (未学完)

学完JavaScript基础有感

js基础面试题131-160道题目

2022 年,学完 JS 高级后前端怎样规划学习路线?

你是怎么看完《JavaScript权威指南》《JavaScript高级程序设计》等这类厚书的?

javascript基础01