基本类型、引用类型、基本包装类型和单体内置对象
基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。基本包装类型和单体内置对象都是特殊的引用类型。
一、基本类型
基本类型包含Undefined、Null、Boolean、Number、String 这5种。基本数据类型是按值访问的,因为可以操作保存在变量中的实际值。
基本类型保存在内存中的栈中,大小固定,复制其变量时会创建这个值的一个副本。用typeof方法可以确定一个值是哪种基本类型。
二、引用类型
引用类型包括Object 、Array、 Date、 RegExp、 Function、基本包装类型(Boolean类型、Number类型、String类型)和单体内置对象(Global、Math)。操作对象时,实际上是在操作对象的引用而不是实际的对象。
引用类型的值是对象,保存在堆内存中。引用类型的变量实际上是一个指针,它保存在栈中,指向堆内存中的对象。复制引用类型变量实际是复制该指针,所以他们都指向同一个对象。
(1)Object类型
创建Object实例的两种方式:第一种是使用new操作符后跟Object构造函数,另一种方式是使用对象字面量表示法。
//使用new操作符后跟Object构造函数 var person = new Object(); person.name = "Nicholas"; person.age = 29; //使用对象字面量表示法 var person = { name : "Nicholas", age : 29 };
(2)Array类型
//使用Array构造函数创建(可以省略new操作符) var colors = new Array(); var colors = new Array(20); //创建length值为20的数组 var colors = new Array(“red”, "blue", "green"); //c创建包含三个字符串值得数组 //给构造函数传递一个值时,如果是数值则会按照该数值创建给定项数的数组;如果是其他类型的参数,则会创建包含那个值的只有一项的数组 //使用数组字面量表示法 var colors = ["red", "blue", "green"];
a.检测某个值是不是数组 Array.isArray(value)
b.数组转换方法 toString():返回有数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串,即返回数组的字符串表示
valueOf():返回数组
join():返回有数组中每个值的字符串形式拼接而成的一个以指定分隔符分隔的字符串数组
c.栈方法 push() 、pop()
队列方法 shift() 、unshift()
d.重排序方法 (返回经过排序之后额数组) reverse():反转数组项的顺序
sort():调用每个数组项的toString()方法,然后比较得到的字符串,按照字母顺序进行排序。
e.操作方法 concat():基于当前数组中的所有项创建一个新数组
slice():基于当前数组中的一个或多个项创建一个新数组
splice():向数组的中部删除、插入、替换项(返回改变后的数组)
f.位置方法 indexOf() 、 lastIndexOf() 接受两个参数:要查找的项和(可选)表示查找起点位置的索引。返回要查找的项在数组中的位置。
g.迭代方法 every()、filter()、forEach()、map()、some()
h.归并方法 reduce()、reduceRight()
(3)Date类型
//使用new操作符和Date构造函数创建一个日期对象 var now = new Date();
(4)RegExp类型
//使用字面量形式定义正则表达式 var pattern1 = /[bc]at/i //使用构造函数创建 var pattern2 = new RegExp("[bc]at", "i") //构造函数接受两个参数:要匹配的字符串模式和可选的标志字符串
使用正则表达式字面量和使用RegExp构造函数创建的正则表达式不一样。正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。
RegExp实例方法
exec():接受要应用模式的字符串为参数,返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回null。 返回的数组包含两个额外的属性:index和input。其中,index表示匹配项在字符串中的位置,input表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。
test():接受一个字符串参数。在模式与该参数匹配的情况下返回true,否则返回false 。
(5)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"); //不推荐
函数声明和函数表达式的区别:解析器向执行环境中加载数据时,会率先读取函数声明,并使其在执行代码前可用(可用访问),至于函数表达式必须等到解析器执行到它所在的代码行,才回真正被解释执行。
函数内部属性 arguments 函数arguments对象 callee和caller属性的区别
函数属性和方法 属性:length 和 prototype
方法:js函数中的apply()、call()、bind()方法
三、基本包装类型(是基本类型也是引用类型,所以叫基本包装类型)
为了方便操作基本类型值,ECMAScript 还提供了 3 个特殊的引用类型:Boolean、Number 和String,以便于使用对象方法操作基本类型值(boolean、number、string)。
基本包装类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。每当读取一个基本类型值得时候,后台就会创建一个对应的基本包装类型的对象,从而让我们调用一些方法来操作这些数据。例如
var s1="some text"; //基本类型值 string var s2=s1.substring(2); //s1是基本类型值却有方法?
实际上,当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。在第二行访问字符串s1时,后台会完成下列处理:
(1)创建一个String类型的实例 (2)在实例上调用指定方法 (3)销毁这个实例
实际上就相当于执行了下列过程:
var s1=new String("some text"); var s2=s1.substring(2); s1=null;
经过此番处理,基本的字符串值就变成跟对象一样了。上面这三个步骤适用于Boolean、Number、String类型对应的布尔值、数字值和字符串值。
引用类型和基本包装类型的区别
引用类型与基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例在执行流离开当前作用域之前都一直保存在内存中。而基本包装类型自动创建,并在代码执行后自动销毁实例。这意味着我们不能在运行时为基本类型值添加属性和方法。
对基本包装类型的实例调用typeof会返回“object”,而且所有基本包装类型的对象在转换为布尔类型时值都是true。
(1)Boolean类型
Boolean类型是与布尔值对应的引用类型。 重写 valueOf()方法,返回基本类型值true和false;toString() 方法,返回字符串“true”和“false”.
var falseObject = new Boolean(false);
布尔表达式中的多有对象都会被转换为true。
基本类型与引用类型的布尔值有两个区别:1. typeof对基本类型返回“boolean”,对引用类型返回“object”。2. 由于Boolean对象是Boolean类型的实例,所以使用instanceof操作符测试Boolean对象会返回true,而测试基本类型的布尔值则返回false 。(重要!!!)
(2)Number类型
Number类型是与数字值对应的引用类型。重写 valueOf()方法,返回基本类型数值;toString() 方法,返回字符串形式的数值.
var numberObject = new Number(10);
将数值格式化为字符串的方法 toFixed():按照指定的小数点返回数值的字符串表示
toExponential():返回以指数表示法表示的数值的字符串形式
toPrecision():返回固定大小(fixed)格式,也可能返回指数(exponential)格式,具体规则看哪种格式最合适。
在使用typeof操作符测试基本类型数值时,始终会返回“number”,而在测试Number对象时,则会返回“object”。类似的,Number对象是Number类型的实例,而基本类型的数值则不是。
(3)String类型
String类型是字符串的对象包装类型。valueOf()方法、toString() 方法都返回对象所表示的基本字符串值。
var stringObject = new String("hello world");
a. 字符方法 charAt():以单字符字符串的形式返回给定位置的那个字符
charCodeAt():以单字符字符串的形式返回给定位置的那个字符的字符编码 (两个方法都接受字符位置作为参数)
b. 字符串操作方法 concat():将一或多个字符串拼接起来,返回拼接得到的新字符串
slice()、substring():返回被操作字符的一个子字符串。第一个参数指定子字符串的开始位置,第二个指定的是子字符串最后一个字符后面的位置
sbustr():返回被操作字符的一个子字符串。第一个参数指定子字符串的开始位置,第二个参数指定的是返回的字符个数。
如果没有给这些方法传递第二个参数,则将字符串的末尾作为结束位置。concat()、slice()、substring()、sbustr()不会修改字符串本身的值,即对原始字符串没有影响。
c. 字符串位置位置 indexOf() 、lastIndexOf():搜素给定的字符串,返回子字符串的位置(没有找到则返回-1)
d. trim()方法:创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。对原始字符串没有影响。
e. 字符串大小写转换方法 toUpperCase() 、toLowerCase()
f. 字符串的模式匹配方法 match():接受一个参数(正则表达式或者RegExp对象)。返回一个数组,在数组中,第一项是与整个模式匹配的字符串,其他项是与正则表达式中的捕获组匹配的字符串。
search():接受一个参数(正则表达式或者RegExp对象)。返回字符串中第一个匹配项的索引,没有找到则返回-1。始终是从字符串开头向后查找模式。
replace():接受两个参数(第一个参数可以是一个RegExp对象或者是一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或者一个函数)
split():基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中。分隔符可以是字符串,也可以是一个RegExp对象。 split()方法可以接受可选的第二个参数,用于指定数组的大小,以确保返回的数组不会超过既定大小。
localeCompare():按字母表顺序比较两个字符串。 排在字符串参数之后返回1,相等返回0,排在字符串参数之前返回-1.
fromCharCode():接受一或多个字符编码,然后将他们转换成一个字符串。 和charCodeAt()执行相反的操作。
四、单体内置对象(Global和Math)
Global对象
Global(全局)对象:不属于其他对象的属性和方法,最终都是它的属性和方法。在全局作用域中定义的属性和函数, 都是Global对象的属性和方法。例如:isNaN() 、isFinite() 、 parseInt()、parseFloat() 都是Global对象的方法。
(1)URI编码方法
encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()
(2)eval()方法
eval()方法就像一个完整的ECMAScript解析器,它只接受一个参数,即要执行的Javascript字符串。
(3)window对象
在全局作用域中声明的所有变量和函数,都成为了window对象的属性。
var color = "red"; function sayColor(){ alert(window.color); } window.sayColor(); //"red"
另一种取得Global对象的方法时使用以下代码:
var global = function(){ return this; }();
以上代码创建了一个立即调用的函数表达式,返回this的值。在没有给函数明确指定this值得情况下(无论是通过将函数添加为对象的方法,还是通过调用call()或apply()),this值等于Global对象。
Math对象
Math.max()
Math.min()
Math.ceil() 向上取整
Math.floor() 向下取整
Math.round() 四舍五入
Math.random() 返回大于等于0小于1的随机数