ES5-19 变量声命周期、垃圾回收原理、arguments

变量声命周期

垃圾回收

  1. 找出不再使用的变量
  2. 释放其占用内存
  3. 固定的时间间隔运行
  • 解除由于闭包产生的对fn AO的引用

标记清除

  • 排除全局变量、排除闭包引用的AO中的变量
  • 进入环境 → 离开环境
  • 常用

引用计数

  • 引用计数为0时清除
  • 对循环引用的情况,如果不手动接触引用(a = null),则无法清除

arguments

属性

  • 函数内部对应参数值的实参列表
  • 类数组对象 Array-like
  • 有属性callee,指向它的宿主函数
  • 属性Symbol(Symbol.iterator) 表示可迭代
  • constructor是Object
  • 有length属性
  • 属性下标从0开始
  • 没有数组的内置方法
  • 注意:箭头函数没有arguments
function test(a, b) {console.log(arguments) // 1 2 3console.log(Object.prototype.toString.call(arguments)) // [object Arguments]console.log(Array.isArray(arguments)) // false
}
test(1, 2, 3,)

在这里插入图片描述

普通对象是不可迭代的

在这里插入图片描述

  • 三个参数,迭代到第四个便完成了
function* generator(args) {for (var key in args) {yield key}
}
var it = generator(obj)
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
function test(a, b) {var it = generator(arguments)console.log(it.next())console.log(it.next())console.log(it.next())console.log(it.next())
}
test(1, 2, 3)

在这里插入图片描述

箭头函数内使用实参(es6弱化了arguments)

  • 严格模式让arguments和eval少了一些奇怪的行为。两者在通常的代码中都包含了很多奇怪的行为。

Strict mode makes arguments and eval less bizarrely magical. Both involve a considerable amount of magical behavior in normal code.

在这里插入图片描述
在这里插入图片描述

arguments的一些操作会阻止js引擎的优化

对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的Array构造函数作为一个函数
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

bluebird-petkaantonov

  • 多种方式将arguments转为新数组返回
function test() {var arr = []for (var v of arguments) {arr.push(v)}// return arr// return arguments.length === 1 ? [arguments[0]] : Array.from(arguments)return arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
}
console.log(test(1, 2, 3))

使用场景:

  1. 实参个数 > 形参个数
  2. 不定参数

形、实参的对应关系

Note: If you’re writing ES6 compatible code, then rest parameters should be preferred.
Note: “Array-like” means that arguments has a length property and properties indexed from zero, but it doesn’t have Array’s built-in methods like forEach() and map(). See §Description for details.

当非严格模式中的函数没有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值会跟踪参数的值(反之亦然)。

1. 形参中但凡有一个有默认值, 形、实参不再对应

function test(a = 100, b, c) {arguments[1] = 1000console.log(b, arguments[1]) // 2 100
}
test(1, 2, 3)

不统一的具体表现

1. ES6形参默认值

  1. 当实参为undefined时,形参若有默认值,便取默认值
function test(a = 100, b, c) {arguments[0] = 1000console.log(a, arguments[0]) // 100 1000
}
test()
  1. 形参、实参并不统一
function test(a = 100, b, c) {console.log(a, arguments[0]) // 100 undefined
}
test()
  1. 修改形参,便不再取默认值
function test(a = 100, b, c) {a = 666console.log(a, arguments[0]) // 666 1
}
test(1)

2. ES6使用展开运算符

function test(...args) {arguments[0] = 100console.log(args[0], arguments[0]) // 1 100
}
test(1)

3. ES6参数解构

function test({ a, b, c }) {arguments[0]['a'] = 100console.log(a, arguments[0]['a']) // 1 100
}
test({ a: 1, b: 2, c: 3 })

MDN: 注意: 在严格模式下,arguments对象已与过往不同。arguments[@@iterator]不再与函数的实际形参之间共享,同时caller属性也被移除。

4*. 严格模式下,怎么都不对应

function test(a, b, c) {'use strict'arguments[0] = 100console.log(a, arguments[0]) // 1 100
}
test(1)

5. ES5实参undefined

var test = function (a, b) {a = 1console.log(a, arguments[0]) // 1 undefined
}
test()
// 这个相当于es5无默认值
var test = function (a = undefined, b) {console.log(a, arguments[0]) // 100 100
}
test(100)

arguments

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj 1801: [Ahoi2009]chess 中国象棋【dp】

注意到一行只能放012个炮&#xff0c;我们只需要知道列的状态&#xff0c;不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮&#xff0c;有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdio> #include<iostream> using namespace std; const int N1…

vue --- compoent妙用

