一. 字面量,Object,工厂,构造函数区别。
字面量:
对象字面值是封闭在花括号对({})中的一个对象的零个或多个”属性名:值”列表。
对象字面量的值可以是任何数据类型包括数组字面量,函数,嵌套的对象字面量
var Swapper = {
// 数组字面量(用逗号分隔,所有都要加引号)
images: ["smile.gif", "grim.gif", "frown.gif", "bomb.gif"],
pos: { //嵌套对象字面量
x: 40,
y: 300
},
onSwap: function() { //函数
}
};
创建对象的两种方法:
使用字面量方法创建对象:var student = {name: “张三”};
使用内置构造函数创建对象:var student = new Object(); student.name = “张三”。
应该尽量使用字面量发创建对象,其显著优点在于它只需要输入更少的字符,除此之外,还有几点原因:选择字面量法创建对象强调该对象仅是一个可变的hash映射,而不是从对象中提取的属性或方法。
与使用Object构造函数相比,使用字面量好处在于它并没有作用域解析。因为可能当以同样的名字创建一个局部函数,解释器需要从栈中调用Object(0的位置开始一直向上查询作用域链,直到发现全局Object构造函数。)
构造函数Object仅接受一个参数,并且还依赖传递的值,该Object()可能会委派另一个内置函数来创建对象,并且返回了一个并非期望的不同对象。(还不确定这句话是否是对的,如果不对希望广大网友帮忙改正)如将数字、字符串、布尔值当做参数传递给Object构造函数,其结果是获得了以不同构造函数所创建的对象,例如:
var oschina = new Object(1); ochina.constructor
ochina.constructor为Number;
传递的值是动态的,直到运行时才确定其类型,这种行为会导致意想不到的结果。
虽然可以使用前面介绍的任何一种方法来定义对象,但开发人员更青睐对象字面量语法,因为这种语法要求的代码量少,而且能够给人封装数据的感觉。实际上,对象字面量也是向函数传递大量可选参数的首选方式。
转载了一个小伙伴的解释,谢谢,原文链接:https://blog.csdn.net/YukyCookie/article/details/53369640
Object:对象。
工厂: 缺点:没有new 函数重复----资源浪费 。
构造函数:实例化后的对象,每个对象的信息不共享。
二、原型
原型:Javascript中的继承的基础,我们可以把一个函数的所有对象公共的属性和方法放入到函数的原型中。通过原型来添加方法,解决数据共享,节省内存空间。
1.需要共享的数据就可以写原型中,比如需要共享的属性和方法
2.不需要共享的数据写在构造函数中
原型: prototype和__ proto __。
学会画和理解原型链。-----理清关系
- 任何函数都具有一个 prototype 属性,该属性是一个对象
- 构造函数的 prototype 对象默认都有一个 constructor 属性,指向 prototype 对象所在函数
- 通过构造函数得到的实例对象内部会包含一个指向构造函数的 prototype 对象的指针 __ proto __
- 所有实例都直接或间接继承了原型对象的成员
- 构造函数的原型对象(prototype)中的属性和方法是可以被实例对象直接访问的 *所有
函数都有 prototype 属性对象。
三. 函数自调用
自调用函数作用:开启一个新的作用域,可以防止变量命名污染的问题.
注意点:
1.如果存在对哦个自调用函数要用分号分割,否则语法错误报错。
2.当自调用函数,前面有匿名函数时,会把自调用函数作为参数(其实会匿名函数和自调用函数中的空格去掉)。
3.代码规范,建议在自调用函数前加分号。
虽然在自调用函数中的变量是局部变量,但是我们仍然可以通过window将自调用函数中的局部变量变为全局变量:
1.写成没有var的全局变量;2、传一个值window;
应用:贪吃蛇案例。
js代码的压缩在对应网站压缩
四、函数内 this
指向的不同场景
五、 继承
原型链*****重要
面向对象的特性:封装,继承,多态
*原型作用之一:数据共享,节省内存空间
*原型作用之二:为了实现继承
改变原型指向----继承
Student.prototype=new Person();
//不传值
属性成员的搜索原则 总结:
- 先在自己身上找,找到即返回
- 自己身上找不到,则沿着原型链向上查找,找到即返回
- 如果一直到原型链的末端还没有找到,则返回 undefined
六、函数进阶
函数声明与函数表达式的区别:
1.函数声明必须有名字
2.函数声明会函数提升,在预解析阶段就已创建,声明前后都可以调用
3.函数表达式类似于变量赋值
4.函数表达式可以没有名字,例如匿名函数
5.函数表达式没有变量提升,在执行阶段创建,必须在表达式执行之后才可以调用
所有的函数实际上都是Function的构造函数创建出来的实例对象。
了解call、apply、bind:作用可以改变函数this的指向
常见的伪数组:
- 函数内部的
arguments
- DOM 对象列表(比如通过
document.getElementsByTags
得到的列表) - jQuery 对象(比如
$("div")
)
函数递归斐波那契数
函数闭包
七、JS垃圾回收机制
八、深浅拷贝
浅拷贝:就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或者方法,都可以使用。
深拷贝:拷贝还是复制,深:把一个对象中所有的属性或者方法,一个一个的找到.并且在另一个对象中开辟相应的空间,一个一个的存储到另一个对象中。
九、 正则表达式简介