
JavaScript与ES特性
Kousaka-Mayuri
学
展开
-
JS连等机制
● 连等是从右向左开始执行 ● 连等时引用不变,指向在连等结束后发生变化 var a = {n:2};//指向{n:2} var b = a;//引用 a.x = a = {n:1};//此时在执行过程中,a仍然指向{n:2}这块内存 console.log(a);//{n:1} console.log(b);//{n:2,x:{n:1}} ...原创 2021-12-24 12:03:15 · 1618 阅读 · 0 评论 -
JS 深拷贝和浅拷贝
浅拷贝 基本类型赋值,引用类型赋值堆地址 function shallowCopy(variable){ var result ={}; for(var i in variable){ if(variable.hasOwnProperty(i)){ result[i] = variable[i]; } } return result; } 深拷贝 在堆中再开辟一块内存进行拷贝,将需要拷贝的内容新建一个存放在内存中,然后再把地址赋给变量 function d原创 2021-11-18 19:11:06 · 482 阅读 · 0 评论 -
JS V8执行机制
编译型和解释型语言 编译型 通过编译将代码最终转换为二进制文件存储本地,方便以后执行。不再需要编译 C++与GO等 解释型 每次执行都需要编译,经历动态解释而执行 JS、PY等 解释型语言在最终执行需要经历以下步骤 源代码-AST-字节码 AST抽象语法树 首先将源代码转化为抽象语法树,并生成执行上下文 https://resources.jointjs.com/demos/javascript-ast 可以使用上述网站查看一段JS代码如何转换为AST 分词 词法分析,将源码拆解为一个个不可再分的单个字符或原创 2021-11-15 20:22:49 · 587 阅读 · 0 评论 -
JS 垃圾回收机制
ESP 记录当前执行状态的指针,指向当前运行状态的执行上下文,当它下移时,会将之前的执行上下文销毁,即清理调用栈的垃圾 调用栈的变量虽然得到了回收,但是堆内的引用类型变量却一直存放在堆中,这时需要JS的垃圾回收器来处理 代际假说 ● 因为变量在内存中被访问的时间是很短暂的,所以就使用这样的机制,通过一次访问就变得不可访问 ● 不可销毁的对象则停留时间更久 新生代和老生代 ● 副垃圾回收器处理新生代的回收 ● 主垃圾回收器处理老生代的回收 活动对象是正在使用的对象,非活动对象是需要回收的垃圾 标记空间中的活原创 2021-11-15 20:19:09 · 436 阅读 · 0 评论 -
JS Promise
new Promise(function(resolve,reject){ console.log("Run"); }); resolve和reject都是函数,调用resolve(又称fulfilled)代表正常,reject代表异常,还有一个pending代表进行中, 通过回调函数的不同(resolve,reject,pending)来给Promise对象上对应的状态 new Promise(function (resolve,reject){ console.log(1); re原创 2021-11-02 19:03:19 · 94 阅读 · 0 评论 -
JS Set特性
类似于数组的特性,可以个别类似哈希表的问题。 Set内元素不重复,如果使用含有重复数据的数组进行初始化,会造成重复数值排除的现象 new Set([1,2,3,4,4]).size //4原创 2021-10-21 10:11:55 · 187 阅读 · 0 评论 -
JS Let和Var的区别
let所在的代码块有效 var有变量提升 作用域与全局变量 var a = []; for(let i = 0;i<5;i++){ a[i] = function(){ console.log(i); } } a[3]();//3 var a = []; for(var i = 0;i<5;i++){ a[i] = function(){ console.log(i); } } a[3]();//5 这是为什么,因为let仅在所在作用域有效,即每次循环中,所以每个循环都原创 2021-10-21 10:11:23 · 175 阅读 · 0 评论 -
JS块级作用域与闭包
作用域 作用域即是一套变量访问规则,规则内容包含如何存储和访问变量。 (图片引用自https://lucifer.ren/fe-interview/#/topics/js/scope&closures) 当一段代码执行时,大概会经历以下几个步骤: JS源码通过语法分析,转化为tokens tokens经过语义分析,转化为AST(抽象语法树) AST会被转换为字节码 JS运行时开始运行字节码 运行到函数声明或者变量时,引擎发送一个RHS(或LHS),会问scope chain(作用域),函数或变量原创 2021-10-21 10:09:31 · 219 阅读 · 0 评论 -
JS类型变量与值
ECMAScript规范的类型共有六种:Undefined、Null、Boolean、String、Number和Object ES6添加的新类型:Symbol 基本类型和引用类型的区分方式是是否可以表示为固定长度。 除了Object之外的类型皆为基本类型,基本类型存放在栈上,引用类型存放在堆上。 Object无法预知长度,并且可以mutate,所以划分为引用类型。 Number JS没有真正的整数,使用的number类型数值都是浮点数。 JavaScript明确说明过使用的都是“双精度”(64位二进制)原创 2021-10-21 10:08:12 · 94 阅读 · 0 评论 -
JS引用和操作符优先级
var a = {x : 1}; var b = a; a = a.x = {x : 1}; console.log(a);// {x:1} console.log(b);// {x:{x:1}} 前面谈到,基础类型变量是放在栈中,引用类型放在堆中。 变量a在栈中开辟地址,指向堆中的{x:1}变量 变量b在栈中开辟地址,指向堆中a指向的{x:1}变量 堆中的a.x根据代码指向了堆中新建的变量{x:1},并最后给a赋值为该变量。 而此时b的指向并没有发生变化,所以b的指向是{x:{x:1}} a即为刚原创 2021-10-21 10:05:54 · 121 阅读 · 0 评论 -
JS原型和继承
proto JS继承的原理是prototype JS中存在一些全局内置函数,Function、Object、Array。 所有的数组、Object、函数对象,都是由对应的全局内置函数创建的 1.__proto__ === Number.prototype;// true '1'.__proto__ === String.prototype;// true true.__proto__ === Boolean.prototype;// true 原型链 当访问一个对象的属性时,倘若没有该值,则会沿着该对象的原创 2021-10-21 10:03:34 · 97 阅读 · 0 评论 -
JS this指针
引子 var name = "Heternally"; var obj = { name: "zl", foo: function() { console.log(this.name); } }; var foo = obj.foo; obj.foo(); // "zl" foo(); // "Heternally" 为什么结果会不一样,因为obj.foo()运行在obj的环境之下,所以this指针指向的是obj内部的作用域。而foo()运行在全局环境下,在非严格模式下this指向原创 2021-10-21 10:02:47 · 97 阅读 · 0 评论 -
JS高阶函数
高阶函数函数接受函数作为形参,调用并返回。 function sum(a){ return a+1; } function sumplus(a,b,f){ return f(a) + f(b); } return sumplus(1,2,sum); 还有一些设定好的高阶数组,例如filter、reduce和map。 filter const persons = [ {"name":"hello"}, {"name":"happy"}, {"name":"enjoyDay"} ]; c原创 2021-10-21 10:00:08 · 106 阅读 · 0 评论