首先利用写一个静态模板的组件 <div id "app"><my-arti></my-arti> </div> <script>Vue.component(my-arti,{template:<div style"border:1px solid black"><span>date:2019年06月14日</span><br>…

ES5-20 复习

3-1 变量单一声明方式String Boolean undefined Number nullundefined nulltypeof(null) ‘object’typeof(方法) ‘function’typeof() 是运算符&#xff0c;不是数据类型 报错0 -0 trueInfinity -Infinity falseNaN和谁都不等原始值没有属性 要打印属性、调用方法得经过基…

eclipse中去掉警告提示

有时候我们要去掉这些不必要的提示 下面我们来设置去掉这些警告提示 转载于:https://www.cnblogs.com/xiaostudy/p/9370016.html

vue --- vue-router

vue-router的CDN <script src "https://unpkg.com/vue-router2.5.3/dist/vue-router.js"></script>// 当然还需要导入vue的cdn <script src"https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>使用router-link(to)添加点击链…

django-restframework使用

安装restframework: pip install djangorestframework 修改项目settings.py: INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,rest_framework, ]修改项…

JSON基础与数据解析、JSON方法、AJAX初识

JSON JavaScript Object Notation js对象标记是对象&#xff0c;是轻量级数据交互的格式&#xff0c;不能有方法它基于 JavaScript 语法&#xff0c;但与之不同&#xff1a;JavaScript不是JSON&#xff0c;JSON也不是JavaScript映射用:隔开并列数据用,隔开映射的集合用{}包裹键…

iOS开发经验总结

在iOS开发中经常需要使用的或不常用的知识点的总结&#xff0c;几年的收藏和积累&#xff08;踩过的坑&#xff09;。 一、 iPhone Size 二、 给navigation Bar 设置 title 颜色 123UIColor *whiteColor [UIColor whiteColor];NSDictionary *dic [NSDictionary dictionaryWit…

http --- 缓存

Web缓存: // 是可以自动保存常见文档副本的HTTP设备. // 当Web请求抵达缓存时,如果本地有"已缓存的"副本,就可以从本地存储设备而不是原始服务器中提取这个文档.冗余的数据传输: // 有很多客户端访问一个流行的原始服务器页面时,服务器会多次传输同一份文档 // 每次…

Django 下添加左侧字段显示和搜索

在对应的apps下建立xadmin.py from .models import EmailVerifyRecord import xadminclass EmailVerifyRecordAdmin(object): list_display [code,email,send_type,send_time]//字段显示 search_fields [code,email,send_type]//搜索 xadmin.site.register(EmailVerify…

免费分享老男孩全栈9期视频,共126天

免费分享老男孩全栈9期视频&#xff0c;共126天。 及时保存避免失效&#xff1a;http://mihon.cn/article/26.html/ 转载于:https://www.cnblogs.com/mihon/p/9372881.html

ES5 数组扩展方法 forEach/filter/map的使用与重写

ES3 splice slice join sort &#xff08;IE5、IE6&#xff09; 数组扩展方法 ES5&#xff08;在ES3的基础上增加、修正&#xff09; forEach 可能会改变原数组(直接操作了arr[i]&#xff0c;没有使用深拷贝)参数1&#xff1a;回调函数&#xff08;如果不使用箭头函数&#xf…

http --- 网关、隧道、中继

网关: // 作为某种翻译器使用,抽象出了一种能够到达的资源 // 应用程序可以请求网关来处理某条请求. // 在HTTP和其他协议及其应用程序之间起到接口作用FTP URL的HTTP请求: GET ftp://ftp.irs.gov/pub/00-index.txt HTTP/1.0 Host: ftp.irs.gov User-agent: SuperBrowser 4.2…

状态码

服务器向用户返回的状态码和提示信息&#xff0c;常见的有以下一些&#xff08;方括号中是该状态码对应的HTTP动词&#xff09; 200 OK - [GET]&#xff1a;服务器成功返回用户请求的数据&#xff0c;该操作是幂等的&#xff08;Idempotent&#xff09;。 201 CREATED - [POST/…

187. Repeated DNA Sequences重复的DNA子串序列

&#xff3b;抄题&#xff3d;&#xff1a; All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. Write a fun…

http --- cookie与会话跟踪

以购物网站Amazon.com为例 // (a)客户端:首次请求Amazon.com根页面 GET / HTTP/1.0 Host: www.amazon.com// (b)服务器:将客户端重定向到一个电子商务软件的URL上 HTTP/1.1 302 Found Location: http://www.amazon.com:80/exec/obidos/subst/home/redirect.html// (c)客户端:对…

ES5 every/some/reduce/reduceRight的使用与重写

被作为实参传入另一函数&#xff0c;并在该外部函数内被调用&#xff0c;用以来完成某些任务的函数&#xff0c;称为回调函数。 break、return用于终止循环的区别&#xff1a; return只能用在函数体内&#xff08;单独一个for循环里直接用return会报错&#xff09;对于多层循环…

同步异步单线程多线程初级理解

对于我开始接触同步异步单线程多线程的概念的时候&#xff0c;都是分别理解同步和异步、单线程和多线程概念&#xff0c;当看到“使用同步方法保证线程安全”时愚昧的理解为那就是单线程咯&#xff1b;于是就陷入了困惑&#xff0c;同步等于单线程吗&#xff1f;下面是我自己不…

http --- 基本认证与摘要认证

基本认证: // (a)客户端:查询 GET /cgi-bin/checkout?cart17854 HTTP/1.1// (b)服务器:质询 HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm"Shopping Cart"// (c)客户端:响应 GET /cgi-bin/checkout?cart17854 HTTP/1.1 Authorization: Basic YnJpYW4…

对栈

1331【例1-2】后缀表达式的值 #include<bits/stdc.h>using namespace std;int sta[101];char s[256]; int comp(char s[256]){ int i0,top0,x; while(i<strlen(s)-2) { switch(s[i]) { case:sta[--top]sta[top1];break; case-:sta[--top]-sta[top1];break; case*:sta[…