JavaScript数据类型
基本类型
- number:数字类型
- string:字符串类型
- boolean:布尔类型
特殊类型
- null:空对象数据
- underfined:未定义的任何数据类型
复杂类型
- array:数组类型
- object:对象数据类型
类型事件函数
Function
javaScript函数(对象 --> 函数)
属性
-
arguments[] 已废弃
传递给函数的参数数组,不推荐使用。 -
caller 非标准
指向调用它的那个函数。如果是全局调用,则该属性为null。caller只有函数执行过程中才有效。不推荐使用 -
length
声明函数时指定的形参个数。 -
prototype
一个给构造函数用的对象。用构造函数创建的所有对象会共享 prototype 对象定义的属性和方法 -
name
返回一个函数声明的名称
方法:
-
Function.apply()
将函数作为指定对象的方法来调用。传递给它的是指定的参数数组。(立即调用对象方法) -
Function.call()
将函数作为指定对象的方法来调用。传递给它的是指定的参数。(立即调用对象方法) -
Function.bind()
返回一个新函数。通过可选的指定参数,作为指定的方法调用该方法 -
Function.toString()
将函数转换成字符串
JavaScript 中 call()、apply()、bind() 的用法与区别
例 1
var name = '小王', age = 17;
var obj = {
name: '小张',
abjAge: this.age,
myFun: function() {
console.log(this.name + '年龄' + this.age);
}
}
obj.objAge; // 17
obj.myFun(); // 小张年龄 undefined
例 2
var fav = '盲僧';
function shows() {
console.log(this.fav);
}
shows() // 盲僧
总结:两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window。
call()、apply()、bind() 都是用来重定义 this 这个对象的!
var name = '小王', age = 17;
var obj = {
name: '小张',
abjAge: this.age,
myFun: function() {
console.log(this.name + '年龄' + this.age);
}
}
var db = {
name: '德玛',
age: 99
}
obj.myFun.call(db);    // 德玛年龄 99
obj.myFun.apply(db);    // 德玛年龄 99
obj.myFun.bind(db)();   // 德玛年龄 99
总结:以上出了 bind 方法后面多了个 () 外 ,结果返回都一致。bind 返回的是一个新的函数,你必须调用它才会被执行。
对比call 、bind 、 apply 传参情况下
var name = '小王', age = 17;
var obj = {
name: '小张',
abjAge: this.age,
myFun: function(fm, t) {
console.log(this.name + ' 年龄 ' + this.age , ' 来自 ' + fm + '去往' + t);
}
}
var db = {
name: '德玛',
age: 99
}
obj.myFun.call(db,'成都','上海'); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.apply(db,['成都','上海']); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,'成都','上海')(); // 德玛 年龄 99 来自 成都去往上海
obj.myFun.bind(db,['成都','上海'])(); // 德玛 年龄 99 来自 成都, 上海去往 undefined
总结:微妙的差距!call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,差别在于第二个参数。
- call 第二个参数开始用逗号分隔。
- apply 第二个参数是用数组包起来。
- bind 除了返回是函数以外,它 的参数和 call 一样