Object类型

对象字面量表示法:

var person={
name:"Nicholas",
age:29,
5:true
};

这人例子会创建一个对象,包含三个属性:name,age和5。但这里的数值属性名会自动转换为字符串。
对象属性的访问:点表示法和方括号语法

alert(person["name"]); // "Nicholas"
alert(person.name); // "Nicholas"

从功能上看,这两种访问对象属性的方法没有任何区别,但方括号语法的主要优点是可以通过变量来访问属性,如:

var propertyName="name";
alert(person[propertyName]

如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号表示法,如:

person["first name"]="Nicholas";

Array类型

在读取和设置数组的值时,要使用方括号并提供相应值的基本0的数字索引,如

var colors=["red","blue","green"];
alert(colors[0]); //显示第一项:red
colors[2]="black" //修改第三项
colors[3]="brown"; //新增第四项

如果设置某个值的索引超过了数组现有项数,如这个例子中的colors[3]所示,数组就会自动增加到该索引值加1的长度(就这个例子而言,索引是3,因此数组长度是4)
数组的length属性很有特点--它不是只读的。因此,通过设置这个属性,可以从数组的末尾移除项或向数组中添加项,如:

var colors=["red","blue","green"];
colors.length=2;
alert(colors[2]); //underfined

利用length属性也可以方便地在数组末尾添加新项,如下所示:

var colors=["red","blue","green"];
colors[colors.length]="black";
colors[colors.length]="brown";

数组排序
数组有sort()方法,接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。

function compare(value1,value2){
if(value1<value2)
return -1;
else if(value1>value2)
return 1;
else
return 0;
} var values=[0,1,5,15,10];
values.sort(compare);
alert(values); //0,1,5,10,15

对于数值类型或者其valueof()方法会返回数值类型的对象,可以使用一个更简单的比较函数

function compare(value1,value2)
return value2-value1;

操作方法
slice():能够基于当前数组中的一或多个项创建一个新数组。slice()方法可以接受一或两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下,slice()方法返回从
该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项--但不包括结束位置的项。注意,slice()方法不会影响原始数组。例子:

var colors=["red","blue","green","yelllow","purple"];
var colors2=colors.slice(1); //blue,green,yelllow,purple
var colors3=colors.slice(1,4); // blue,green,yelllow

如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位置。例如,在一个包括5项的数组上调用slice(-2,-1)与调用slice(3,4)得到的结果相同。如果结束
位置小于起始位置,则返回空数组。

Date类型

在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和当前时间。
Date.UTC()的参数分别是年份,基于0的月份(一月是0,二月是1,以此类推),月中的哪一天(1到31),小时数(0到23),分钟,秒以及毫秒数。

var allFives=new Date(Date.UTC(2005,4,5,17,55,55)); //GMT时间2005年5月5日下午5:55:55

Date类型的valueOf()方法,不返回字符串,而是返回日期的毫秒表示。

Function类型

函数声明:

function sum(num1,num2){
return num1+num2;
}

函数表达式:

var sum=function sum(num1,num2){
return num1+num2;
};

第二种方法要在函数末尾加一个分号,就像声明其他变量时一样。
由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变更没有什么不同。换句话说,一个函数可能会有多个名字,如下面的例子:

function sum(num1,num2){
return num1+num2;
}
alert(sum(10,10)); // var anotherSum=sum;
alert(anotherSum(10,10)); // sum=null;
alert(anotherSum(10,10)); //

解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等
到解析器执行到它所在的代码行,才会真正被解析执行。请看下面的例子-

alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
}

以上代码完全可以正常运行,因为在代码执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。下面提等价的函数表达式:

alert(sum(10,10));
var sum=function sum(num1,num2){
return num1+num2;
};

以上代码之所以会在运行期间产生错误,原因在于函数位于一个初始化的语句中,而不是一个函数声明。换句话说,在执行到函数所在语句之前,变更sum中不会保存有对函数的引用 。

函数内部属性

在函数内部,有两个特殊的对象:arguments和this.其中,arguments,它是一个类数组对象,包含着传入函数中的所有参数。虽然arguments的主要用途就是保存函数参数,但这个对象
还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。请看下面这个非常经典的阶乘函数。

function factorial(num){
if(num<=1){
return 1;
}else{
return num*factorial(num-1);
}
}

定义阶乘函数一般都要用到递归算法;如上面的代码所示,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名factorial紧
紧耦合在了一起。为了消除这种紧耦合,可以像下面这样使用arguments.callee。

function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}

this引用的是函数据以执行的环境对象

函数方法

每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。
首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象。例如:

function sum(num1,num2){
return num1+num2;
} function callSum1(num1,num2){
return sum.apply(this,arguments); //传入arguments对象
} function callSum2(num1,num2){
return sum.apply(this,[num1,num2]); //传入数组
}
alert(callSum1(10,10)); //
alert(callSum2(10,10)); //

call方法与apply方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()方法而言,第一个参数this值没有变化,变化的是其余参数都要直接传递给函数。换句
话说,在使用call()方法时,传递给函数的参数必须逐个列举出来,如下面所示:

