摘要:
浅拷贝和深拷贝是针对数组和对象而言的。对象的浅拷贝只复制了一层对象的属性,对于Array和Object这些引用类型值拷贝的是一个在内存中的地址。而深拷贝会把对象的属性通过递归的方式逐个复制,包括引用类型值。 浅拷贝 深拷贝 【方法1】 【方法2】 使用JSON全局对象的parse和stringify 阅读全文
摘要:
JavaScript有一套良好的规则用来存储变量,方便变量的查找,这套规则被称作作用域。 作用域的内部原理分为编译、执行、查询、嵌套和异常5个部分,下面对这5部分进行详细介绍。 编译 编译过程有3步:分词、解析和代码生成。下面以 为例进行这3个过程的说明。 分词(tokenizing) 把字符串分解 阅读全文
摘要:
属性描述符用于描述对象的值是否可配置、是否可修改、是否可枚举。 描述符类型 对象的属性描述符的类型分为两种:数据属性和访问器属性。 数据属性 数据属性包含一个数据值的位置,该位置可读取和写入值。数据属性有4个特性。 【configurable】configurable表示可配置性,它决定了是否可以用 阅读全文
摘要:
定义 JavaScript的数据类型包含Undifined、Null、Boolean、Number、String和Object。对象和其他5种数据类型是不同的,其他5种是简单值,对象是一种复合值,可以把许多值聚合在一起,并通过名字访问这些值。 对象是属性的无序集合,每个属性都是一个名值对。属性名是字 阅读全文
摘要:
对象的属性操作包括属性查询、属性设置、属性删除和属性继承。 属性查询 属性查询有两种方式:点运算符和方括号运算符。 【点运算符】使用点运算符访问对象属性时,属性名用一个标识符来表示,属性名必须符合变量命名规则,否则会报错。 【方括号运算符】使用方括号运算符访问对象属性时,属性名用一个字符串表示。方括 阅读全文
摘要:
惰性函数和普通函数的区别是它的执行分支只在函数调用时执行一次,调用过程中函数会被另一种合适的执行方式覆盖,所以后面再调用这个函数时,就不会再执行分支语句。 使用场景 为了兼容各大浏览器,经常会在函数内部写大量if语句来检侧浏览器特性。比如为dom节点添加事件函数。 上面的函数会在每次执行点击事件时, 阅读全文
摘要:
函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名。 定义 currying又称部分求值。柯里化函数首先会接受一些参数,参数接收之后不会立即求值,而是继续返回一个新的函数, 阅读全文
摘要:
函数防抖 函数防抖就是短时间内频繁触发的事件或函数,指定时间间隔内频繁触发会被忽略掉。 比较常见的如搜索联想功能,如果打字很快,这期间不需要调用后台接口。 函数节流 函数节流是使短时间内连续执行的事件或函数,变为固定时间间隔执行。 比较常见的比如疯狂点击轮播图的按钮时,轮播图依旧按照指定的轮播时间执 阅读全文
摘要:
定义 高阶函数指操作函数的函数。高阶函数需要满足两个条件:函数可以作为参数被传递;函数可以作为返回值输出。 参数传递 日常开发中,把函数作为参数传递是很常见的情况,通常为了分离出容易变化的业务逻辑,会这部分逻辑放到一个函数参数里。 【回调函数】一个常见的场景,在使用ajax请求数据时,通常把一个回调 阅读全文
摘要:
JS中函数定义时不需要指定参数的类型,函数调用时也不会对传入的参数进行类型检查,甚至参数的个数也不做检查,了解这些特殊情况,避免开发出错。 参数个数 当实参比形参的个数少时,多余的形参会被设置成undefined。 当实参比形参的个数多时,多余的实参在函数中无法直接获取到,可以通过arguments 阅读全文