JavaScript —— 基本类型,引用类型,基本包装类型,单体内置对象

基本类型

基本数据类型:Number,String,Boolean,Null,undefined。混合数据类型:object
引用数据类型:Array,Date,RegExp,Function
typeof数据类型:object,number,function,boolean,undefined

ECMAScript变量包括两种不同数据类型的值:基本类型值和引用类型值。
基本类型值:简单的数据段
引用类型值:指可能由多个值构成的对象;引用类型的值是保存在内存中的对象。
JavaScript不允许直接访问内存中的位置,也就是说,不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际对象。

引用类型

引用类型的值(对象)是引用类型的一个实例。
引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,只不过该函数是出于创建新对象的目的而定义。(Array类型请见另一篇文章)

object类型

object类型 原生引用类型
大多数引用类型值都是object类型的实例;
创建object实例的方式有两种:
1.使用new操作符后跟Object构造函数 var person = new Object();
2.对象字面量表示法。是对象定义的一种简写形式,简化创建包含大量属性的对象的过程。
var person = {“name”:“ABC”};
在使用对象字面量语法时,属性名也可以使用字符串
var person = {“name”:“ABC”,“age”:29,5:true};5也会自动转为字符串

一般来说,访问对象属性时使用的都是点表示法,JavaScript也可以使用方括号表示法来访问对象的属性。方括号语法的优点是可以通过变量来访问属性。建议使用点表示法
var propertype = “name”;
alert(person[propertype]);“ABC”

Date类型

Date类型使用自UTC 1970年1月1日午夜(零时)开始经过的毫秒数来保存日期
Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数
Date.parse()方法的行为因实现而异,而且通常是因地区而异
美国: “月/日/年” “英文月,日,年” “英文星期几 英文月 日 年 时:分:秒 时区”
var someDate = new Date(Date.parse(“May 25,2004”));
var someDate = new Date(“May 25,2004”); 等价,后台自动调用Date.parse()
Date.now()方法,返回表示调用这个方法时的日期和时间的毫秒数。
例:

var start = Date.now();  //取得开始时间
dosomething(); //调用函数
var stop = Date.now();  //取得停止时间或 var stop = + new Date();
result = stop - start; 在不支持它的浏览器中,使用+操作符获取Date对象时间戳

RegExp类型(本地对象)

  1. var expression = /pattern/flags; 字面量形式来定义的正则表达式
    flags:标明正则表达式的行为
    g:表示全局模式。即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
    i:表示不区分大小写模式
    m:表示多行模式
    与其他语言中的正在表达式类似,模式中使用的所有元字符都必须转义。
    正则表达式中元字符:( [ { \ ^ $ | ) ? * + . ] }
  2. 使用RegExp构造函数,两个参数:要匹配的字符串模式,可选的标志字符串
    var pattern = new RegExp("\[bc\at",“i”);
    RegExp对象的主要方法是exct(),专门捕获组而设计的
    第二个方法是test(),接收一个字符串参数,在模式与该参数匹配的情况下返回true。

Function类型

函数实际上是对象
由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定

  1. 函数声明语法

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

  2. 函数表达式定义函数

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

  3. 使用function构造函数,可以接收任意数量参数,最后一个参数是在被看成函数体

    var sum = new Function(“num1”,“num2”,“return num1+num2”);不推荐

由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没什么不同。
一个函数肯会有好几个名字

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

声明变量anotherSum,并将其设置为与sum相等(将sum的值赋给anotherSum),注意!使用不带圆括号的函数名是访问函数指针,而非调用函数。此时,anotherSum和sumd都指向同一个函数,sum设为null,也不影响anothersum。

没有重载
声明两个同名函数,而结果则是后面的函数覆盖了前面的函数

原始数据类型和引用数据类型的区别