function sum(num1,num2){
return num1+num2;
} function callSum(num1,num2){
return sum.call(this,num1,num2); //传入arguments对象
}
alert(callSum(10,10)); //

事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数赖于运行的作用域。下面来看个例子:

window.colors="red";
var o={colors:"blue"}; function sayColor(){
alert(this.color);
} sayColor(); //red sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue

基本包装类型

ECMScript还提供了3个特殊的引用类型:Boolean,Number和String。这些类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。
引用类型与基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型
的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。来看下面的例子:

var s1="some text";
s1.color="red";
alert(sl.color); //undefined

Object构造函数与会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。如:

var obj=new Object("some text");
alert(obj instanceof String); //true

Boolean类型

var falseObject=new Boolean(false);
var result=falseObject&&true;
alert(result) ; //true var falseValue=false;
result=falseValue&&true;
alert(result);

在这个例子中,我们使用false值创建了一个Boolean对象。然后,将这个对象与基本类型值true构成了逻辑与表达式。在布尔运算中,false&&true等于false。可就,示例中的这行代码是对falseObject而不是对它的值(false)进行求值。前面讨论过,布尔表达式中的所有对象都会被转换为true,因此falseObject对象在布尔表达式中代表的就是true

Number类型

toFixed()方法会按照指定的小数位返回数值的字符串表示,如:

var num=10;
alert(num.toFixed(2)); //10.00

在全局作用域中声明的所有变更和函数,都成为window对象的属性。

Math对象

Math.ceil()执行向上舍入,它总是将数值向上舍入为最接近的整数。
Math.floor()执行向下舍入,它总是将数值向下舍入为最接近的整数。
Math.round()执行标准舍下,即四舍五入为最接近的整数

JavaScript高级程序设计学习笔记--引用类型的更多相关文章

  1. JavaScript高级程序设计---学习笔记(一)

    今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...

  2. javascript高级程序设计学习笔记

    javascript高级程序设计,当枕头书已经好久了~zz  现在觉得自己在js的开发上遇到了一些瓶颈,归根究底还是基础太薄弱,所以重新刷一遍js高程希望有更新的认识. 一.javascript简介 ...

  3. JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)

    四.Function类型: 1.函数定义的方法: 函数声明:function sum (num1, num2) {return num1 + num2;} 函数表达式:var sum = functi ...

  4. JavaScript高级程序设计学习笔记第五章--引用类型

    一.object类型 1.创建object类型的两种方式: 第一种,使用构造函数 var person = new Object();或者是var person={};/与new Object()等价 ...

  5. javascript 高级程序设计 学习笔记

    <!--<script> // 异步请求封装 IE6即以上浏览器 // ajax(url,fnSucc,selectID,fnFaild) //url 请求地址 //fnSucc 异 ...

  6. JavaScript高级程序设计---学习笔记(二)

    面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...

  7. JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承

    相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...

  8. JavaScript高级程序设计学习笔记第六章--面向对象程序设计

    1.ECMAScript没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”,有点类似于散列表 2.ECMAScript 中有两种属性:数据属性和访问 ...

  9. JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

    1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...

随机推荐

  1. php怎么获取mac地址?

    如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...

  2. [译]Node.js Best Practices

    原文: http://blog.risingstack.com/node-js-best-practices/ 下面的的最佳实践分为代码风格和开发工作流两种. 代码风格 Callback约定 Modu ...

  3. 调用shell脚本,IP处理

    //调用shell脚本,IP处理 package com.letv.sdns.web.utils; import org.slf4j.Logger; import org.slf4j.LoggerFa ...

  4. vim颜色选择+按<F9>自动编译运行+其他基本配置(ubuntu)

    (以下是ubuntu上的配置........ 但如果你是在window上的,直接用一下配置吧(懒得介绍了)=.= syntax on filetype indent plugin on set rul ...

  5. 什么是H标签?H1,H2,H3标签?以及和strong标签使用的方法及重要性

    大家都知道,seo的一个很重要的一点就是要把网站做的条理清晰,让搜索引擎很容易的读明白,这个条理清晰不仅体现在网站的物理路径,url等地 方.在<h1><h2><h3&g ...

  6. ios 微博登录 21338错误 sso package or sign error

    os中,是你项目的bundle id 和 连接的微博开发账户里面的bundle id 不一致造成的. 特别是,你把你注册的appKey放到你下载的官方的demo里面测试,肯定会出现这种情况, 所以,你 ...

  7. media

    关于获取设备的大小问题: /* 本条为CSS2部分,IE8及以下只支持本条 */@media screen{ body{color:#f00;}}/* 下列为CSS3部分 */@media scree ...

  8. FineUI第十一天---布局概述

    布局概述 1.填充整个页面: 让整个容器填充整个页面,设置PageManager的AutoSizePanelID为需要填充整个页面的容器控件ID. 2. 填充整个容器(Fit): 让一个控件填满另一个 ...

  9. C语言多线程编程 死锁解析

    1.假设有两个线程 A线程负责输出奇数.B线程负责输出偶数. 2.当A线程进入锁定状态是,主线程突然异常将A线程停止,这时将导致B线程也无法继续执行,处于死锁状态.如下代码: #include < ...

  10. Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

    这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚 ...