1.函数对象的原型的方法
1.1 Function.prototype.call()---call()方法
call():使用一个指定的 this
值调用一个函数,可以改变函数的 this 指向 立即调用函数 参数传递的方式是以逗号隔开
var o = {
name: '小谷'
}
function fn(a, b) {
console.log(this);
console.log(a+b)
};
fn(1,2)// 此时的this指向的是window 运行结果为3
fn.call(o,1,2)//此时的this指向的是对象o,参数使用逗号隔开,运行结果为3
1.2 Function.prototype.apply()---apply()方法
apply() 方法调用一个函数。可以改变函数的 this 指向 传入参数是以数组形式 立即调用函数
var o = {
name: '小好'
}
function fn(a, b) {
console.log(this);
console.log(a+b)
};
fn()// 此时的this指向的是window 运行结果为3
fn.apply(o,[1,2])//此时的this指向的是对象o,参数使用数组传递 运行结果为3
1.3 Function.prototype.bind()---bind()方法
bind() 方法不会调用函数,但是能改变函数内部this 指向, 不会立即调用 需要手动调用
var o = {
name: '小谷'
};
function fn(a, b) {
console.log(this);
console.log(a + b);
};
var f = fn.bind(o, 1, 2); //此处的f是bind返回的新函数
f();//调用新函数 this指向的是对象o 参数使用逗号隔开
1.4 call、apply、bind三者的异同
-
共同点 : 都可以改变this指向
-
不同点:
-
call 和 apply可以改变函数内部this指向,会立即调用函数.
-
call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递.
-
bind 可以改变函数内部this指向,不会立即调用函数, 需要手动调用.
-
-
应用场景
-
call 经常用作判断数据类型和继承.
-
apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
-
bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.
-
1.5 最精准的检测方式 :Object.prototype.toString()判断数据类型
console.log(Object.prototype.toString());
console.log(Object.prototype.toString.call(123));
console.log(Object.prototype.toString.call(arr));
console.log(Object.prototype.toString.call(fun));
console.log(Object.prototype.toString.call(new Date));
console.log(Object.prototype.toString.call(new RegExp));
1.6 constructor来判断构造函数类型
console.log(obj.constructor == Object);//true
console.log(date.constructor == Date);//true
1.7 instanceof 检测复杂数据类型
console.log(new Date instanceof Object);
console.log(new RegExp instanceof Object);
console.log(num instanceof Object);
console.log(fun instanceof Function);
console.log(arr instanceof Array);
1.8 typeof 检测基本数据类型
console.log(typeof num);
console.log(typeof str);
console.log(typeof null);
console.log(typeof undefined);
console.log(typeof true);
console.log(typeof arr);
console.log(typeof obj);
console.log(typeof fun);
2.定时器传参
解决定时器不能传参的问题:在外部封装函数 写在定时器方法里面进行调用
setTimeout(function () {
// 12123213
// 12123213
// 12123213
// 12123213
}, 1000)
3. JS继承的实现方式
3.1 构造函数继承
-
先定义一个父构造函数
-
再定义一个子构造函数
-
子构造函数继承父构造函数的属性(使用call方法)
// 1. 父构造函数
function Father(uname) {
// this 指向父构造函数的对象实例
this.uname = uname;
}
// 2 .子构造函数
function Son(uname, age) {
// this 指向子构造函数的对象实例
//3.使用call方式实现子继承父的属性
Father.call(this, uname);
this.age = age;
}
var son = new Son('小好', 18);
console.log(son);
3.2 原型对象继承方法
-
先定义一个父构造函数
-
再定义一个子构造函数
-
子构造函数继承父构造函数的属性(使用call方法)
-
设置子级的prototype原型对象
// 1. 父构造函数 function Father(uname, age) { // this 指向父构造函数的对象实例 this.uname = uname; this.age = age; } Father.prototype.money = function() { console.log(100000); }; // 2 .子构造函数 function Son(uname, age, score) { // this 指向子构造函数的对象实例 Father.call(this, uname, age); this.score = score; } // Son.prototype = Father.prototype; 这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化 Son.prototype = new Father(); // 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数 Son.prototype.constructor = Son; // 这个是子构造函数专门的方法 Son.prototype.exam = function() { console.log('孩子要考试'); } var son = new Son('小好', 18, 100); console.log(son);
3.3 Object.create实现类式继承
Object.create(proto, [propertiesObject])
-
方法创建一个新对象,使用现有的对象来提供新创建的对象的
__proto__
。返回在指定原型对象上添加新属性后的对象。 -
proto:新创建对象的原型对象。
-
propertiesObject:可选。需要传入一个对象,该对象的属性类型参照
Object.defineProperties()
的第二个参数。如果该参数被指定且不为undefined
,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。
4.内置对象Array的操作方法
4.1 数组方法forEach遍历数组
//forEach遍历数组 arr.forEach(function(value, index, array) { // value当前元素 // index元素的索引 // arr当前数组 }) //相当于数组遍历的 for循环 没有返回值
var arr = [1, 2, 3, 5, 6, 7, 89];
// 遍历数组
var rel = arr.forEach(function (value, index, arr) {
// value当前元素
// index元素的索引
// arr当前数组
console.log(value + "-----" + index);
console.log(arr);
return "操作元素" + value
})
console.log(rel);
4.2 数组方法map遍历数组
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测, map() 不会改变原始数组。
var arr = [1, 2, 3, 5, 6, 7, 89];
// 遍历数组
var rel = arr.map(function (value, index, arr) {
// value当前元素
// index元素的索引
// arr当前数组
console.log(value + "-----" + index);
console.log(arr);
return "操作元素" + value
})
console.log(rel);
console.log(arr);
4.3 数组方法filter过滤数组
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
var arr = [12, 66, 4, 88, 3, 7];
var newArr = arr.filter(function(value, index,array) {
//参数一是:数组元素
//参数二是:数组元素的索引
//参数三是:当前的数组
return value >= 20;
});
console.log(newArr);//[66,88] //返回值是一个新数组
4.4 数组方法some
some 查找数组中是否有满足条件的元素 ,如果数组中有元素满足条件返回 true,否则返回 false。
var arr = [10, 30, 4];
var flag = arr.some(function(value,index,array) {
//参数一是:数组元素
//参数二是:数组元素的索引
//参数三是:当前的数组
return value < 3;
});
console.log(flag);//false返回值是布尔值,只要查找到满足条件的一个元素就立马终止循环
4.5数组方法every
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
array.every(function(value,index,array))
-
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
-
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
-
var arr = [56, 32, 78, 11, 23, 103, 45, 103]; // every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。 var rel = arr.every(function (v) { console.log("zhixing"); return v < 100 // 如果数组中检测到有一个元素不满足,则整个表达式返回false,且剩余的元素不会再进行检测。 // 所有元素都满足条件 才会返回true }) console.log(rel);
4.6 数组方法find
find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。
find() 方法为数组中的每个元素都调用一次函数执行:
array.find(function(value,index,array){})
-
当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
-
如果没有符合条件的元素返回 undefined
-
var arr = [56, 32, 78, 11, 23, 103, 45, 103]; // find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。 // find() 方法为数组中的每个元素都调用一次函数执行: // 如果没有符合条件的元素返回 undefined var rel = arr.find(function (v) { console.log("执行"); return v > 100 }) console.log(rel);
4.7 数组方法reduce
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
array.reduce(function(total,value,index,array){},initialValue)
-
total 必需。初始值, 或者计算结束后的返回值。 value 必需。当前元素 index 可选。当前元素的索引 array可选。当前元素所属的数组对象。
-
initialValue 作为第一次调用
callback
函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 -
返回值:最终计算的一个值
-
// 求和 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var rel1 = arr.reduce(function (total, value) { // console.log(total); // console.log(value); return total + value }) console.log(rel1); // 求最大值 var arr2 = [45, 67, 12, 2, 103, 44, 33]; var rel2 = arr2.reduce(function (total, value) { // if (total < value) { // total = value; // } return Math.max(total, value); }) console.log(rel2); // 数组去重 // splice push() var arr3 = [44, 65, 44, 12, 3, 2, 5, 2, 16]; var rel3 = arr3.reduce(function (total, value, index) { // [] if (!total.includes(value)) { total.push(value); } return total; }, []) console.log(rel3); arr3.sort(function (a, b) { return a - b; }) console.log(arr3);