5、数据类型

前言:
5种原始型基本数据类型,也叫值类型:Undefined、Null、Boolean、Number和String。
复合型/引用型数据类型:Object,对象是属性和方法的集合,其本质是一组无序的名值对组成的。还有些如Array()、function()类型,
【记一下】
值类型:数值、布尔值、null、undefined。 引用类型:对象、数组、函数。
【区别】
基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
引用数据类型:引用类型的存储需要内存的栈区和堆区共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,也可以说是该对象在堆内存的地址。

基本数据类型内存存储方式

var name = 'jozo';
var city = 'guangzhou';
var age = 22;

 

引用数据类型存储方式

var person1 = {name:'jozo'};
var person2 = {name:'xiaom'};
var person3 = {name:'xiaoq'};

 

包装类
为了便于操作基本类型值,ECMAScript 为3个常用的基本数据类型boolean,number,string提供了包装类,每个类对用的都有自己的构造方法。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而能够调用一些(构造方法提供)方法来操作这些数据。
number类型包装类是Number
string类型包装类是String
boolean类型包装类是Boolean

var str1="hello!";
var s=str1.substring(2);
alert(s);
/*第一行,我按照平常的习惯,为str1赋予了一个字符串值。
 第二行,我却拿基本类型的变量来访问一个方法。
【解释】访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值,而在读取模式中访问字符串时,后台会:
1、创建string类型的一个实例:var str1=new string('hello!');
2、在实例上调用指定的方法:var s=str1.substring(2);
3、销毁这个实例:str1=null;
 记住销毁的只是实例,而不是之前的基本类型值。所以每次调用方法时,都会这样一番。*/

 

字面量Vs创建new对象赋值
直接量也称为字面量,是Js中一种对象的表示(或者说创建)方式,它可以通过直接给变量赋上Js中原生对象值的方式从而转换为一个相应的对象。
而通过new来创建对象,再赋值。则是中规中矩的方式,但是用于频繁使用的基本数据类型来说,就过于麻烦了
从这个定义中可以看出,这种定义方式实际上是声明一种类型的变量,并同时进行了赋值。因此,声明后的对象直接量可以在代码中直接使用,而不必使用new关键字来创建对象。

var str1="hello!";
var str2=new String('hell');
console.log(typeof str1);//string
console.log(typeof str2);//object
/*String 是构造函数,string是变量的一个类型。以上两种使用起来是一样的
还有要注意的是,使用new调用基本包装类型的构造函数,new创建的全是对象,所以typeof全是object。so与直接赋值是不一样的就是数据类型不一样*/

 

string
格式
字符串类型是最熟悉不过的啦,至于用单引号,还是双引号,在js中还是没有差别的。

var firstName='zakas';

 String包装类的对象方法

length计算字符串的长度
str.length

indexOf()索引 定位字符串中某一指定的字符首次出现的位置
var str="Hello";
console.log(str.indexOf("e"));//e第一次出现的位置
[Web浏览器] "1"

match() 查找字符串中特定的字符,若找到的话,会返回次字符。
var str="Hello world!"
console.log(str.match("Hello"));
console.log(str.match("hello"));
[Web浏览器] "Hello"
[Web浏览器] "null"

replace() 方法在字符串中用某些字符替换另一些字符
var str="Hello world!"
var NewStr=str.replace(/world/,"girl")
console.log(NewStr);
[Web浏览器] "Hello girl!"

更多的方法请参考手册
http://www.w3school.com.cn/jsref/jsref_obj_string.asp

 

 

number
该类型的表示方法有两种形式,第一种是整数,第二种为浮点数。
[正数]整数 可以通过十进制,八进制,十六进制的字面值来表示。
[浮点数]即小数,如果小数点后只有零,则该小数会被转化为整数。浮点数所占据的内存空间是整数的两倍。

var num=123;
var num=1.23;

Number对象方法

/*toString把数字转换为字符串*/
 var num=123;
 var NewNum=num.toString();
 console.log(typeof num);// "number"
 console.log(typeof NewNum);//"string"
/*其它方法请参考手册 http://www.w3school.com.cn/jsref/jsref_obj_number.asp*/

 

 

 

boolean
即布尔类型,该类型有两个值:true false;

var x=true;

Boolean对象方法
创建对象:

var x=new Boolean();
/*若不写参数,或为 0、-0、null、""、false、undefined 或 NaN,则该对象设置为 false。否则设置为 true(即使 value 参数是字符串 "false")。*/

方法

//toString将布尔值转换成字符串
var test= true;
console.log(test+"类型为:"+typeof test)//"true类型为:boolean"
console.log(test.toString()+"类型为:"+typeof test.toString())//"true类型为:string"

 

 

undefeined
有两种情况会undefined,
在使用var声明变量,但未对其加以初始化时,这个变量的类型就是undefined,且其默认初始化值为undefined。
对未声明与初始化的变量,直接使用,那么这个变量的类型也是undefined,但是没有默认初始化值。

var message;
console.log('已声明,但未初始化的变量message的类型是:' +typeof message)
console.log('未声明,也未初始化的变量age的类型是:'+ typeof age)
/*[Web浏览器] "已声明,但未初始化的变量message的类型是:undefined"
[Web浏览器] "未声明,也未初始化的变量age的类型是:undefined"*/

两种情况的区别
因为js的变量都是用关键字var来声明的,变量的具体类型取决于他被赋予的变量值,而对于以上两种情况,虽然本质上有区别,但是都没有被初始化,所以其类型都是undefined。但是后者没有初始化值。所以当