存储位置不同
原始数据类型直接存储在栈中的简单数据段,占据空间小,大小固定,属于被频繁使用的数据,所以放入栈中存储
引用数据类型存储在堆中的对象,占据空间大,大小不固定,如果存储在栈中,将会影响程序运行的性能,引用数据类型在栈中存储指针,改指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索栈中的地址,取得地址后从堆中获得实体。

定义基本类型值和引用类型值得方式是类似的:创建一个变量并为该变量赋值,当这个值保存到变量中以后,对不同类型值可执行的操作大相径庭。对于引用类型的值,可以为其添加属性和方法,也可以改变和删除其属性和方法。

基本包装类型

为了方便操作基本类型值。ECMAScript提供了3个特殊的引用类型:Boolean,Number和String
var s1 = “some text”;
var s2 = s1.substring(2);
基本类型值不是对象,逻辑上它们不应该有方法。
当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理。基本的字符串值就变得跟对象一样了。

1.创建String类型的一个实例
2.在实例上调用指定的方法
3.销毁这个实例
var s1 = new String(“some text”);
var s2 = s1.substring(2);
s1 = null;

Number类型

toString()方法传递一个表达基数的参数,告诉它返回几进制数值的字符串形式。
var num = 10;
alert(num.toString());//“10”
alert(num.toSting(2));//“1010” 2进制
toFixed()按照指定的小数位返回数值的字符串表示
alert(num.toFixed(2));//“10.00”
var num = 10.005;
alert(num.toFixed(2));//"10.01"自动舍入

String类型

每个实例都有一个length属性

字符方法

两个用于访问字符串中特定字符的方法:charAt()和charCodeAt()
charAt()方法以单字符字符串的形式返回给定位置的那个字符
var stringvalue = “hello world”;
alert(stringvalue.charAt(1));//“e”
charCodeAt() 得到的是字符编码
alert(stringvalue.charCodeAt(1));//“101”
可以使用方括号加数字索引来访问字符串的特定字符
alert(stringvalue[1]);//“e” IE7以前返回undefined

字符串操作方法

  1. concat()方法 将一或多个字符串拼接起来,返回拼接得到的新字符串
    var result = stringvalue.concat("!"); 可接受多个参数,不影响原来字符串
    alert(result);//“hello world!”
    拼接字符串更多还是加号操作符(+)

  2. ECMAScript提供了三个基于子字符串创建新字符串的方法:slice(),substr(),substring()都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数,不会修改字符串本身

  • 第一个参数指定子字符串的开始位置,slice()和substring()的第二个参数指定的子字符最后一个字符串后面的位置,而substr()的第二个参数指定的而是返回的字符个数
  • 参数是负值
    slice()方法会将传入的负值与字符串的长度相加,
    substr()方法将负的第一个参数加上字符串的长度,将负的第二个参数转换为0,,
    substring()方法会把所有的负值参数转为0
  1. 字符串位置方法
    从字符串查找字符串的方法:indeOf()和lastIndexOf()返回子字符串的位置
    都可以接受可选的第二个参数,表示从字符串中的哪个位置开始搜索

  2. tirm()方法
    创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果
    var str = " hello ";alert(str.trim());//“hello”

  3. 字符串大小写转换方法
    toLowerCase(),toLocaleLowerCase(),toUpperCase(),toLocaleUpperCase()

  4. 字符串的模式匹配方法

  • match() 本质与调用RegExp的exec()方法相同,只接受一个参数正则表达式/RegExp对象
    var text = “cat,bat,sat,fat”;
    var pattern = /.at/; //与pattern.exec(text);相同
    var matches = text.match(pattern);
    alert(matches.index); //0
    alert(matches[0]); //“cat”
    alert(pattern.lastIndexOf());// “0”

  • 查找模式的方法是search()
    返回字符串中的第一个匹配项的索引
    var text = “cat,bat,sat,fat”;
    var pos = text.search(/at/);
    alert(pos);//"at"在字符串中第一次出现的位置

  • replace()方法
    两个参数,RegExp对象或一个字符串,一个字符串或一个函数
    var text = “cat,bat,sat,fat”;
    var result = text.replace(/at/g,“ond”);
    alert(result);//“cond”,“bond”,“sond”,“fond”

  • split()方法
    指定的分隔符将一个字符串分隔成多个子字符串,并将结果放在一个数组中,分隔符可以是字符串,也可以是一个RegExp对象,2个参数可选指定数组的大小
    var colorText = “red,blue,green,yellow”;
    var color1 = colorText.split(",");//[“red”,“blue”,“green”,“yellow”]
    var color2 = colorText.split(",",2);//[“red”,“blue”]

  1. localeCompare()方法,比较两个字符串,按字母表中排序规则

  2. formCharCode()方法,接收一或多个字符编码,然后将它们转换成一个字符串,charCodeAt()执行的是相反的操作

