《JavaScript高级程序设计》中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型

Object类型

创建对象

var person = new Object();
var person = {};
//二者效果是一样的,但使用对象字面量表示法定义对象时不会调用Object的构造函数

访问对象属性

  • 点表示法
  • 方括号表示法
person.name = '';
person['name'] = '';
// 方括号表示法能用变量来访问属性
var propertyName = 'name';
person[propertyName] = '';
//若属性名包含会导致语法错误的字符或关键字、保留字,可以使用方括号表示法表示
person['first name'] = '';

Array类型

Date类型

RegExp类型

Function类型

(函数是对象,函数名是指针)

定义函数

  • 函数声明
  • 函数表达式
  • Function构造函数
//函数声明
function sum(num1, num2){
return num1 + num2;
} //函数表达式
var sum = function(num1, num2){
return num1 + num2;
}; //使用Function构造函数,最后一个参数视为函数体(不推荐)
var sum = new Function('num1', 'num2', 'return num1 + num2');

没有重载

因为函数名是一个指针,所以JavaScript的函数没有重载,后面定义的函数会覆盖前面的定义

function add(n){
return n + 100;
} function add(n){
return n + 200;
} add(100); //300 var add = function(n){
return n + 100;
}; var add = function(n){
return n + 200;
}; add(100); //300

函数声明与函数表达式(解析顺序)

函数声明会先被解析,而函数表达式要等到执行至定义的那行代码才会被解析

//正常执行
alert(sum(10, 10));
function sum(n1, n2){
return n1 + n2;
} //报错
alert(sum(10, 10));
var sum = function (n1, n2){
return n1 + n2;
};

作为值传递

function callFunction(f, args){
return f(args);
} function add(num){
return num + 10;
} callFunction(add, 10); //20 //在一个函数中返回另一个函数
function callFunction(){
return function(){ };
}

函数内部属性

函数内部有两个特殊对象:arguments和this

arguments

arguments.callee属性指向拥有arguments对象的函数,可用于递归调用,消除函数执行与函数名的耦合

//阶乘
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num - 1); //效果相当于return num * factorial(num - 1);
}
} var calFactorial = factorial; factorial = function(){
return 0;
}; calFactorial(5); //120
factorial(5); //0

this

this引用的是函数执行的环境对象(当在全局作用域中调用函数,this对象引用的是window)

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

caller属性

函数对象的属性,保存着调用当前函数的函数的引用,如果是在全局作用域中调用,则值为null

function outer(){
inner();
} function inner(){
alert(inner.caller); //或alert(arguments.callee.caller);
} outer();
/*
弹窗显示
function outer(){
inner();
}
*/

函数属性和方法

length, prototype, call(), apply(), bind()

length

length表示函数希望接收命名参数的个数

function fn1(){}
function fn2(a){}
function fn3(a, b){} alert(fn1.length); //0
alert(fn2.length); //1
alert(fn3.length); //2

prototype

prototype是保存引用类型所有实例方法的地方

prototype不可枚举,for-in无法遍历到

call()和apply()

用途:在特定作用域中调用函数(可扩充函数的作用域)

相当于改变函数体内this所指的对象

接收的第一个参数相同,要代替原this的对象

后面的参数是要执行函数的形参,call()逐个接收,apply()可以将参数作为数组传入

window.num = 0;
var o = {num: 10}; function add(num1, num2){
alert(num1 + num2 + this.num);
} add.call(this, 10, 10); //20
add.call(window, 10, 10); //20
add.call(o, 10, 10); //30 add.apply(this, [10, 10]); //20
add.apply(window, [10, 10]); //20
add.apply(o, [10, 10]); //30

bind()

bind()方法会创建一个函数实例,实例的this被绑定为传入bind()中的参数(类似于call和apply第一个参数的作用)

window.color = 'red';
var o = {color: 'blue'}; function sayColor(){
alert(this.color);
} var objSayColor = sayColor.bind(o);
objSayColor(); //'blue'

基本包装类型

单体内置对象

参考

《JavaScript高级程序设计》(第3版)

JavaScript笔记——引用类型之Object类型和Function类型的更多相关文章

  1. JavaScript的进阶之路(三)引用类型之Object类型和Array类型

    引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var o ...

  2. DATETIME类型和BIGINT 类型互相转换

    项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...

  3. 关于 Go 中 Map 类型和 Slice 类型的传递

    关于 Go 中 Map 类型和 Slice 类型的传递 Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Printl ...

  4. MIME类型和Java类型

    MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...

  5. Timestame类型和String 类型的转化

    Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-M ...

  6. Python3.x中bytes类型和str类型深入分析

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

  7. Date类型和Long类型的相互转换

    Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...

  8. java中XMLGregorianCalendar类型和Date类型之间的相互转换

    import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...

  9. C#枚举类型和int类型相互转换

    C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...

随机推荐

  1. PHP检测终端设备是平板、手机还是电脑

    <?php $ua = $_SERVER['HTTP_USER_AGENT']; function userAgent($ua){ $iphone = strstr(strtolower($ua ...

  2. C可变参数函数 实现

    转自:http://blog.csdn.net/weiwangchao_/article/details/4857567 C函数要在程序中用到以下这些宏: void va_start( va_list ...

  3. 在IIS上部署SSL

    背景: 在处理DropboxAPI开发时,其重定向的URL地址必须是https的[除了localhost],不得已在自己网站上加了ssl,下面简单介绍下添加自签名证书,毕竟只是临时使用. 1.打开II ...

  4. [荐]使用jQuery清空file文件域

    file是文本域,我们一般都会使用它来上传文件,在上传文件时我们需要验证,验证完成后,如果存在错误,为了防止将错误信息也上传上去,我们总是希望能够将其清空.但是在IE中,为了安全起见它是不允许我们改变 ...

  5. Oracle资源

    ORACLE 10g下载地址 oracle 下载还需要用户名我自己注册了个方便大家使用下载 user:1603869780@qq.compass:qwe123QWE现在直接点击不能下载了 要经过ora ...

  6. 智能车学习(四)—— Cmp学习

    一.代码共享 1.cmp.h #ifndef HSCMP_H #define HSCMP_H //1 头文件 #include "common.h" //2 宏定义 //2.1比较 ...

  7. asp.net项目中通过Web.config配置文件及文件夹的访问权限!

    描述:在开发中我们通常会碰到这样的问题,例如:在项目的根目录下面有一个文件或者文件夹需要用户登陆后才能访问.如果用户在没有登录的情况下访问该文件或者该文件夹下面的文件时,直接拦截重定向到对应的登陆页面 ...

  8. SpringJDBC解析2-execute方法

    大家都使用过JDBCTEMPLATE的execute方法,execute作为数据库操作的核心入口,将大多数数据库操作相同的步骤统一封装,而将个性化的操作使用参数PreparedStatementCal ...

  9. CentOS安装PHP和mysql

    新生在不会编译的情况下: 1.安装PHP5 yum install php 根据提示输入Y直到安装完成 2.安装PHP组件,使 PHP5 支持 MySQL yum install php-mysql  ...

  10. hdu 3518 Boring counting 后缀数组基础题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...