原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型)

js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b,那么此时第一个参数就为a,没有则为null),call方法第二个参数为一个列表,可以是

obj.call(null, 1,2,3,4);

  

而apply第二个参数为数组。这就是区别,下面来说说对它们的认识。

apply最常用的就是查找数组中的最大与最小值,还可以将2个数组合并:

var 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个数组的,如下:

var arr1 = ['1','2','3'];

var arr2 = ['4','5','6'];

alert(Array.prototype.push(arr1,arr2));//返回2

alert(Array.prototype.push.apply(arr1,arr2));//返回6

  

疑问:

var arr1 = ['1','2','3'];

var arr2 = ['4','5','6'];

arr1.push(arr2);

alert(arr1);//返回却是1,2,3,4,5,6呢?不解

  

当然,apply与call也可以用来继承类的方法。

简单的举个例子:

创建对象的四种写法:

第一种

function 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();

  

第三种:用prototype去为对象增加属性或者方法

function CicleTwo(r){

this.r = r;

}

CicleTwo.prototype.area = function () {

console.log('第二种:'+Math.PI * this.r * this.r) ;

};

//测试

var newCicleTwo = new CicleTwo(3);

newCicleTwo.area();

  

第四种

var People2 = new Object();
People2.name = 'A';
People2.show = function(){
alert("ok");
} alert(People2.name);

  

这里用people1去继承people

function 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

当声明变量后没有初始化,并不是未定义变量

var oTemp;
alert(typeof oTemp); //输出 "undefined"
alert(typeof oTemp2); //输出 "undefined"

  

前面的代码对两个变量输出的都是 “undefined”,即使只有变量 oTemp2 从未被声明过。如果对 oTemp2 使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。

当函数无明确返回值时,返回的也是值 “undefined”,如下所示:

function testFunc() {
}
alert(testFunc() == undefined); //输出 "true"

  

4、null

表示尚未存在的对象,如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

alert(null == undefined);  //输出 "true"

  

这是因为值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

5、boolean

引用数据类型,常见的有Object,Array,Function,Date。

所有的传参都是传递的值。

简单的原始数据传参

function show(num){

var a = 5;

num = a;

alert(num);

}

show(2);//返回5

更清楚的一个例子:

var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍为1, 未受x = 2赋值所影响

  

因为值都是存在栈中,以值传递,x只是a的一个副本而已,并不影响a本身。

引用类型的传参,例子一

function 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也会表现出来。

再来看这个例子

function 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

由js apply与call方法想到的js数据类型(原始类型和引用类型)的更多相关文章

  1. [荐]Js apply()和call()方法详解 - http://www.w3cfuns.com/article-5596443-1-1.html

    本帖最后由 默默DE人生 于 2013-3-19 13:22 编辑 Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文 ...

  2. JS中JSON.stringify()方法,将js对象(json串)转换成字符串,传入服务器

    JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串. 语法 JSON.string ...

  3. js生成随机数的方法实例总结 [收藏]

    js生成随机数的方法实例总结 js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任 ...

  4. 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法

    OS js oc相互调用(JavaScriptCore)   接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...

  5. js之数据类型(原始类型)

    JavaScript的数据类型分为两类:原始类型和对象类型.本文讨论的是原始类型.原始类型包括数字,字符串,和布尔值.但在JavaScript中有两个特殊的原始值null(空)和undefined(未 ...

  6. Js apply 方法 详解

    Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  7. Js apply 方法 具体解释

    Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...

  8. Js apply call方法详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  9. 理解JS中的call、apply、bind方法(*****************************************************************)

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

随机推荐

  1. RecyclerView使用大全

    RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...

  2. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  3. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  4. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  5. TypeScript为Zepto编写LazyLoad插件

    平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...

  6. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  7. KOTLIN开发语言文档(官方文档) -- 2.基本概念

    网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2.   基本概念 2.1.  基本类型 从可以在任何变量处理调用成员函数和属性 ...

  8. android绘制圆形图片的两种方式

    看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...

  9. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  10. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...