引用类型

引用类型的值(对象)是引用类型的一个实例。

一、Object类型

创建Object实例:

         //方法一:通过new操作符创建
var a = new Object();
a.neme = "Tom";
a.age = 3;
//方法二:通过对象字面量创建,注意:此时的name什么的不是局部变量,'{}'相当于执行了new操作呢.....
var b = {
name: "Jerry",
age: 3
};
var c = {}; //与new Object()相同 //对象字面量也是向函数传递大量参数的首选方式
function fun(args) {
if (typeof args.name == "string") {
//doSth
}
if (typeof args.age == 'number') {
//doSth
}
}

访问:

alert(a.name);
alert(a["name"]); //这种语法的优点是可以通过变量访问

二、Array类型

1.数组的每一项可以保存任何类型的数据

2.数组的大小可以动态调整

创建数组

            //方式一:通过new创建
var a = new Array(6); //创建长度为6的数组
var b = new Array(1,2,6,8); //定义并初始化一个数组
//方式二:使用数组字面量
var c = [18,19,88];
var d = [];

检测是否为数组:

alert(a instanceof Array); //该方法在两种不同的全局执行环境下作检测会有问题
//因此可以使用ECMAScript新增的方法:
alert(Array.isArray(a));

转换:

alert(b.join('|')); //1|2|6|8

栈方法(先进后出):

push()函数:接收任意数量的参数,并逐个添加到数组末尾,最后返回修改后数组长度。

pop():从数组末尾移除最后一项,减少数组的length值,返回移除的项。

队列方法(先进先出):

shilft():移除数组的第一项,并返回该项。

unshilt():在数组的前端添加任意个项并返回数组的长度。

重排序:

reverse():反转数组的顺序

sort():该函数调用数组每项(即使该项是数字)的toString()方法,然后比较得到的字符串(当然是按比较字符串的方式)

var a = [5,8,66,89,45,15];
alert(a.sort()); //15,45,5,66,8,89
alert(a); //15,45,5,66,8,89 会改变原数组

这不科学,所以sort()方法接收一个比较函数作为参数

操作方法:

concat()方法:创建数组副本,并把接收到的参数添加到副本末尾,最后返回副本(原数组不改变)

slice()方法:接收一个或者两个参数,起始项和结束项。复制---剪切----返回剪切后的数组

splice()方法:用于删除,插入和替换数组中的项,返回原始数组中的删除项。

splice(arg1,arg2,args3...)

arg1:起始位置

arg2:要删除的项数,插入操作时设置为0

args3:要插入的项,可以为多个

位置方法:

indexOf() lastIndexOf():都接收两个参数,要查找的项和查找起始位置的索引。

迭代方法:

ECMAScript5定义了5个迭代方法,每个方法都接收两个参数:要在每一项运行的函数和运行该函数作用域对象------影响this的值。

传入这些方法的函数会接收三个参数:数组项的值,该项在数组中的位置和数组对象本身。

1)every():对数组的每一项都运行给定函数,如果该函数对每一项都返回true则,则every()返回true

2)filter():对数组的每一项运行给定函数,返回该函数会返回true的项组成的新数组

3)forEech():对数组的每一项运行给定函数,无返回值,该操作也不会影响数组。

4)map():对数组的每一项运行给定函数,返回每次函数调用的结果组成的数组

5)some():对数组的每一项运行给定函数,如果该函数对任意一项返回true,则返回true

示例:

            var a = [5,8,66,89,45,15];
var everyResult = a.every(function (item) {
return item > 15;
});
alert(everyResult); //false
var someResult = a.some(function (value) {
return value > 15;
});
alert(someResult); //true
var fileterResult = a.filter(function (value) {
return value > 15;
});
alert(fileterResult); //66,89,45

归并方法:

所谓归并方法:迭代数组的所有项,然后构件一个最终返回值。

ECMAScript5新增了两个归并数组的方法:reduce()    reduceRight()两个方法都接收两个参数,一个是在数组的每一项都会调用的函数,另一个参数是作为递归的初始值。

参数一的函数接收四个参数:前一个值,当前值,项的索引,和数组对象,这个函数的返回值会作为第一个参数传给下一项。

var values = [1,2,3,4,5,6];
var sum = values.reduce(function (pre, cur) {
return pre+cur;
});
console.log(sum); //

三、Date类型

ECMAScript使用UTC开始经过的毫秒数来保存时间。