引用类型与基本包装类型的主要区别是对象的生存期

使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后,立即被销毁。这意味着我们不能再运行时为基本类型值添加属性和方法。
对基本包装类型的实例调用typeof会返回"object",所有基本包装类型的对象都会被转换为布尔值true。

单体内置对象 (gload,Math不可以实例化的)

ECMAScript-262定义:由EXMAScript实现提供的,不依赖于宿主环境的对象,这些对象这些对象在ECMAScript程序执行之前就已经存在了。Global和Math
所有在全局作用域中定义的属性和函数,都是Global对象的属性

  1. URI编码方法
    Global对象的encodeURI()和encodeURIComponent()方法可以对URI(通用资源标识符)进行编码,以便发送给浏览器

  2. eval()方法
    eval()方法就像是一个完整的ECMAScript解析器,它只接受一个参数,要执行的ECMAScript(或JavaScript)字符串
    eval("alert(“hi”));等价于alert(“hi”);
    eval()执行的代码可以引用在包含环境中定义的变量
    var msg = “hello world”;eval(“alert(msg)”);//“hello world”
    eval()中创建的任何变量或函数都不会被提升,因为解析代码的时候,它们被包含在一个字符串中,只在eval()执行的时候创建

window对象

ECMAScript没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的,因此,在全局作用域中,声明的所有变量和函数,就都成了window对象的属性。
另一种取得Global对象方法

var global = function(){
	return this;
}();

立即执行函数,返回this值,没有给函数指明指定this值得情况下,this值等于Global对象

Math对象

  1. min()和max()方法
    要找到数组中最大或最小值,如下:
    var val = [1,2,3,4,5,6,7,8];
    var max = Math.max.apply(Math,val);
    把Math对象作为apply的第一个参数,从而正确设置this值

  2. 舍入方法
    Math.ceil() 向上舍入 Math.ceil(25.9);//26
    Math.floor() 执行向下舍入 Math.floor(25.9);//25
    Math.round() 标准舍入 25.9->26 25.5->26 25.1->25

  3. rondom()方法
    返回大于等于0小于1的一个随机数
    值 = Math.floor(Math.random() * 可能值得总数 + 第一个可能的值)
    1到10之间 var num - Math.float(Math.random() * 10 + 1)

复制变量值

如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到新变量分配空间中。不同的是,这个值得副本是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上引用同一个对象,因此,改变其中一个变量,就会影响另一个变量。
例:

  1. var num1 = 5; var num2 = num1;
    num1中保存的值为5,Num1的值来初始化num2时,num2中也保存了值5,但num2中的5与num1中的5是完全独立的,该值只是num1中5的一个副本。此后两个变量可以参与任何操作而不会相互影响。
  2. var obj = new Object();var obj2 = obj1;obj1.name = “ABC”;alert(obj2.name);//“ABC”
    obj1保存一个对象的新实例,这个值被复制到obj2,obj1,obj2都指同一个对象。obj1添加name属性,obj2也可以访问这个属性。

此文来源于《JavaScript高级程序设计》的总结摘取

发布了17 篇原创文章 · 获赞 0 · 访问量 769

猜你喜欢

转载自blog.csdn.net/CandiceYu/article/details/89888802