你不能不知道的Js
2020-07-19 本文已影响0人
Lethe35
编程语言&脚本语言
编程语言:有变量有函数有数据结构,可以进行基本的运算。(JS,Java…)
脚本语言:CSS,HTML
1.浏览器组成
shell部分
内核部分 渲染引擎,js引擎,其他模块
2.主浏览器(有一定的市场份额>3%左右;有独立研发的内核)及其内核
Chrome:Webkit/blink
Firefox:Gecko
IE: Trident
Opera:Presto
Safari:Webkit
3.js逼格:
解释性语言(都一行翻译一行成机器码,php,python ----跨平台)(c语言,c++是编译性语言-全读完,一次性编译成某种类型文件)(JAVA是先通过javac编译成.class文件,然后通过jvm翻译成机器码,可跨平台)
单线程 就是同一时间只能一个方块移动,但是我们看到两个同时移动的方块该怎么解释呢?轮转时间片:
image.png
(第一个方块挪了1ms甚至是更小的时间单位,接着换第二个方块挪1ms,一直下去,因为时间差太小,肉眼察觉不出)
ECMA标注
4.JS三大部分
ECMAScript、DOM、BOM
5.如何引入js
- 页面内嵌<script></script>标签
- 外部引入<script src="location"></script>
为符合Web标准(w3c标准中的一项)结构、样式、行为相分离,通常会采用外边引入
6.数据类型
原始值 (栈数据)赋值就是拷贝
Number、String、Boolean、undefined、null
引用值 (堆数据)
Array、Object、Function、date、RegExp ……
7.js语句基本规则
- 语句后面要用分号结束;
- js语法错误会引发后续代码终止,但不会影响其他js代码块;
- 书写格式要规范,“= + / -”两边都应该有空格
8.运算操作符
- “+” 数学运算,字符串连接;任何数据类型加字符串都等于字符串;
- “-”,“*” ,“/” ,“%”,“=”, “()”
- “=”优先级最弱,“()”优先级较高
- “++”,“--”,“+=”,“-=”,“/=”,“*=”,“%=”
赋值的顺序 自右向左,运算的顺序 自左向右
9.比较运算符
- “>”,“<”,“==”,“>=”,“<=”,“!=”
- 比较结果为Boolean值
- 字符串比较的是ASCII码
10.逻辑运算符
- “&&”, “||”, “!”,
- 运算结果为真实的值
10.被认定为false的值
- undefined,null,NaN,"",0,false
- NaN === NaN 结果为false
11.循环

12. wiondow.xxx = xxx 与 return xxx的区别
拿闭包来说,内部函数被return出来之后必须要拿个全局变量保存;但对于window.xxx的xxx来说,它已经是全局变量了,所以把return xxx换成window.xxx=xxx是一样的效果,非要说个区别的话就是xxx不用再用全局变量保存了

12. ?: 和 ?? 操作符
?: 可选链式操作符
?? 空值合并符(js新特性)
let c = a ?? b;
// 等价于
let c = a !== undefined && a !== null ? a : b;
13. new实例化对象都做了什么?
- 调用函数
- 自动创建一个对象
- 把创建出来的对象和this进行绑定
- 如果构造函数没有返回值,则隐式地返回this对象
14. this在不同调用环境下的指向
- 事件调用环境:谁触发,指向谁
- 全局环境:浏览器 ->window;node ->module.exports;
-
函数内部:
1)【this最终指向的是调用它的对象】
2)【函数被多层对象所包含,如果函数被最外层调用,this指向的也只是它上一层的对象】
3)【构造函数中的this指向的是实例对象】
4)【如果构造函数中有return,并且return的值是对象,则this指向返回的对象;如果return的不是对象,则this保持原来的规则(这里null比较特殊)】 - 箭头函数:箭头函数本身没有this和arguments[],在箭头函数中引用的this实际上调用的是上一层作用域的this
15. [[scope]]是个啥?
- 函数创建时生成的一个js内部的隐式属性
- 函数存储作用域链的容器
作用域链:GO/AO
GO
-> 全局执行期上下文;AO
->函数执行期上下文。AO
是一个即时的存储容器,函数执行完就会销毁,每次执行都会生成一个新的AO
。
⭐每个函数在被定义时的作用域链中都包含GO
,在函数预编译(执行前一刻)会生成一个AO
,存储在函数作用域链的最顶端,然后在函数中查找变量都是自顶向下的
⭐当外部函数a包含内部函数b时,当a函数执行,b函数就会被定义,此时b函数的作用域链就是就是a函数的作用域链。当内部函数b被外部函数return到外部并被全局变量接收保存时就形成了闭包,a函数执行完a函数的作用域链会被销毁,但是在a执行完时b函数被return到全局,b还拽着a函数的作用域链,所以闭包会导致原来的作用域不释放,过度的闭包可能会导致内存泄漏或加载缓慢
⭐GO
:找变量声明 -> 找函数声明 -> 执行(GO=window)
⭐AO
:找形参和变量声明 -> 实参赋值给形参 -> 找函数声明、赋值 -> 执行