JavaScript 中级笔记 第二章

1,引用
引用是一个指向对象实际位置的指针。看下面的使用引用的例子:

/*示例引用*/
var obj = new Object(); //定义一个空对象
var newObj = obj; //定义一个新对象引用。
obj.name = "rain";//修改原对象的属性
alert( newObj.name );
alert( obj.name == newObj.name );//由此可以证明它们是引用的同一个对象

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

本例中,两个对象都指向同一个对象,当修改某一个对象的属性内容时,则会影响另一个。
我们再来看一个例子,这次我们利用数组来讲解引用:

/*示例引用*/
var arr = new Array("a","b","c"); //定义一个数组
var newArr = arr; //定义一个新数组的引用。
arr.push("d");//添加一个值
alert( newArr[3] );
alert( arr.length == newArr.length );//由此可以证明它们是引用的同一个数组对象

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

如果在arr被重新定义后,则引用就不是同一个对象了,如下代码所示:

/*示例引用*/
var arr = new Array("a","b","c"); //定义一个数组
var newArr = arr; //定义一个新数组的引用。
arr = new Array("e","f"); //重新定义一个数组
//newArr和arr现在指向不同的对象了
//arr指向的是new Array("e","f");
//newArr指向的是 new Array("a","b","c");
alert(arr!=newArr);

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

接下来我们来看一个比较特殊点的例子,关于字符串的引用问题。

/*示例引用*/
var str = "a";
var newStr = str;
str = str + "b";//修改str的值,注意,这将会创建一个新对象,而非修改原对象
alert(str!=newStr);

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

正如本例所示,在执行字符串操作时,结果总会是一个新的字符串对象,而非字符串的修改版。
不知道大家看过<<JavaScript高级程序设计>>书中的有一节讲的是 传值和传址,说白了,就是引用。有兴趣可以去看看。
JavaScript就是一门通过维护一系列对其它对象的引用的语言,通过引用,可以给程序带来极大的灵活性。
2,函数重载
函数重载的特性就是根据传入的不同数量或类型的参数,通过重载函数来发挥不同的功能。它必须依赖2件事情:一是判断传入参数的数量 ,二是判断传入参数的类型。
2-1,判断传入参数的数量
JavaScript的每个函数都带有一个仅在这个函数范围内作用的变量称为参数,它是一个包含所有传给函数的参数的伪数组,虽然有length属性。
通过arguments,我们能够获取到这个伪数组。如下所示:

//定义一个发送信息的简单函数
//obj为发送的对象,msg为发送的信息
function sendMsg( obj , msg ){
if(arguments.length==2){
alert(obj + " 发送:" + msg);
}else{
alert("参数数量不对,不能发送");
}
}
//仅用一个参数时
sendMsg("hello");
//用2个参数时
sendMsg("李老师","hello");

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

arguments是一个非常有用的东西,在看下面的一个功能函数,它能将任意数量的参数转换为数组。