创建:

var date = new Date(); //创建当前时间和日期

重要的方法:

Date.parse():传入表示日期的字符串,返回毫秒数。字符串无法解析返回NaN

Date.UTC():该函数也返回毫秒数,但该函数接收参数:年份,基于0的月份,月份中的哪一天,小时数.......

var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55));

注意Date的构造函数会模仿以上两个函数。

Date.now():放回当前时间毫秒数

其他方法请查看API

四、RegExp类型

ECMAScript通过RegExp类型来支持正则表达式,语法:

var expression = /pattern/flag;
//用RegExp构造函数
var p = new Reg Exp('pattern', 'flag');
//注意由于RegExp构造函数模式参数是字符串,所以有时要进行双重转义。

pattern为正则表达式,flag表面正则表达式行为:

g: 表达式被应用于所有字符串,而非发现第一个时立即停止。

i: 忽略大小写

m: 多行模式

使用正则表达式字面量和使用 RegExp 构造函数创建的正则表达式不一样。在 ECMAScript 3 中,
正则表达式字面量始终会共享同一个 RegExp 实例,而使用构造函数创建的每一个新 RegExp 实例都是 一个新实例。例如:

    var re = null,
i;
for (i=0; i < 10; i++){
re = /cat/g;
re.test("catastrophe");
}
for (i=0; i < 10; i++){
re = new RegExp("cat", "g");
re.test("catastrophe");
}

在第一个循环中,即使是循环体中指定的,但实际上只为/cat/创建了一个 RegExp 实例。由于实
例属性(下一节介绍实例属性)不会重置,所以在循环中再次调用 test()方法会失败。这是因为第一
次调用 test()找到了"cat",但第二次调用是从索引为 3 的字符(上一次匹配的末尾)开始的,所以
就找不到它了。由于会测试到字符串末尾,所以下一次再调用 test()就又从开头开始了。
第二个循环使用 RegExp 构造函数在每次循环中创建正则表达式。因为每次迭代都会创建一个新的
RegExp 实例,所以每次调用 test()都会返回 true。
ECMAScript 5 明确规定,使用正则表达式字面量必须像直接调用 RegExp 构造函数一样,每次都创
建新的 RegExp 实例。 IE9+、 Firefox 4+和 Chrome 都据此做出了修改。

RegExp实例属性:

 global:布尔值,表示是否设置了 g 标志。
 ignoreCase:布尔值,表示是否设置了 i 标志。
 lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
 multiline:布尔值,表示是否设置了 m 标志。
 source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

RegExp实例方法:

RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即
要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null。
返回的数组虽然是 Array 的实例,但包含两个额外的属性: index 和 input。其中, index 表示匹配
项在字符串中的位置,而 input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配
的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
请看下面的例子。

    var text = "a home a kid a fool mom and dad and baby";
var p = /mom (and dad (and baby)?)?/g var m = p.exec(text);
console.log(m.index);
console.log(m.input);
console.log(m[0]);
console.log(m[1]);
console.log(m[2]); /*
* 20
* a home a kid a fool mom and dad and baby
* mom and dad and baby
* and dad and baby
* and baby
* */

对于 exec()方法而言,即使在模式中设置了全局标志(g),它每次也只会返回一个匹配项。在不
设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息。而在设
置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项,如下面的例子所示。

    var text = "cat, bat, sat, fat";
var pattern1 = /.at/;
var matches = pattern1.exec(text); alert(matches.index); //
alert(matches[0]); //cat
alert(pattern1.lastIndex); // matches = pattern1.exec(text); alert(matches.index); //
alert(matches[0]); //cat
alert(pattern1.lastIndex); // var pattern2 = /.at/g;
var matches = pattern2.exec(text); alert(matches.index); //
alert(matches[0]); //cat
alert(pattern2.lastIndex); // matches = pattern2.exec(text); alert(matches.index); //
alert(matches[0]); //bat
alert(pattern2.lastIndex); //

正则表达式的第二个方法是 test(),它接受一个字符串参数。在模式与该参数匹配的情况下返回
true;否则,返回 false。

ECMAScript 正则表达式不支持的特性 :

 匹配字符串开始和结尾的\A 和\Z 锚①
 向后查找(lookbehind) ②
 并集和交集类
 原子组(atomic grouping)
 Unicode 支持(单个字符除外,如\uFFFF)
 命名的捕获组③
 s(single,单行)和 x(free-spacing,无间隔)匹配模式
 条件匹配
 正则表达式注释

