由js apply与call想到的js数据类型
js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b,那么此时第一个参数就为a,没有则为null),call方法第二个参数为一个列表,可以是
1obj.call(
null
, 1,2,3,4);
免费会员网
而apply第二个参数为数组。这就是区别,下面来说说对它们的认识。
apply最常用的就是查找数组中的最大与最小值,还可以将2个数组合并:
1 2 3 4 5 6 7 8 9var
max=Math.max.apply(
null
,array);
var
min=Math.min.apply(
null
,array);
var
arr1=
new
Array(
"1"
,
"2"
,
"3"
);
免费会员网
var
arr2=
new
Array(
"4"
,
"5"
,
"6"
);
Array.prototype.push.apply(arr1,arr2);
//向数组尾部添加一项并更新length ,返回数组长度。
这里的Array.prototype.push本身是不能合并2个数组的,如下:
1 2 3 4 5 6 7var
arr1 = [
'1'
,
'2'
,
'3'
];
var
arr2 = [
'4'
,
'5'
,
'6'
];
alert(Array.prototype.push(arr1,arr2));
//返回2
alert(Array.prototype.push.apply(arr1,arr2));
//返回6
疑问:
1 2 3 4 5 6 7var
arr1 = [
'1'
,
'2'
,
'3'
];
var
arr2 = [
'4'
,
'5'
,
'6'
];
arr1.push(arr2);
alert(arr1);
//返回却是1,2,3,4,5,6呢?不解
免费会员网
当然,apply与call也可以用来继承类的方法。
简单的举个例子:
创建对象的四种写法:
第一种
1 2 3 4 5 6 7 8 9function
People(name, sex){
this
.name = name;
this
.sex = sex;
this
.show =
function
(){
alert(
this
.name+
'sex'
+
this
.sex+
'say hello'
);
}
}
var
ming =
new
People(
'y'
,
'nan'
);
ming.show();
第二种
1 2 3 4 5 6 7var
People1 = {
name :
'ming'
,
show :
function
(){
alert(
this
.name);
}
}
People1.show();
第三种:用prototype去为对象增加属性或者方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17function
CicleTwo(r){
this
.r = r;
}
CicleTwo.prototype.area =
function
() {
console.log(
'第二种:'
+Math.PI *
this
.r *
this
.r) ;
};
//测试
var
newCicleTwo =
new
CicleTwo(3);
newCicleTwo.area();
第四种
1 2 3 4 5 6 7var
People2 =
new
Object();
People2.name =
'A'
;
People2.show =
function
(){
alert(
"ok"
);
}
alert(People2.name);
这里用people1去继承people
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19function
People(name, sex){
this
.name = name;
this
.sex = sex;
this
.show =
function
(){
alert(
this
.name+
'sex'
+
this
.sex+
'say hello'
);
}
}
var
ming =
new
People(
'y'
,
'nan'
);
// ming.show();
var
People1 = {
name :
'ming'
,
show :
function
(){
alert(
this
.name);
}
}
// People1.show();
People1.show.apply(ming);
//弹出y,而不是ming,说明继承了people中的名字y
今天就到这里了,太晚了,明天再整理数据类型的知识点。
到此处参考的资料:
http://www.cnblogs.com/KeenLeung/archive/2012/11/19/2778229.html
========================================================
6-22 11点继续学习:js数据类型,参数传递的问题。
原始数据类型(5种)
1、number
2、string
是唯一没有固定大小的原始类型。
因为我们都知道原始类型的值存储在栈中,因为大小固定,内存较小,查找起来快;引用类型的值存在堆中,而引用的变量中存的是其值的地址,地址是固定的,所以存在栈中,但它的值是存在堆中的,变量中存的是它的地址。
3、undefind
当声明变量后没有初始化,并不是未定义变量
1 2 3var
oTemp;
alert(
typeof
oTemp);
//输出 "undefined"
alert(
typeof
oTemp2);
//输出 "undefined"
前面的代码对两个变量输出的都是 “undefined”,即使只有变量 oTemp2 从未被声明过。如果对 oTemp2 使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。
当函数无明确返回值时,返回的也是值 “undefined”,如下所示:
1 2 3function
testFunc() {
}
alert(testFunc() == undefined);
//输出 "true"
免费会员网
4、null
表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
1alert(
null
== undefined);
//输出 "true"
这是因为值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
5、boolean
引用数据类型,常见的有Object,Array,Function,Date。
所有的传参都是传递的值。
简单的原始数据传参
1 2 3 4 5 6 7 8 9 10 11function
show(num){
var
a = 5;
num = a;
alert(num);
}
show(2);
//返回5
因为值都是存在栈中,以值传递。
引用类型的传参,例子一
1 2 3 4 5 6function
setName(obj){
obj.name =
'abc'
;
}
var
person=
new
Object();
setName(person);
alert(person.name);
初始化一个对象person,person指向的是对象本身的地址,然后通过函数将person对象设置一个name属性值为’abc’;这里始终要记住的是,传递过来的地址,是用在函数内部声明的局部变量obj来保存,相当于将person对象地址值赋值给obj。因为obj和person指向的是同一个对象,当obj变化后,person也会表现出来。
再来看这个例子
1 2 3 4 5 6 7 8function
setName(obj){
obj.name =
'abc'
;
obj =
new
Object();
obj.name =
"def"
;
}
var
person=
new
Object();
setName(person);
alert(person.name);
//abc
在函数中可以看到,将函数内部的局部变量obj重新赋值了一个新的对象地址。此时obj就不在指向person了,那当然结果返回abc而不是def。
参考资料:
http://www.w3school.com.cn/js/pro_js_primitivetypes.asp
http://www.zhihu.com/question/27114726
http://www.zhihu.com/question/27114726
javascript 中数据类型
http://www.jb51.net/article/29703.htm
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。