专题复习三、JS基础还记得么?

2017-08-04  本文已影响6人  田田kyle

写于2017.07.29

js声明变量方法

js7种基本数据类型

return f4( ) 与return f4的区别:f4( ) ===2;f4===“function f4( ){
return 2
}”

② var f =function(){ } (不会提升;相当于var f; f =function(){ })


扫盲:
1、console.log()与 console.dir()的区别
console.log()向web控制台输出一条消息.
console.dir()将一个JavaScript对象的属性和属性值显示成一个可交互的列表,点击折叠的小三角形可以查看各子属性的内容.
例:
console.log({f1: 'foo', f2: 'bar'})
// Object {f1: "foo", f2: "bar"}

console.dir({f1: 'foo', f2: 'bar'})
// Object
// f1: "foo"
// f2: "bar"
// proto: Object
上面代码显示dir方法的输出结果,比log方法更易读,信息也更丰富。
该方法对于输出DOM对象非常有用,因为会显示DOM对象的所有属性。
2、f.call()、 f.apply()、 f.bind()的区别
call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。
apply()方法调用一个函数, 其具有一个指定的this值,以及作为一个数组(或[类似数组的对象]提供的参数。

image.png
apply与 call()非常相似,不同之处在于提供参数的方式。apply
使用参数数组而不是一组参数列表(原文:a named set of parameters)。apply 可以使用数组字面量(array literal),如 fun.apply(this, ['eat', 'bananas']),或数组对象, 如 fun.apply(this, new Array('eat', 'bananas'))。你也可以使用 arguments
对象作为 argsArray参数。 arguments是一个函数的局部变量。 它可以被用作被调用对象的所有未指定的参数。 这样,你在使用apply函数的时候就不需要知道被调用对象的所有参数。 你可以使用arguments来把所有的参数传递给被调用对象。 被调用对象接下来就负责处理这些参数。
function keith(a, b) {
console.log(a + b);
}
keith.call(null, 2, 3); //5
keith.apply(null, [2, 3]); //5
应用1:找出数组里最大的数:
var a = [2, 4, 5, 7, 8, 10];
console.log(Math.max.apply(null, a)); //10
console.log(Math.max.call(null,2, 4, 5, 7, 8, 10)); //10
应用2:将数组的空元素变为undefined
通过apply方法,利用Array构造函数将数组的空元素变成undefined。
console.log(Array.apply(null, [1, , 3])); // [1, undefined, 3]
空元素与undefined的差别在于,数组的forEach方法会跳过空元素,但是不会跳过undefined和null。因此,遍历内部元素的时候,会得到不同的结果。
var
a = [1, , 3];
a.forEach(
function(index) {
console.log(index);
//1,3 ,跳过了空元素。
})
Array.apply(null,a).forEach(
function(index){console.log(index);
////1,undefined,3 ,将空元素设置为undefined
})
应用3:转换类似数组的对象
另外,利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组。当然,slice方法的一个重要应用,就是将类似数组的对象转为真正的数组。call和apply都可以实现该应用。
console.log(Array.prototype.slice.apply({0:1,length:1}));
//[1]
console.log(Array.prototype.slice.call({0:1,length:1}));
//[1]
console.log(Array.prototype.slice.apply({0:1,length:2}));
//[1,undefined]
console.log(Array.prototype.slice.call({0:1,length:2}));
//[1,undefined]
function
keith(a,b,c){
return arguments;
}
console.log(Array.prototype.slice.call(keith(2,3,4)));
//[2,3,4]

上面代码的call,apply方法的参数都是对象,但是返回结果都是数组,这就起到了将对象转成数组的目的。从上面代码可以看到,这个方法起作用的前提是,被处理的对象必须有length属性,以及相对应的数字键。

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。
bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call
属性)。当新函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。一个绑定函数也能使用new
操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。
例:
var a = {
user:"追梦子",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
(console.log(b):
function(){
console.log(this.user);
})

var c = b.bind(a);(意味着c与a有相同的函数体,c调用a作为this)
console.log(c);
(function(){
console.log(this.user);
})

执行c( ) 打印出来“追梦子”

参数赋值
var a = {
user:"追梦子",
fn:function(e,d,f){
console.log(this.user); //追梦子
console.log(e,d,f); //10 1 2
}}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);
输出:追梦子
10 1 2(按照顺序来)

上一篇 下一篇

猜你喜欢

热点阅读