作用
在 Web 页面上实现复杂的功能,使用函数等进行动态页面创建
eg: 滚动的视频播放器、提示框显示、按钮登录
特点
解释型语言,博主更喜欢称之为即时性语言,即js内部使用JIT(just-in-time),使得运行速度大幅提升
动态语言:最大特点,不确定变量类型
eg: number + string -> string, 类型自动转换
let a, b;
a = 100;
b = "200";
console.log(a + b); //100200
LINK: JavaScript 类型转换 (w3school.com.cn)
JIT (just-in-time)
JS最初为典型解释性语言,运行速度慢,及后来浏览器在 JavaScript engine 中加入一个 monitor,用来观察运行的代码。并记录下每段代码运行的次数和代码中的变量的类型。
标记少数重复与多次重复代码,以“概率”模式进行先前判断
LINK: A crash course in just-in-time (JIT) compilers
Hoisting(变量提升)
JS在执行程序前,会先收集所有变量(不同作用域对应不同类型变量),再执行代码
Var类型(拥有变量提升),变量类型定义会直接附着在Window中,先使用变量 -> 得到undefind
var a;
let b = 999;
const c = 666;
console.log(window);
console.log(window.a === a); //true
Let和Const(不拥有),在块范围中的变量定义之前使用它时,得到错误。
console.log(a);
{
a = 200;
console.log(a);
}
var a = 100;
console.log("=======var使用");
console.log(b);
{
b = 200;
console.log(a);
}
let b = 100;
扩充:
编译(Compiler):
- 优点:不需要重复编译,并且可以在编译时对代码做优化
- 缺点:需要提前编译
解释(Interpreter)
- 优点:快速执行,不需要等待编译
- 缺点:相同的代码可能被翻译多次,比如循环内部的代码
JS的使用有着各种不同的方向,同时所涉及的知识点也是各种各样的,如: TDZ(暂时性死区)、Boxing & Unboxing(装箱 & 拆箱)、Primitive(原型)、 Closure(闭包)等,希望大家在日后可以共同进步
LINK: 变量提升 && 暂时性死区