js数据类型
ECMAScript变量包含两种不同类型的值:基本类型和引用类型
- 基本类型:指的就是保存在栈内存中的简单数据段.
- 引用类型:指的是那些保存在堆内存中的对象,换句话说,就是变量名实际上是一个指针,而这个指针指向的位置,就是保存对象的位置.
两种不同的访问方式:
- 基本类型:按值访问,操作的是它们实际的值.
- 引用类型:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后按照指针所指向的地方,找到堆内存里面的值
基本类型
基本数据类型:number,string,boolean,null,undefined基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值.
特点:
- 基本类型的值是不可变的
- 基本类型的比较是值的比较
- 基本类型的变量是放在栈区的
number
NaN的特点
- 任何涉及NaN的操作都会返回NaN
- NaN与任何值都不相等
ECMAScript定义了isNaN()函数,该函数会帮助我们确定这个参数是否"不是数值".
数值转换
3种方法将非数值的值转换为数值:number(),parseInt和parseFloat().
Number()函数的转换规则如下:
- 如果是Boolean值,true和false将分别转换成1和0.
- 如果是数字值,只是简单的传入和返回。
- 如果是null值,返回0.
- 如果是undefined,返回NaN.
- 如果是字符串,遵循下列规则
a.如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成11(注意:前导的零被忽略了)
b.如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零); c.如果字符串中包含有效的十六进制格式,例如:“0xf”,则将其转换为相同大小的十进制整数数; d.如果字符串是空的(不包含任何字符),则将其转换为0;e.如果字符串中包含除上述格式之外的字符,则将其转换为NaN.
- 如果是对象则调用对象的valueOf()方法,然后依照前面的规则转换返回的值.如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值.
parseInt (cString)从字符串cString非空字符开始转换得到的整数,遇到小数点或其他0-9外的字符就停止,如“-1234a”,“-1234.0”都将返回 -1234;如果除第一个符号外一个0-9字符都不是,将返回NaN,如“-a”、“abc”等
parseFloat支持第一个非空字符为小数点,如parseFloat(".123" )返回0.123。空字符串或完全空格串健壮的parseFloat()返回NaN,而Number()返回0,这有点让人费解。除了不支持无前导0小数(如.123、-.123)和支持多余的前导0(如-00123返回-123)多少不符合常规外,Number能用来验证数字串!
string
字符串可以存储一系列字符,如 "John Doe".
字符串可以是插入到引号中的任何字符.你可以使用单引号或双引号.
字符串的常用方法
方法 | 描述 |
---|---|
chartAt() | 返回指定索引位置的字符 |
charCodeAt | 返回指定索引位置Unicode值 |
contact | 连接两个或多个字符串,返回连接后的字符串 |
IndexOf | 返回字符串中检索指定字符第一次出现的位置 |
lastIndexOf | 返回字符串中检索指定字符串最后一次出现的位置 |
match | 找到一个或多个正则表达式匹配 |
repalce | 替换与正则表达式匹配的子串 |
search | 检索与正则表达式匹配的值 |
slice | 提取字符串的片段,并在新的字符串返回提取的部分 |
split | 把字符串分割为字符串数组 |
substr | 从起始索引号提取字符串中指定的字符 |
substring | 提取字符串两个指定的索引号之间的字符 |
toLowerCase | 把字符串转为小写 |
toUpperCase | 把字符串转为小写 |
trim | 移除字符首尾空白 |
toString | 返回字符串首尾空白 |
valueOf | 返回某个字符串对象的原始值 |
boolean
boolean类型是javascript中使用最多的一种类型.2个值:true和false.与数字值不是一回事,true不一定等于1,false不一定等于0. 所有类型的值都有这两个Boolean值等价的关系的值。可以调用转化函数 Boolean().如下所示:
各类数据及对应的转换规则
数据类型 | 转换为true的值 | 转为false的值 |
---|---|---|
boolean | true | false |
string | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
object | 任何对象 | null |
undefined | n/a | undefined |
undefined
表示缺少值,就是此处应该有一个值,但未定义.
- 变量被声明了,但没有赋值时,就等于undefined
- 调用函数时,应该提供的参数没有提供,该参数等undefined.
- 对象没有赋值的属性,该属性的值为undefined。
函数没有返回值时,默认返回undefined.
Null(undefined和null之间的区别)
null值表示一个对象空指针.typeof null返回object. null和undfined之间的相等操作符(==)总返回true.
引用类型
javascript中除了上面的基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说是就是对象了.对象是属性和方法的集合.
- 引用类型的值是可变的,可为为引用类型添加属性和方法,也可以删除其属性和方法
- 引用类型的值是同时保存在栈内存和堆内存中的对象
- 引用类型的比较是引用的比较
引用类型和传统的面向对象程序设计中的类相似,但实现不同.
- Object是一个基础类型,其他所有类型都是从Object继承基本的行为.
- Array类型是一组值的有序列表,同事还提供了操作和转换这些值的功能.
- Date类型提供有关日期和时间信息,包括当前日期和时间已经相关的计算功能.
- RegExp类型是支持正则表达式的.
- function,函数实际上是Function类型的实例,因此函数也是对象,函数也拥有方法,可以来增强其行为.
Object
两种创建方式
//new操作后面跟Object构造函数
var person=new Object();//var person={}等价
person.name="Nicholas";
person.name=29;
//对象表面量表示法
var person={
name:"Nicholas",
age:"29"
}
Array类型
两种创建方式
使用Array构造函数
//创建length为20的数组
var color=new Array(20)//var color=Array()等价
//穿建包含3个字符串值得数组
var color=new Array("red","blue","green");
使用数组字面量表示法
var color=["red","blue","green"];
color[0]="red";
var name=[];
数组的常用方法
- push:向数组的末尾增加一项,返回数组的新长度
- unshift:向数组开头增加一项,返回数组的新长度
- pop:删除数组的末尾项,返回值是数组的删除的数组项
- shift:删除数组开头项,返回被删除的开头项目
- splice:删除数组的任意项,返回值是被删除的数组项
- slice:复制数组,返回值是复制到的新数组
- contact:把一个数组和另一个数组拼接在一起,回拼接好的数组
- join:把数组的每一项按照指定的分隔符拼成字符串
- reverse:倒叙数组,返回值倒叙数组原有数组改变
- sort:跟据匿名函数进行冒泡排序
- indexOf:返回获取项在数组的索引
- lastIndexOf:返回获取项在数组中出现的最后一次索引
- ForEach:循环遍历数组,参数是一个匿名函数,默认返回undefined
- map:循环遍历数组,参数是一个匿名函数
var c=ary.push(1);//在数组的末尾增加一项
var d=ary.unshift(3);//在数组的开头增加一项
var e=ary.pop();//在数组的末尾删除一项
var f=ary.shift();//在数组的开头删除一项
var g=ary.slice(2,5);//复制数组
var h=ary.concat(ary1,ary2).concat(1,2,2,2,2,[456654]); //如果没有参数 或者参数为()空则为赋值数组
var i=ary.join('+');//将数组中的每一项用指定的分隔符拼接成一个新的字符串
var j=ary.reverse();//倒序排序 原有数组改变
var k=ary1.sort(function(a,b){return b-a;});
var l=ary2.indexOf(4);//返回获取项在数组中出现的索引
var m=ary2.lastIndexOf(4);//返回获取项在数组中出现的最后一次索引
var n=ary2.indexOf(9);//若获取项不存在则返回-1
var o=ary.forEach(function(a,b){console.log(a,b)});
var p=ary2.map(function(){});
console.log(a);//[3,4,5]
ary=[1,2,5,6,7,8,9,0]
console.log(b);//[5]
ary=[1,2,6,7,8,9,0]
console.log(c);//8
ary=[1,2,6,7,8,9,0,1]
console.log(d);//9
ary=[3,1,2,6,7,8,9,0,1]
console.log(e);//1
ary=[3,1,2,6,7,8,9,0]
console.log(f);//3
ary=[1,2,5,6,7,8,9,0]
console.log(g);//[6,7,8]
console.log(h);//ary=[3,1,2,5,6,7,8,9,0]
console.log(i);//1+2+6+7+8+9+0
console.log(j);//[0,9,8,7,6,2,1]
ary=[0,9,8,7,6,2,1]
console.log(k);//[7,5,4,1]
console.log(l);//2
console.log(m);//6
console.log(n);//-1
// console.log(a,xb);
console.log(o);//undefined
console.log(ary);//[0,9,8,7,6,2,1]
console.log(ary1);//[7,5,4,1]
Date()函数
- 创建Date()对象的语法
- var myDate=new Date()
new Date("month dd,yyyy hh:mm:ss");
new Date("month dd,yyyy");
new Date(yyyy,mth,dd,hh,mm,ss);
new Date(yyyy,mth,dd);
new Date(ms);
参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。各种函数的含义如下:
month:用英文表示月份名称,从January到December
mth:用整数表示月份,从0-11(1月到12月)
dd:表示一个月中的第几天,从1到31
yyyy:四位数表示的年份
hh:小时数,从0(午夜)到23(晚11点)
mm:分钟数,从0到59的整数
ss:秒数,从0到59的整数
ms:毫秒数,为大于等于0的整数
如:
new Date("January 12,2006 22:19:35")
new Date("January 12,2006")
new Date(2006,0,12,22,19,35)
new Date(2006,0,12)
new Date(1137075575000)
Function类型
在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他而且都与其他引用类型一样具有属性和方法.由于函 数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定.函数通常是使用函 数声明语法定义的,如下面的例子所示.
function sum (num1, num2) {
return num1 + num2;
}
这与下面使用函数表达式定义函数的方式几乎相差无几。
var sum = function(num1, num2){
return num1 + num2;
};
Js中同名函数的覆盖
在Js中函数是没有重载,定义相同函数名、不同参数签名的函数,后面的函数会覆盖前面的函数.调用时,只会调用后面的函数.
var n1 = 1;
function add(value1) {
return n1 + 1;
}
alert(add(n1));//调用的是下面的函数,输出:3
function add(value1, value2) {
return value1 + 2;
}
alert(add(n1));//输出:3
函数申明和函数表达式
- 解析器会率先读取函数申明
- 函数声明必须有标符,也就是常说的函数名。函数表达式可以省略函数名 函数声明(要带标识符)
function functionName(arg1, arg2, ...){
<!-- function body -->
}
函数表达式
省略标识符:
var variable=function(arg1, arg2, ...){
<!-- function body -->
}
带有标识符:
var variable=function functionName(arg1, arg2, ...){
<!-- function body -->
}