① 但支持以插入符号(^)和美元符号($)来匹配字符串的开始和结尾。
② 但完全支持向前查找(lookahead)。
③ 但支持编号的捕获组。

五、Function类型

在ECMAScript中函数实际上是对象,每个函数都是Function类型的实例,函数名实际上是一个指向函数对象的指针,不会与某个函数绑定。

函数的声明:

//方式一,函数声明
function f(a,b){
//doSth
}
//方式二,函数表达式
var m = function(a,b){
//doSth
}
//方式三,new操作符
var fun = new Function("a","b","return a + b"); //不推荐该方式

函数声明与函数表达式的区别:

解析器会率先读取函数声明,并使其在执行任何代码之前可用。

表达式则按照普通表达式的顺序执行。

但这只是执行顺序问题,作用域链不会受影响函数声明出来的f,也是一个带var的变量。

作为值的函数

函数名本来就是变量,因此函数可用作为值来使用,即可用被另一个函数当做参数、返回值。

函数的内部属性:

1)arguments

2)this:指向函数执行环境的变量对象

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

3)callee:该属性是一个指针,指向拥有这个arguments对象的函数。使用该属性可以使函数的执行和函数名解耦。

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

4)caller:ECMAScript 5支持,这个属性保存着调用当前函数的函数引用,如果是在全局作用域中调用函数,该属性为null

        window.onload = function () {
function outer() {
inner();
} function inner() {
console.log(arguments.callee.caller);
} outer(); //显示outer()函数的源代码
}

函数的属性和方法:

length属性:表示函数希望接受命名参数的个数。

proptoype属性:保存所有实例方法。ECMAScript5中该属性不可枚举。

apply()和call()方法:两个方法的用途都是在特定作用域中调用函数

        var a = 8;
window.onload = function () {
var obj = {a:99}
function sum(num1, num2) {
return num1 + num2 + this.a;
} function sum2(num1, num2) {
return sum.call(this,num1,num2); //只能这么用,不能像apply那样传入arguments或数组
} function sum3(num1, num2) {
return sum.apply(this,arguments);
} function sum4(num1, num2) {
return sum.apply(this,[num1,num2]);
} function sum5(num1, num2) {
return sum.call(obj,num1,num2); //扩充函数作用域
} function sum6(num1, num2) {
return sum.apply(obj,arguments);
} console.log(sum2(2,2)); //
console.log(sum3(2,2)); //
console.log(sum4(2,2)); //
console.log(sum5(2,2)); //
console.log(sum6(2,2)); //
}

ECMAScript5 定义的bind()方法:该方法会返回一个函数的实例,其this值会被绑定为传给bind()的参数

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

六、基本包装类型

所谓基本包装类型就是ECMAScript包装的三个特殊引用类型:String,Boolean,Number

每当读取一个基本类型值的时候,后台就会创建一个基本包装类型的对象,从而使我们能调用一些方法来处理数据。

            var str = "The end of the world!"
console.log(str.substr(3));//end of the world!"

以上代码执行过程:

1)创建一个String类型的实例

2)在实例上调用指定方法

3)销毁该实例

可以想象为代码:

var str = new String("The end of world!");
console.log(str.substring(3));
str = null;

基本包装类型与一般引用类型的主要区别就是对象的生命周期,基本包装类型只存在于执行代码的一瞬间,

执行完毕后立即被销毁。这意味着我们不能为基本包装类型添加属性和方法。

            var str = "High but not dry.";
str.name = "the cure";
console.log(str.name); //undefined var str2 = new String("Friday I'm in love.");
str2.name = "the cure";
console.log(str2.name); //the cure
          var str = "A letter to Elise";
var str2 = new String("A letter to Elise"); console.log(typeof str); //string
console.log(typeof "letter"); //string
console.log(typeof str2); //object
var value = "25";
var number = Number(value); //转型函数
alert(typeof number); //"number"
var obj = new Number(value); //构造函数
alert(typeof obj); //"object"

一)Boolean

最常见的问题:

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

其实也好理解,new(调用构造函数) 出来的在赋值给变量的,永远是一个正真的引用类型,该变量的值是一个引用类型的地址。

二)Number

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

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

