console.log(Number(null));//0
console.log(Number(undefined));//NaN
console.log(Number(true));//1
console.log(Number(false));//0
console.log(parseInt(true));//NaN
console.log(parseInt("11true?"));//11
console.log(parseInt("true"));//NaN
console.log(parseInt(123.2));
//不是数字的非法字符串 ->NaN
//空/全是空格的字符串:->NaN
// null->0
// undefined->NaN
//true->1 false->0
P4
- 什么是数据
存储在内存中代表特定信息的 本质上是01串
数据的特点:可传递、可运算
一切皆数据 - 什么是内存
内存条通电以后产生的可存储数据的空间(临时的)
内存产生和死亡:内存条(电路板)->通电->产生内存空间->存储数据->处理数据->断电,内存空间和数据都消失
一个小内存的两个数据:
内部存储的数据
地址值
内存分类:
栈:全局变量/局部变量,
堆:对象 - 什么是变量
可变化的量,由变量名和变量值组成,每个变量都对应一个小内存,变量名用来找到查找对应的内存。变量值就是内存中保存的数据。 - 数据、内存、变量的关系‘
’
JS引擎如何管理内存:
-
内存生命周期
分配小内存空间,得到他的使用权
存储数据,可以反复进行操作
释放小内存空间 -
释放内存
局部变量:函数执行完释放
对象:成为垃圾对象->由垃圾回收器回收
P7: -
什么是对象?
多个数据的封装体
用来保存多个数据的容器
一个对象代表现实世界的一个事物 -
为什么要使用对象
统一管理多个数据 -
对象的组成
属性:属性名(字符串)和属性值(任意类型)
方法:一种特别的属性 属性值是函数 -
如何访问对象内部数据
.属性名:编码简单,有时不能用
[属性名字符串]:通用 -
属性名包含特殊字符:- 空格
-
变量名不确定
-
什么是函数?
具有特定功能的n条语句的封装体
只有函数是可以执行的,其他类型的数据不能执行 -
为什么要用函数?
-
如何定义函数?
-
如何执行调用函数?
直接调用:test()
通过对象调用:Obj.test()
New调用:
test.call(obj)/apply(obj)调用:临时让test成为obj的方法进行调用
回调函数:
- 什么函数才是回调函数?
你定义的
没有调用
最终执行了 - 常见的回调函数?
dom事件的回调函数
定时器回调函数(超时定时器、循环定时器)
Ajax请求
生命周期回调函数
IIFE:
Immediately invoked function expression
- 理解:
- 作用
隐藏实现
不会污染外部命名空间
this:
- this是啥
任何函数本质上都是通过对象来调用,如果没有指定,就是window。
所有函数内部都有一个变量this ,它的值是调用当前函数的对象。 - 如何确定this是谁?
如果没有指定,就是window。
指定就是调用的对象
test():window
p.test():p
new test() :新建的对象
p.call(obj):obj
关于语句分号的问题
1.在以下两种情况下不加分号会有问题:
小括号开头的前一条语句
中方括号开头的前一条语句
函数高级
- 原型链
- 执行上下文和执行上下栈
- 作用域与作用域链
- 闭包
原型链
-
原形prototype
-
显示原形和隐式原形
-
原型链
-
探索instanceof
-
面试题
-
函数的prototype属性
每个函数都有一个prototype属性,它默认指向Object空对象(原型对象)
原型对象中有一个construtor指向函数对象 -
给原型对象添加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)
显式原型和隐式原型: -
每个function都有一个prototype,即显式原型
-
每个实例对象都有一个__proto__,可称为隐式原型
-
对象的隐式原型的值为其对应构造函数的显式原型的值
-
内存结构
-
总结:
函数的显式prototype属性,在函数定义时自动添加的,默认是一个空的Object对象
对象的__proto__属性,在创建对象时自动添加的,默认值为构造函数的prototype属性
程序员能直接操作显式原型,但不能直接操作隐式原型
所有函数都是Function的实例(包含Function)
Object的原型对象是原型链的尽头
- 读取对象的属性时,会自动到原型链中查找
- 设置对象的属性值时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
- 方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
执行上下文和执行上下栈:
-
变量声明提升
通过var声明的变量,在定义语句之前就可以访问到
值:undefined -
函数声明提升
通过function声明的函数,在之前就可以直接调用
值:函数定义(对象) -
问题:变量提升和函数提升是如何实现的?
-
代码分类:
全局代码和函数代码 -
全局执行上下文:
在执行全局代码前将window确定为全局执行上下文
对全局数据进行预处理
*var定义的全局变量->undefined,添加为window的属性
*function声明的全局函数->赋值fun,添加为window的方法
*this->赋值(window)
*开始执行全局代码 -
函数执行上下文
在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
对局部数据进行预处理
*形参变量->赋值(实参)->添加为执行上下文的属性
*对局部数据进行预处理
作用域与作用域上下文的区别与联系
执行上下文是从属于所在的作用域的
循环遍历加监听
闭包