var message;
console.log(message)
console.log(age)
/*[Web浏览器] "undefined"
[Web浏览器] "Uncaught ReferenceError: age is not defined"*/

 

 

null
js的5中原始数据类型里边的, 另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。(比如:Number的字面量就可以是1-9之间任意数字)
null用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。
null就是啥都没有,譬如,而空格、空字符串、0等都是有实际值的对象,与null当然有质的区别了。

console.log(typeof null) //打印object
/*  从逻辑角度来看,null值表示一个空对象指针.
    而这正是使用typeof操作符检测null值时会返回“object”的原因。
    《JavaScript高级程序设计(第2版)》P22如是说
    在ECMA6中, 曾经有提案为历史平反, 将type null的值纠正为null, 但最后提案被拒了. 理由是历史遗留代码太多, 不想得罪人, 不如继续将错就错当和事老
*/

 

 

NaN【不属于5种基本数据类型,不常用】
概念
是非数字类型,即Not a Number 的简写。隶属number类型的值。
注意它可不是js的5中原始数据类型里边的。
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。

console.log(typeof NaN)//会打印number

什么情况下会返回NaN?
参考:http://www.w3school.com.cn/jsref/jsref_nan_number.asp
执行该代码,本应该返回数字的,结果却没有,那么就会返回NaN,比如下边

//运算函数,无法做算术运算时,或结果不是数字,就返回NaN
console.log(0/0);
console.log(Math.round())//四舍五入失败时,会返回NaN
console.log(Math.sqrt("Q"))//求平方根失败时,会返回NaN
//不能强制转换时,或结果不是数字,就返回NaN
console.log(Number("Q"))//强转数字失败时,会返回NaN
//在不能解析指定的字符串时,或结果不是数字,就返回NaN
console.log(parseInt("Q")) //解析字符串,并返回一整数失败时,会返回NaN
console.log(parseFloat("k")) //解析字符串,并返回一浮点数失败时,会返回NaN

对于一些常规情况下返回有效数字的函数,也可以采用这种方法,用 Number.NaN 说明它的错误情况,此属性只有一个值:NaN。

//判断月份是否为常规有效数字
var Month=30;
if (Month < 1 || Month > 12){
Month = Number.NaN;//Number.NaN值为NaN
}
console.log(Month) //打印NaN

Number对象的属性NaN--**Pk**--全局对象的属性 NaN
参考:http://www.w3school.com.cn/jsref/jsref_nan.asp

在 ECMAScript v1 和其后的版本中,还可以用预定义的全局属性 NaN 代替 Number.NaN。
全局对象的该属性即NaN不怎么常用,其实Number对象的属性NaN也不常用!

总结:
1. 全局对象和Number对象,都有一个属性NaN,此属性只有一个值NaN。但此属性很少有人用
2. 人们用的最多的是,全局函数isNaN(),用来判断某个值是不是非数字。

/*isNaN(x)判断是不是非数,x为空或者非数的时候满足条件。比如isNaN(5/0)就成立。
总之大致一句话总结:只要不是数字,都是trtue
通常用于检测值的结果,判断它们表示的是否是合法的数字。*/
console.log(isNaN(1))//false
console.log(isNaN(2-1))//false
console.log(isNaN(5/0))//false
console.log(isNaN("5"))// false【注】

console.log(isNaN(0/0))//0除以0结果为NaN,true
console.log(isNaN("5-2"))//true
console.log(isNaN("A"))//true
//【注】:为何此处也行,因为因为 "5"==5, js会自动转换!!!所以必须判断类型,就诞生了typeof函数。如下代码
console.log("5"-"3")//结果打印2
console.log("5-3")//结果打印5-3

 

 

最后一个:
复合数据类型(引用数据类型)
Object
1、该类型实例化的对象,是一组数据或函数的集合或都有
2、实例化对象(即创建对象)有两种办法,一种是通过new操作符,一种是通过对象字面量表示法。【js没有class的概念,但是创建对象也得有类的意识,在ES6里已经引入了class关键字类】

//一种是通过对象字面量表示法
var dsh={
   "name":"丁少华",//属性写法1
    age:"30",//属性写法2
    speak:function (){alert("大家好,我叫"+dsh.name+",我"+dsh.age)}
}
dsh.speak()
    
//一种是通过new操作符
function Persion(name,age){
    this.name=name;
    this.age=age;
    this.speak=function(){alert("大家好,我叫"+name+",我"+age)};
}
wx=new Persion("王新",20);//实例化对象
wx.speak()

3、object类型是最基本的复合数据类型,我们可以在其基础上继承出更多的类型。
像我们知道的Array()、Date()、还有有意思的function()类型,都是从object继承的。而且这些类型都在程序员使用前被默认设置了属性和方法,供程序员调用。

4、而以上类型又有一个笼统的称呼为引用类型。为什么是引用类型呢?
就用java的思想去理解吧---好吧,本文的一开始就介绍了,你在向上滑动看看。

 

typeof

ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String
typeof是用来测试数据类型的,会返回上边的5种原始类型和function

 

 

 

本文参考:

http://www.jianshu.com/p/0d3034102220

https://segmentfault.com/a/1190000002789651

http://www.jb51.net/article/63875.htm

 

转载于:https://www.cnblogs.com/dshvv/p/5475913.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值