引用类型(对象是某个特定引用类型的实例)
2017-02-20 10:15:58 0 举报
AI智能生成
引用类型是一种数据结构,它存储的是对象在内存中的地址,而不是对象本身。这意味着,当我们创建一个引用类型的变量时,实际上是在创建一个指向堆内存中某个对象的指针。这使得我们可以在不同的变量之间共享和操作同一个对象,而不需要复制对象本身。引用类型通常用于表示复杂的数据结构,如类、接口和委托等。由于引用类型在使用时需要额外的内存管理,因此它们可能会导致更高的内存消耗和性能开销。然而,通过使用引用类型,我们可以更灵活地组织和管理代码,实现更高效的数据操作和通信。
作者其他创作
大纲/内容
5.7 单体内置对象
ranklist
聊天
popularity
动态
temporary
概念
对象是某个特定引用类型的实例
新对象是使用new操作符后跟一个构造函数来创建的。
构造函数本身就是一个函数,只不过该函数是出于创建
新对象的目的而定义的
构造函数本身就是一个函数,只不过该函数是出于创建
新对象的目的而定义的
5.1 Object类型
创建对象(2种)
varperson = new Object();
new操作符后跟Object构造函数
var person = {
name:'lishan',
age:29
}
name:'lishan',
age:29
}
使用对象字面量表示法
第二种适合包含大量属性的对象的过程
var person = {};//与 new Object()相同,定义只包含默认属性和方法的对象
使用对象(2种)
alert (person.name);
实例点属性
alert(person["name"]);
实例[属性名的字符串];
或者
实例[属性名变量];
或者
实例[属性名变量];
方括号主要优点是可以通过变量来访问属性,也适合
属性名中包含会导致语法错误的字符,或者属性名使用
的是关键字或保留字
属性名中包含会导致语法错误的字符,或者属性名使用
的是关键字或保留字
person["first name"];//ok
person.first name;//报错
person.first name;//报错
5.2 Array
创建数组(2种)
var colors = new Array();//一个空的数组
var colors = new Array(20);//长度为20的数组
var colors= new Array("red","blue","green");//包含3个字符串的数组
var colors = new Array(20);//长度为20的数组
var colors= new Array("red","blue","green");//包含3个字符串的数组
使用Array构造函数,其中new字省略
也能达到同样的效果
也能达到同样的效果
var colors = ['red','blue','green'];创建一个包含3个字符串的数组
length的使用
可以改变数组长度
var colors = ['red','blue','green'];
colors[colors.length]="black";
colors[colors.length]="black";
利用length属性也可以方便地在数组末尾添加新项
Array.isArray(被检测数组);//检测是不是数组
instanceof操作符会由于网页上
可能同时存在多个不同版本的Array,
所以可能检测不出来。所以使用isArray
来替代instanceof,目的是忽略掉多个框架
可能同时存在多个不同版本的Array,
所以可能检测不出来。所以使用isArray
来替代instanceof,目的是忽略掉多个框架
转换方法
所有对象都具有toLocaleString(),toString(),valueOf()方法,用于将对象转为字符串
var colors= ['red','blue','green'];
alert(colors.toString());//red,blue,green 每个 值得字符串表示拼接成了一个字符串,中间以逗号分隔
alert(colors.valueOf());//red,blue,green
alert(colors);//red,blue,green 默默在后台调用了toString方法,所以会和1相同结果
alert(colors.toString());//red,blue,green 每个 值得字符串表示拼接成了一个字符串,中间以逗号分隔
alert(colors.valueOf());//red,blue,green
alert(colors);//red,blue,green 默默在后台调用了toString方法,所以会和1相同结果
colors.join("-");//red-green-blue
toString,toLocaleString,valueOf方法在默认情况下都会以逗号分隔
的字符串的形式返回数组项,用join就可以改变分隔符
的字符串的形式返回数组项,用join就可以改变分隔符
如果数组中的某一项的值是null或者undefined,
那么该值在join()、tolocaleString、toString、valueOf方法
返回的结果中以空字符串表示
那么该值在join()、tolocaleString、toString、valueOf方法
返回的结果中以空字符串表示
5.3 Date
5.4 RegExp
5.5 Function
每个函数都是Function类型的实例,函数名实际上也是一个指向函数对象的指针
创建函数(3种)
function sum(num1,num2){
return num1+num2;
}
return num1+num2;
}
函数声明法
var sum = function(num1,num2){
return num1+num2;
};//注意这最后有一个分号,因为这是普通的var语句
return num1+num2;
};//注意这最后有一个分号,因为这是普通的var语句
声明变量法
var sum = new Function("num1","num2","return num1+num2");//不推荐
构造函数法,但不推荐这种,
因为会导致解析两次代码,第一次是
解析常规的ECMAscript代码,第二次是
解析传入构造函数中的字符串,从而影响
性能,但是这种方法说明了 函数是对象,
函数名是指针
因为会导致解析两次代码,第一次是
解析常规的ECMAscript代码,第二次是
解析传入构造函数中的字符串,从而影响
性能,但是这种方法说明了 函数是对象,
函数名是指针
5.5.2 函数声明与函数表达式
alert(sum(10,10));//不会报错
function sum(num1,num2){
return num1+num2;
}
alert(sum(10,10));//报错
var sum = function(num1,num2){
return num1+num2;
}
function sum(num1,num2){
return num1+num2;
}
alert(sum(10,10));//报错
var sum = function(num1,num2){
return num1+num2;
}
解析器会率先读取函数声明,并使其在执行
任何代码之前可用;至于函数表达式,则必须等到
解析器执行到它所在的代码行,才会真正被解析执行
任何代码之前可用;至于函数表达式,则必须等到
解析器执行到它所在的代码行,才会真正被解析执行
5.5.4 函数内部属性
在函数内部,有两个特殊的对象:arguments和this
this
this引用的是函数执行的环境对象
函数的名字仅仅是一个包含指针的变量而已。因此,即使是在不同的环境中执行,全局sayColor()函数与
o.sayColor()指向的仍然是同一个函数
o.sayColor()指向的仍然是同一个函数
arguments
arguments保存函数参数,但这个对象还有一个名叫callee的属性,
该属性是一个指针,指向拥有这个arguments对象的指针
该属性是一个指针,指向拥有这个arguments对象的指针
函数对象属性:caller
ECMAScript5定义的
这个属性中保存着调用当前函数
的函数的引用,如果是在全局作用域
中调用当前函数,他的值为null
的函数的引用,如果是在全局作用域
中调用当前函数,他的值为null
function outer(){
inner();
}
function inner(){
alert(inner.caller);//或者alert(arguments.callee.caller);
}
inner();
}
function inner(){
alert(inner.caller);//或者alert(arguments.callee.caller);
}
5.5.5 函数属性和方法
length和prototype
length
表示函数希望接受的命名参数的个数
function sayName(name){
}
alert(sayName.length);//1
function sum(num1,num2){}
alert(sum.length);//2
}
alert(sayName.length);//1
function sum(num1,num2){}
alert(sum.length);//2
prototype
子主题
sayColor.apply(执行环境,参数);//参数为数组,一调用马上执行
sayColor.call(执行环境,一个一个参数传递);//参数为一个一个的,一调用马上执行
var bind = sayColor.bind(执行环境,参数数组);//var变量可以在想要执行的地方执行,不是一开始就执行
sayColor.call(执行环境,一个一个参数传递);//参数为一个一个的,一调用马上执行
var bind = sayColor.bind(执行环境,参数数组);//var变量可以在想要执行的地方执行,不是一开始就执行
支持bind方法的浏览器有IE9+、Firefox4+,Safari 5.1+、Opera12+、chrome
每个函数继承的toLocaleString()和toString(),valueOf()方法始终都返回函数的代码
5.6 基本包装类型
why
为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类型
Boolean、Number、String
what
与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。
实际上,每当读取一个基本类型值得时候,后台会创建一个对应的基本包装
类型的对象,从而让我们能够调用一些方法来操作这些数据
实际上,每当读取一个基本类型值得时候,后台会创建一个对应的基本包装
类型的对象,从而让我们能够调用一些方法来操作这些数据
var s1 = "some text";
var s2 = s1.substring(2);
相当于(1)创建String类型的一个实例
(2)在实例上调用指定的方法
(3)销毁这个实例
var s2 = s1.substring(2);
相当于(1)创建String类型的一个实例
(2)在实例上调用指定的方法
(3)销毁这个实例
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
var s2 = s1.substring(2);
s1 = null;
引用类型VS基本包装类型
引用类型new操作生成的对象,只要当前作用域还在,他就存在
基本包装类型new操作生成的对象,只存在于一行代码的执行瞬间,然后立刻被销毁
意味着
不能再运行时为基本类型值
添加属性和方法
不能再运行时为基本类型值
添加属性和方法
eg:var s1 = "some text";
s1.color = "red";
alert(s1.color);//undefined
s1.color = "red";
alert(s1.color);//undefined
第二行代码试图为字符串s1添加一个color属性。但是,当第三行代码再次访问s1时,
其color属性不见了。因为第二行创建的String对象在执行第三行代码时已经被销毁了,
第三行代码又创建自己的String对象,而该对象没有color属性
其color属性不见了。因为第二行创建的String对象在执行第三行代码时已经被销毁了,
第三行代码又创建自己的String对象,而该对象没有color属性
5.6.1 Boolean类型
永远不要使用Boolean对象
5.6.2 Number类型
创建
var nmberObject = new Number(10);
toString(进制)
进制为空的时候,是10进制
var num = 10;
num.toString();//10
num.toString(2);//"1010"
num.toString();//10
num.toString(2);//"1010"
toFixed(小数点位数)
var num = 10.005;
num.toFixed(2);//10.01
num.toFixed(2);//10.01
如果数值本身包含的小数位比指定的多,
那么接近指定的最大小数位的值就会舍入
那么接近指定的最大小数位的值就会舍入
ie8及之前版本不能正确舍入(-0.94,-0.5],[0.5,0.94))之间的值,
ie会返回0,而不是-1或者1。ie9就修复了这个问题
ie会返回0,而不是-1或者1。ie9就修复了这个问题
toExponential(小数点数位)
var num = 99;
num.toPrecision(1);//1e+2
num.toPrecision(2);//99
num.toPrecision(3);//99.0
num.toPrecision(1);//1e+2
num.toPrecision(2);//99
num.toPrecision(3);//99.0
5.6.3 String类型
属性
length
var str = "hello world";
str.length;//11
str.length;//11
方法
访问字符串中特定字符(2个)
chartAt(数字);//数字基于0的字符位置
var stringValue = "hello world";
stringValue.charAt(1); //"e"
stringValue.charAt(1); //"e"
charCodeAt(数字);//同上
var stringValue = "hello world";
stringValue.charCodeAt(1); //101
stringValue.charCodeAt(1); //101
字符串操作方法
concat();//将一个或多个字符串拼接起来
var str = "hello";
var result = str.concat(" word","!");
result;//hello world!
str;//hello
var result = str.concat(" word","!");
result;//hello world!
str;//hello
1、str的值都没变过的
2、用加号做字符串的拼接更方便
2、用加号做字符串的拼接更方便
基于子字符串创建新字符串的方法(3个)
var stringValue = "hello world";
stringValue.slice(3); //lo world
stringValue.slice(3); //lo world
0 条评论
下一页