function makeArr(){
var arr = [];//定义一个临时数组
for(var i=0;i

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

2-2,判断传入参数的类型
第一种判断类型的方式:
判断类型需要用到JavaScript中另一个操作符——typeof。 它用来表达变量内容的类型,返回的是字符串。比如如果一个变量是字符串,那么typeof后,则返回( "string" )。
经常我们会用到如下判断:


代码如下:

if( typeof num == "string" ){
num = parseInt( num );//如果是一个字符串,则把字符串解析出整数
}
if( typeof arr== "string" ){
arr= arr.split(",");//如果是一个字符串,则根据逗号来分割成数组
}

例如把前面的makeArr()函数改成只能接受字符串类型的参数,代码如下:

function makeArr(){
var arr = [];//定义一个临时数组
for(var i=0;i

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

最终结果 a.length 为2,因为后面2个参数是number 类型。
第二种判断类型的方式:
此方法需要引用所有JavaScript对象都带有的一个属性,构造函数——constructor。这一属性引用的是原本用来构造该对象的那个函数。


代码如下:

if( num.constructor == String ){
num = parseInt( num );//如果是一个字符串,则把字符串解析出整数
}
if( arr.constructor == String ){
arr= arr.split(",");//如果是一个字符串,则根据逗号来分割成数组
}
if( newArr.constructor == Array ){
newArr = newArr.join(",");//如果是一个数组,则根据逗号来组成字符串
}

执行constructor后的结果是一个对象,而执行typeof后的结果是一个字符串。看下表的对比:


































变量 typeof 变量 变量.constructor
{a:"b"} "object" Object
["a","b"] "object" Array
function(){} "function" Function
"a" "string" String
66 "number" Number
true "boolean" Boolean
new User() "object" User

通过对传入参数的数量和类型的判断,那么函数重载也就简单了。

(0)

相关推荐

  • JavaScript 中级笔记 第二章

    1,引用 引用是一个指向对象实际位置的指针.看下面的使用引用的例子: /*示例引用*/ var obj = new Object(); //定义一个空对象 var newObj = obj; //定义一个新对象引用. obj.name = "rain";//修改原对象的属性 alert( newObj.name ); alert( obj.name == newObj.name );//由此可以证明它们是引用的同一个对象 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 本例

  • JavaScript 中级笔记 第一章

    一,回顾 首先先来回顾下DOM和事件. 1,DOM DOM在JavaScript中是应用最广泛的,大部分Web开发的编程语言都提供了相关的实现.给了开发者一个统一的接口. 看下面的例子: demo /* 示例操作DOM元素 */ window.onload = function(){ //给Dom元素添加颜色 var li = document.getElementsByTagName("li"); for(var i=0;i 李老师-英语 张老师-数学 刘老师-物理 [Ctrl+A

  • JavaScript 中级笔记 第五章 面向对象的基础

    一,面向对象的基础 对象是JavaScript的基础.从最基本的层次上说,对象是一系列属性的集合. 1,对象的创建 //创建一个新的Object对象,存放在obj变量中 var obj1 = new Object(); //设置属性 obj1.value = 5; obj1.click = function(){ alert("Hello"); } //另一种方式定义一个对象,以键值(key/value)的方式定义属性 var obj2 = { value : 5, click : f

  • JavaScript 中级笔记 第四章 闭包

    5,闭包 闭包意味着内层的函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经终止. 让我们先来看一个闭包的例子. function add(num){ return function(toAdd){ return num+toAdd; //代码① } } var addFive = add(5); //此时addFive为function(toAdd){return num+toAdd;} var count = addFive(3); //此时count为 num+toAdd al

  • JavaScript 中级笔记 第三章

    3,作用域 所有的面向对象的语言都有某种形式的作用域,JavaScript也不例外.在JavaScript里,作用域是由函数划分的,而不是由块(while,if之类的)来划分的. 我们先来看一个简单的作用域的例子. var foo = "a"; //设置全局变量foo if(true){ var foo = "b";//在if块中,把foo的值改为b,注意:此时还在全局作用域中 } alert(foo); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • JavaScript Event学习第二章 Event浏览器兼容性

    在这里提出的事件,当他们发生在一个确定的HTML元素上的时候,他们的名字能够被大多数的浏览器所识别.也就是说,浏览器会查找你为这个HTML元素所注册的事件处理程序的脚本,而且会被立即执行.      一开始只有为数很少的一些事件.这些事件在几乎所有的JavaScript浏览器都能运行,即使是那些非常古老的.需要注意的是那些早期的事件只能工作在链接或者表单上,有时候也能运行在整个窗口上,但是其他的大多数HTML元素不行.      时代变迁,很多新的事件也给大家介绍过了.第四代浏览器和更高级的浏览

  • Python基础教程学习笔记 第二章 列表和元组

    1.序列中元素的索引: 第一个元素索引是0,第二个是1,依次递增 最后一个元素索引是-1,倒数第二个是-2,依次递减 2.序列(Sequence)的种类: 列表(list).元组(tuple).字符串(string).Unicode 字符串.buffer对象.xrange对象 3.列表和元组的区别:列表可以进行修改,但是元组不行 4.tuple常作为字典的键 5.序列都可以进行以下操作: 索引(indexing).分片(sliceing).加(adding).乘(multiplying).以及检

  • MYSQL必知必会读书笔记第二章之版本更改

    MySQL的当前版本为版本5,以下列出最近版本的主要更改: 4.---------InnoDB引擎,增加了事务处理.并.改进全文搜索等支持. 4.1--------对函数库.子查询.集成帮助等重要增加. 5.-------------增加了存储过程.触发器.游标.视图等 以上内容是小编给大家介绍MYSQL必知必会读书笔记的相关知识,希望对大家有所帮助!

  • JavaScript DOM 学习第二章 编辑文本

    例子 这个页面就是个例子.点击一个段落,编辑,然后点Ready.你的修改就会呈现. 问题 遇到的第一个问题是:我想用文本框作为编辑区域.一开始我却把内容放不进文本框去.读者发现Mozilla的一个警告说是只有在文本框放置到文档之后才能设置它的value. 另外,在Mozilla下面内容包装的不是很好.我试了好几种wrap参数,但是结果都不是很好. 最严重的问题就是把修改后的内容发回服务器,这是几乎所有的CMS系统都要做的.读者给了我很多高明巧妙的建议.然而因为不能通过JavaScript完成,所

  • Javascript学习笔记之 对象篇(四) : for in 循环

    先上范例: // Poisoning Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // prints both bar and moo } 这里我们要注意两点,一是 for in 循环会忽略 enumerable 设置为 false 的属性.例如一个数组的 length 属性.第二是,由于 for in 会遍历整个原型链,所以当原型链过长时,会

随机推荐