toExponential()
返回以指数表示法(也称 e 表示法)表示的数值的字符串形式 
toPrecision()会根据要处理的数值决定到底是调用 toFixed()还是调用 toExponential()。

三)String

length属性:字符个数

方法:

charAt()

charCodeAt()

contact(str)

str[index]

slice(index,index2)

substr(index,len):第二个参数指定返回字符串个数

substring(index,index2)

trim(str)

以上方法都不影响原字符串

localcompare(str):比较字符串,并返回-1,0,1中的一个

七、单体内置对象

内置对象:由ECMAScript实现提供,不依赖宿主环境的对象,这些对象在ECMAScript程序执行以前就已经存在。

如:Object、String、Array

一)Global对象

所有在全局域中定义的属性和函数,都是Global对象的属性。浏览器通常将Global对象作为window对象一部分加以实现。

如parseInt(),isNaN()等

1)URI编码方法()略

2)eval()略

二)Math对象

JavaScript基础笔记(三) 引用类型的更多相关文章

  1. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

  2. JavaScript基础笔记一

    一.真假判断 真的:true.非零数字.非空字符串.非空对象 假的:false.数字零.空字符串.空对象.undefined 例: if(0){ alert(1) }else{ alert(2) } ...

  3. JavaScript基础(三)

    十三.JS中的面向对象 创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 ...

  4. JavaScript基础笔记集合(转)

    JavaScript基础笔记集合   JavaScript基础笔记集合   js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译   js存放的位置 html脚本必须放在&l ...

  5. Javascript学习笔记三——操作DOM(二)

    Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...

  6. MYSQL基础笔记(三)-表操作基础

    数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...

  7. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  8. javascript基础数据类型与引用类型

    javascript一共有6种数据类型 有5种基本类型:Null,String Number,Boolean,Undefined 和一种引用类型Object 基础类型在内存中存在于栈空间中,例如 va ...

  9. Android路径之Javascript基础-笔记

    一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAscipt. d.特 ...

随机推荐

  1. hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411

    这题用直接枚举是超时的,必须要用搜索来搜索出所有可能的状态,然后再进行枚举 这是较慢的做法 /* 方格取数,相邻格子的数不可取,问最多取到的和是什么 有点类似炮兵布阵,先打出所有可能的状态,然后dp[ ...

  2. Django的Session存储Redis环境配置

    第一步:在项目目录下的settings.py中MIDDLEWARE中加上中间件: # session中间件Django项目默认启用Session 'django.contrib.sessions.mi ...

  3. Python(列表操作应用实战)

    # 输入一个数据,删除一个列表中的所有指定元素# 给定的列表数据data = [1,2,3,4,5,6,7,8,9,0,5,4,3,5,"b","a",&quo ...

  4. python中深拷贝与浅拷贝

    # 1.浅拷贝(复制东西)a = [11,22,33] # 实际上是浅拷贝# 没有把这个变量的值赋进去,而是把另一个变量的地址拿过去了,就叫浅拷贝.b = a # print(id(a))# prin ...

  5. views.py视图函

    views.py视图函数来自 urls 的映射关系 常用所需模块 from django.shortcuts import render # ****** 渲染 render 跳转到指定的 url.h ...

  6. DevOps 在公司项目中的实践落地

    原文出处:https://www.cnblogs.com/beef/p/7743594.html ref: [DevOps]团队敏捷开发系列--开山篇 https://www.cnblogs.com/ ...

  7. jQuery中的extend()方法

    通常我们使用jquery的extend时,大都是为了实现默认字段的覆盖,即若传入某个字段的值,则使用传入值,否则使用默认值.如下面的代码: function getOpt(option){ var _ ...

  8. ASP.NET Web Api 2 接口API文档美化之Swagger

    使用第三方提供的swgger ui 可有效提高 web api 接口列表的阅读性,并且可以在页面中测试服务接口. 但本人在查阅大量资料并进行编码测试后,发现大部分的swagger实例并不能有效运行.例 ...

  9. drone的pipeline原理与代码分析

    最近的一个项目,需要实现一个工作任务流(task pipeline),基于之前CICD的经验,jenkins pipeline和drone的pipeline进入候选. drone是基于go的cicd解 ...

  10. Python_str 的内部功能介绍

    float: x.as_integer_ratio():把浮点型转换成分数最简比 x.hex():返回当前值的十六进制表示 x.fromhex():将十六进制字符串转换为浮点型 float与long的 ...