JavaScript笔记——引用类型之Object类型和Function类型
《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类型的更多相关文章
- JavaScript的进阶之路(三)引用类型之Object类型和Array类型
引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var o ...
- DATETIME类型和BIGINT 类型互相转换
项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...
- 关于 Go 中 Map 类型和 Slice 类型的传递
关于 Go 中 Map 类型和 Slice 类型的传递 Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Printl ...
- MIME类型和Java类型
MIME类型和Java类型 类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”.类型转换可以在“生产者 ...
- Timestame类型和String 类型的转化
Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-M ...
- Python3.x中bytes类型和str类型深入分析
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
- Date类型和Long类型的相互转换
Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- C#枚举类型和int类型相互转换
C#枚举类型和int类型相互转换 C# 枚举(Enum) 枚举是一组命名整型常量.枚举类型是使用 enum 关键字声明的. C# 枚举是值数据类型.换句话说,枚举包含自己的值,且不能继承或传递继承. ...
随机推荐
- hdu 4762 公式 java
n/(n)^(m-1) import java.io.*; import java.math.*; import java.util.*; public class Main { static Big ...
- JDK 1.5 1.6 override区别
今天在更新时发现有个别项目报错,报错信息 到网上搜索了之后,根据网上描述,修改了一批配置都不行: http://bestchenwu.iteye.com/blog/997420(这个里面的方法二,即为 ...
- JSON详解以及可以把javabean转换成json串的json-lib应用
JSON 1. json是什么 它是js提供的一种数据交换格式! 2. json的语法 {}:是对象! 属性名必须使用双引号括起来!单引不行!!! 属性值:null,数值,字符串,数组:使用[]括起来 ...
- 用PHP链接mysql数据库
PHP提供了两套数据库可用于访问mysql数据库 1)MySQL扩展函数数据库 2)MySQLI扩展数据库(improved) 使用MySQLI函数访问MySQL数据库步骤 1)链接数据库管理系统 m ...
- lr_think_time参数化
深圳湖北籍软件测试群 275212937
- 类中用const限定的成员函数
本文转自http://blog.csdn.net/whyglinux/article/details/602329 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非 ...
- 深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- Y86模拟器安装
Y86模拟器安装 这周需要学习Y86下的指令集开发,Y86和x86可以说是孪生兄弟,但是还是存在着一些小的差别.接下来介绍如何进行linux-debian平台下的Y86模拟器安装. 虚拟机VMware ...
- js小例子(简单模糊匹配输入信息)
该例子实现的是用户输入信息或者字母时可以搜索出来,鼠标点击选择 <!DOCTYPE html> <html> <style> p{ width:200px; hei ...
- java基础-变量
浏览以下内容前,请点击并阅读 声明 java中的变量分为四种: 实例变量(非静态字段):一个java类中没有static关键词修饰的字段 类变量(静态字段):一个java类中带有static关键词修饰 ...