目录
可以将函数声明成全局变量解决方法空间浪费,但是会产生方法冗余问题
基本数据类型
变量和值保存在栈区,没有方法和属性可以调用
基本包装类型
为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型Boolean, Number, String,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型对象,从而可以调用一些方法操作这些数据。
1、String
var str='hello';
str.split("");
面试题:(基本包装类型)后台js会自动执行
1.创建一个String类型的一个实例--自动装箱
var str=new String(); //将str基本数据类型包装成了一个String引用类型
2.在实例上调用指定的方法
str可以调用String.prototype.方法
3.销毁这个实例 --自动拆箱
str=null; //回归基本数据类型,String类型变成了string类型,但还可以访问到
2、Number
3、Boolean
String.prototype的属性和方法
str.length | 返回字符串长度 |
str.charAt(index) | 返回指定位置i的字符 |
str.charCodeAt(index) | 返回指定位置i的字符编码 |
str.concat(str1) | 连接字符串 |
str.slice(开始位置,结束位置) | 截取并返回字符串,不包括结束位置的字符 |
str.substring(开始位置,结束位置) | 截取并返回字符串,不包括结束位置的字符 |
str.substr(开始位置,截取字符个数) | 截取字符串 |
str.trim() | 删除前置以及后置中的所有空格,返回结果 |
str.toLowerCase() | 转换为小写 |
str.toUpperCase() | 转换为大写 |
str.indexOf('x') | 从前往后查找指定字符所在第一个位置 空格也算一个字符 |
str.lastIndexOf('x') | 从后往前查找字符串所在第一个位置,可以有第二个参数,代表从字符串中哪个位置开始查找。 |
Math对象
Math.min(num,num,num) | 求一组数(整数或小数,数组不行)中的最大值 |
Math.max(num,num,num) | 求一组数中的最大值 |
Math.ceil(num) | 向上取整(3.1-4) |
Math.floor(num) | 向下取整(3.9-3) |
Math.round(num) | 四舍五入 |
Math.random() | 返回大于0小于1的一个随机数 [0,1) |
Math.random()*10 | 返回大于0小于10的一个随机数 [0,10) |
parseInt(Math.random()*10) | 返回大于0小于10的一个随机整数 [0,10) |
abs(num) | 返回num绝对值 |
exp(num) | 返回Math.E的num次幂 |
log(num) | 返回num的自然对数 |
pow(num,power) | 返回num的power次幂 |
sqrt(num) | 返回num的平方根 |
scos(x) | 返回x的反余弦值 |
asin(x) | 返回x的反正弦值 |
atan(x) | 返回x的反正切值 |
atan2(y,x) | 返回y/x的反正切值 |
cos(x) | 返回x的余弦值 |
sin(x) | 返回x的正弦值 |
tan(x) | 返回x的正切值 |
Date对象
var date=new Date();
date.getFullYear() | 返回年份 如2020 |
date.getMonth() | 返回日期中的月份数,返回值0(1月)-11(12月) |
date.getDate() | 返回是日期对象中的几号 |
date.getHours() | 返回日期中的小时 |
date.getMinutes() | 返回日期中的分钟数 |
date.getSeconds() | 返回一个日期的秒数 |
date.getDay() | 返回日期中的星期几 |
date.getMilliseconds() | 返回日期中的毫秒数 |
date.getTime() | 将一个日期对象以毫秒形式返回(从1970开始) |
四种模式
批量创建对象,封装创建对象的函数,提高代码复用性。
工厂模式
缺点:
创建出来的对象都是Object类型,无法区分对象种类。
创建多少个实例,对象中的函数就在堆区创建多少个引用地址,造成空间浪费。
可以将函数声明成全局变量解决方法空间浪费,但是会产生方法冗余问题
构造函数模式
优点:
可以区分对象种类
缺点:
方法冗余
面试题:使用了new操作符js自动帮做了这些事情
①创建了对象 obj
②this指向这个对象 this---obj
this.name=name;等同于obj.name=name;
③执行函数体
④返回这个对象 return obj
原型模式
优点:
解决了方法冗余
因为每个函数都有一个属性:prototype(原型属性),这个属性是一个指针,指向一个对象
缺点:
所有实例共享的属性和方法,但是私有属性得不到维护
原型模式不单独使用,构造函数中什么都不放,将所有的属性和方法都放到原型对象中
组合模式
构造函数模式+原型模式,构造函数中放实例私有的属性,构造函数原型对象中放公共属性和方法
继承
1、原型链继承
子构造函数的原型指向父构造函数的实例
Person.prototype={}; //Person.prototype=new Object();
继承规则:
实例调用属性和方法
1、实例自身有先调用自身
2、如果没有,调用构造函数原型对象中的属性和方法
3、如果没有,调用父类构造函数原型对象中的属性和方法
2、构造函数继承、经典继承
在子类构造函数内调用父类构造函数
function Dog(){
Animal.call();
}
3、组合继承(原型继承+经典继承)
4、instaceof:检测是否是构造函数的实例