对象
对象包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。key是字符串,即使不是也会toString
对象结构:属性标签(writable/enumerable/configurable/value/get/set) [[proto]]原型-》原型链。。。[[class]] [[extensible]]
delete只能删除对象上的属性,不能删除原型链上的属性
数组
数组是值的有序集合。每个值叫做元素,每个元素在数组中都有数字位置编号,也就是索引。JS中的数组是弱类型的,数组中可以含有不同类型的元素。数组元素甚至可以是对象或其它数组。稀疏数组并不含有从0开始的连续索引。一般length属性值比实际元素个数大。
数组和一般对象相比
相同点:都可以继承。
数组是对象,对象不一定是数组。
都可以当做对象添加删除属性。
不同点:数组自动更新length
按索引访问数组常常比访问一般对象属性明显迅速。
数组对象继承Array.prototype上的大量数组操作方法
函数和作用域
函数是一块JavaScript代码,被定义一次,但可执行和调用多次。
JS中的函数也是对象,所以JS函数可以像其它对象那样操作和传递,因此我们也常叫JS中的函数为函数对象。
函数名+参数列表+函数体
this指向
全局对象:在浏览器中是window,在nodejs中是global
1、全局的 this指向全局对象
2、一般函数的 this指向全局对象 严格模式下的this指向undefined
3、作为对象方法的函数 this指向对象
4、对象原型链上的this指向对象
5、get/set方法中的this指向对象
6、构造器中的this指向对象
7、函数的call/apply方法中的this指向对象
8、函数的bind方法中的this指向对象
函数属性&arguments
Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。
foo.name--‐函数名 foo.length--‐形参个数 arguments.length--‐实参个数
未传参数,失去绑定关系,穿参数,存在绑定关系;严格模式下,绑定关系消失,arguments.callee不能使用。
apply/call方法
apply()null/underfined指向全局对象、true指向Boolean(true) 严格模式下传入什么就是什么
bind方法 改变函数运行时的this
bind与currying 函数拆分实现颗粒化
bind与new 将this初始化为空对象,执行赋值语句,忽略return语句。
作用域
JS没有块级作用域,全部都是全局作用域
函数有独立的作用域,利用函数作用域封装:(function() { var a, b;})(); !function() {var a, b;}();
eval特殊的作用域
作用域链,除了new Function()
不同调用方式
直接调用 foo()、对象方法 o.method()、构造器 new Foo()、call/apply/bind func.call(o);
不同创建方法:函数声明、函数表达式、函数构造器
函数声明eg function add(){};
函数表达式eg var add=function(){}; (function(){})(); return function(){}; var add=function foo(){};
函数声明和函数表达式的区别:
函数声明会被前置,也即在函数声明之前调用函数不会出错,在函数表达式之前调用函数会出错TypeError。
命名函数表达式:var add=function foo(){}; alert(func===nfe); IE6-8false、IE9+报错:nfe is undefined 可递归调用 var func=function nfe(){nfe();}
函数构造器var func=new Function('a','b','console.log(a+b);');很少使用
在计算机科学中,闭包(也称词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起。这个引用环境是一个存储该函数每个非局部变量(也叫自由变量)的表。
闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量。
闭包的优缺点 优点:灵活和方便、封装;缺点:空间浪费、内存泄漏、性能消耗。
变量对象(VariableObject,缩写为VO)是一个抽象概念中的“对象”,它用于存储执行上下文中的:1.变量 2.函数声明3.函数参数
变量初始化阶段----变量对象按照如下顺序填充:
1.函数参数(若未传.入,初始化该参数值为undefined)
2.函数声明(若发.生命名冲突,会覆盖)
3.变量声明(初始化变量值为undefined,若发.生命名冲突,会忽略。)
OOP JS面向对象编程
OOP特性:继承、封装、多态、抽象
正则表达式
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
eg:abc [a-z]{4} \d\d\d
/\d\d\d/.test("123")//true
/\d\d\d/.test("abc")//false
new RegExp("BOSN").test("Hi,Bosn")//true
特殊字符转义\
三个flag global匹配到所有的情况 ignoreCase不区分大小写 multiline跨行与否 设置/abc/gim.test("ABC");gim===global+ignoreCase+multiline RegExp("abc","mgi") mgi===multiline+global+ignoreCase
RegExp对象属性global/ignoreCase/multline/source
RegExp对象方法compile改变正则的规则和属性/exec匹配,返回相同的结构/test/toString
string类型与正则相关的方法 String.prototype.search位置 String.prototype.replace替换 String.prototype.match返回相同的部分 String.prototype.split分割