JavaScript基础-数据类型

js数据类型

ECMAScript变量包含两种不同类型的值:基本类型和引用类型

  • 基本类型:指的就是保存在栈内存中的简单数据段.
  • 引用类型:指的是那些保存在堆内存中的对象,换句话说,就是变量名实际上是一个指针,而这个指针指向的位置,就是保存对象的位置.

两种不同的访问方式:

  • 基本类型:按值访问,操作的是它们实际的值.
  • 引用类型:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后按照指针所指向的地方,找到堆内存里面的值

基本类型

基本数据类型:number,string,boolean,null,undefined基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值.

特点:

  1. 基本类型的值是不可变的
  2. 基本类型的比较是值的比较
  3. 基本类型的变量是放在栈区的

number

NaN的特点

  1. 任何涉及NaN的操作都会返回NaN
  2. NaN与任何值都不相等

ECMAScript定义了isNaN()函数,该函数会帮助我们确定这个参数是否"不是数值".

数值转换

3种方法将非数值的值转换为数值:number(),parseInt和parseFloat().

Number()函数的转换规则如下:

  1. 如果是Boolean值,true和false将分别转换成1和0.
  2. 如果是数字值,只是简单的传入和返回。
  3. 如果是null值,返回0.
  4. 如果是undefined,返回NaN.
  5. 如果是字符串,遵循下列规则

a.如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成11(注意:前导的零被忽略了)

b.如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零); c.如果字符串中包含有效的十六进制格式,例如:“0xf”,则将其转换为相同大小的十进制整数数; d.如果字符串是空的(不包含任何字符),则将其转换为0;e.如果字符串中包含除上述格式之外的字符,则将其转换为NaN.

  1. 如果是对象则调用对象的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

表示缺少值,就是此处应该有一个值,但未定义.

  1. 变量被声明了,但没有赋值时,就等于undefined
  2. 调用函数时,应该提供的参数没有提供,该参数等undefined.
  3. 对象没有赋值的属性,该属性的值为undefined。
    函数没有返回值时,默认返回undefined.

Null(undefined和null之间的区别)

null值表示一个对象空指针.typeof null返回object. null和undfined之间的相等操作符(==)总返回true.

引用类型

javascript中除了上面的基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说是就是对象了.对象是属性和方法的集合.

  1. 引用类型的值是可变的,可为为引用类型添加属性和方法,也可以删除其属性和方法
  2. 引用类型的值是同时保存在栈内存和堆内存中的对象
  3. 引用类型的比较是引用的比较

引用类型和传统的面向对象程序设计中的类相似,但实现不同.

  1. Object是一个基础类型,其他所有类型都是从Object继承基本的行为.
  2. Array类型是一组值的有序列表,同事还提供了操作和转换这些值的功能.
  3. Date类型提供有关日期和时间信息,包括当前日期和时间已经相关的计算功能.
  4. RegExp类型是支持正则表达式的.
  5. 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 -->
}
posted @ 2018-04-18 20:46  知乎所以  阅读(202)  评论(0编辑  收藏  举报