由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由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
http://www.jb51.net/article/29703.htm
由js apply与call方法想到的js数据类型(原始类型和引用类型)的更多相关文章
- [荐]Js apply()和call()方法详解 - http://www.w3cfuns.com/article-5596443-1-1.html
本帖最后由 默默DE人生 于 2013-3-19 13:22 编辑 Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文 ...
- JS中JSON.stringify()方法,将js对象(json串)转换成字符串,传入服务器
JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串. 语法 JSON.string ...
- js生成随机数的方法实例总结 [收藏]
js生成随机数的方法实例总结 js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任 ...
- 转载 OS js oc相互调用(JavaScriptCore) ---js调用iOS ---js里面直接调用方法
OS js oc相互调用(JavaScriptCore) 接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用 ...
- js之数据类型(原始类型)
JavaScript的数据类型分为两类:原始类型和对象类型.本文讨论的是原始类型.原始类型包括数字,字符串,和布尔值.但在JavaScript中有两个特殊的原始值null(空)和undefined(未 ...
- Js apply 方法 详解
Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- Js apply 方法 具体解释
Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...
- Js apply call方法详解
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- 理解JS中的call、apply、bind方法(*****************************************************************)
在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...
随机推荐
- InnoDB关键特性学习笔记
插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...
- 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载
title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...
- 原生js+css3实现图片自动切换,图片轮播
运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...
- Java中,异常的处理及抛出
首先我们需要知道什么是异常? 常通常指,你的代码可能在编译时没有错误,可是运行时会出现异常.比如常见的空指针异常.也可能是程序可能出现无法预料的异常,比如你要从一个文件读信息,可这个文件不存在,程序无 ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...
- clang_intprt_t类型探究
作者:玄魂工作室-钱海龙 问题 这篇手把手教你构建 C 语言编译器,里面有着这样的代码 void eval() { int op, *tmp; while (1) { if (op == IMM) { ...
- [DeviceOne开发]-土地销售项目源码分享
一.简介 这个是一个真实项目开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有详细 ...
- Electron 不完全快速手册
Electron能干嘛 Vscode 基于Electron开发的,他是用来开发桌面软件的,可以轻易的跨平台 他的前身是atomshell,图标很丑,不用在意,一点也不像vscode也不用在意. L ...
- 3D游戏中的画质与效率适配
哪里来的需求? 众所周知,由于不同的设备配置不同.导致其CPU和GPU处理能力有高有低.同样的游戏想要在所有设备上运行流畅且画面精美,是不可能的.这就需要我们针对不同的设备能力进行画质调节,以保证 ...
- TODO:Go语言同名Go字体发布
TODO:Go语言同名Go字体发布 2016-11-16 Go语言官方博客发布了一款同名字体–Go字体.此字体族包括正常.粗体和斜体渲染,支持比例和等宽字体.此字体已经经过用于编程方面的技术测试,使用 ...