高程三说变量分为

5种简单数据类型;Undefined、Null、Boolean、String、Number;

1中复杂数据类:Object

但是在网上搜集到的;JavaScript数据类型应该是6种

 

5种基本数据类型:Null、Undefined、Boolean、String、Number

2种引用数据类型:Object、Function;

console.log(typeof zhu);//undefined
console.log(typeof null);//object
console.log(typeof false);//boolean
console.log(typeof 2);//number
console.log(typeof(2));//number typeof是操作符,所以加不加括号都可以执行的
console.log(typeof "2");//string
console.log(typeof function(){});//function
console.log(typeof {a:2,b:"2"});//object

从逻辑上讲,null值是一个空对象指针,而这也正是使用typeof操作符检测null返回object的原因;

数据类型概述

1、null类型(只有一个值):

无论什么情况下都没有必要吧一个变量的值显示地设置为undefined;但是只要意在保存对象的变量还没有有真正保存对象,就应该明确地让该变量保存null值;

这样做不仅可以可以先null作为空对象指针的管理;而且也有助于进一步区分null和undefined;

备注:个人用的时候;除了定时器这类的开始是设置为null;其他一般是设置为 var a=[],或者var b={}这种类型的;

null的实际用处

如果定义的变量,开始定位null;然后操作一些后;可以用下面这种判断

if(car !=null){
//car对象执行某些操作;
}

undefined派生自null;所以他们俩做比较的时候是相等的;

console.log(null==undefined);//true;
console.log(Number(null));//0
console.log(Number(undefined));//NaN;

但是他们除了相互相等以外;和别的任何值都是不相等的;

2、undefined(只有一个值);没有声明过的,或者声明但是没有定义的对象都是undefined;

区别如下:

只声明未定义的;可以用alert、console.log /dir来操作;也可以用typeof来操作;

未声明也没有定义的,alert操作的时候报错;但是用typeof操作是undefined;

    var b;
console.log(b);
console.dir(b);
console.log(a);
// undefined
// text.html:15 undefined
// text.html:16 Uncaught ReferenceError: a is not defined

3、Boolean类似:有两个数值的true和false;

是ECMAScript中使用的最多的一种类型,该类型只有两个字面量只:true和false;

(true和false也是区分大小写的;True和False以及其他的混合大小写形式都不是Boolean类型 ;只是标识符;)

false值有:unll、undefined、0、-0、NAN、””空字符串、flase本身(一共7种)

true:除了上面以外的,都是true;

4、Number类型;

number是最令人关注的数据类型的,但是个人感觉JS这点弄的的不好;JS的数字类型采用了IEEE754格式来表示整数和浮点数;

IEEE格式是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式、定义了-0、定义了NaN、定义了正无穷Infinity和负无穷-Infinity;

IEEE格式可以保存正零(+0)和负零(-0);正零和负零被认为是相等的;

最基本的数值字面量格式是十进制整数;

整数还可以通过八进制(以8位基数)或十六进制(以十六位基数)的字面量来表示;

八进制:第一次必须是零(0)、然后是八进制数字顺序(0·7),如果字面值中数值超过了范围,那么前导零会被忽略;后面的数值被当做十六进制来解析;

console.log(070);//56
console.log(078);//78
console.log(08);//8

十六进制:前两位必须是0x;后面跟任何十六进制的数字;(0·9,A·F);其中字符A-F可以大写,也可以小写;

console.log(0xA);//10
console.log(0x1f);//31

 

在进行算术计算的时候,所有八进制和十六进制表示的数值最终都犟被转成十进制数值;;

浮点数

必须包含一个小数点,并且小数点后面必须只有一位数字,这才叫浮点数(就是小数的意思)

由于浮点数需要的内存空间是保存整数值的两倍;所以JavaScript能把小数转为整数,就直接转成整数了;

如果浮点数本身表示的就是一个整数,比如1.0;那么该值也会被转换为整数;

对于那些极大或者极小的数值,可以用e表示法;也就是科学计数法;表示的数值等于e前面的数值乘以以10位指数次幂;

console.log(3.125e7);//31250000

关于浮点数计算会产生舍入误差的问题;这是基于IEEE574格式数值的通病;所以永远不要测试某个特定的浮点数值;

if(a+b==0.3){//永远不要这样做
//要执行的代码;
}

2、NaN:

1、不是一个有效数字类型,但是属于数字类型;表示一个本来要返回数值的操作数,在没有返回数值的情况下,用NaN表示;(这样就不会报错了)

2、NaN与任何数进行运算,都会返回NaN;

3、NaN与任何数都不相等,包括NaN自身;

4、有一个isNaN的函数方法来检测是否属于NaN类似的;如果是有效数字类型,返回false;如果不是有效数字类型的,返回true;

5、虽然有点不可思议;但是isNaN()确实适用于对象;在基于对象调用isNaN()韩硕是;先调用对象的valurof()方法;然后确定该方法是否可以转换为数值;如果不能则基于这个返回值再调用toString()方法;再测试返回值;这个过程也是ECMAScript中内置函数和操作符的一般执行流程

console.log(isNaN(null));//false
console.log(isNaN([]));//false

3、数值范围,Infinity;

console.log(Number.MIN_VALUE);//5e-324
console.log(Number.MAX_VALUE);//1.7976931348623157e+308
//下面是高程三的错误点;
//Number.MAX_VALUE 并不是js中最大的值;
//Number.MIN_VALUE 也不是最小的值;
console.log(isFinite(Number.MAX_VALUE+1));//true
console.log(isFinite(Number.MIN_VALUE-1));//true
//如果想要确定一个值是不是位于最小值和最大值之间,可以用isFinite()函数来判断;

任何数除以0.返回都是Infinity();

var  b=5/0;//任何数除以0;都会返回Infinity;【高程三29也说返回的是NaN;是错误的】
console.log(b);//Infinity
console.log(b+2);//Infinity
console.log(NaN+2);//NaN

4、数值转换;

Number、parseInt、parseFloat;

Number,就是数据类型转换时候用的;

如果是null值;返回的是0;

如果是undefined,返回的是NaN; 这个是null和undefined区别;

如果是对象,则调用对象的valueOf()方法;然后依照前面的规则转换返回的值;如果转换的结果是NaN,则调用对象的toString()方法;然后再次依照前面的规则转换返回的字符串;

由于Number()函数在转换字符串时比较哦复杂,而且不够合理;所以大多数用parseInt()转换字符串;

区别:

 //NumberparseInt转换空字符串的时候不一样的;
console.log(Number(""));//0
console.log(parseInt(""));//NaN
console.log(parseFloat(""));//NaN

parseInt解析十进制、八进制、十六进制;

但是在parseInt解析八进制的时候,ECMAScript3和5有分歧;

为了避免分歧,可以为这个函数提供第二个参数;参数使用的基数(即多少进制)

console.log(parseInt("0xAF",16));//175
console.log(parseInt("AF",16));//175
console.log(parseInt("AF"));//NaN
console.log(parseInt("0xAF"));//175
console.log(parseInt("0xAF"),8);//175 8

parseInt和parseFloat区别

1、parseInt只能转整数;parseFloat可以转小数,如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零)那么parseInt()会返回整数;

2、parseInt可以转十进制、八进制、十六进制;而parseFloat只能转十进制;

String类型

意义:String类型用于表示由另个或多个16位Unicode字符组成的字符序列;即字符串;

格式:字符串可以有单引号(‘’)和双引号(“”)表示;这两种表示的字符串完全相同;不过这个需要一对使用;单引号开始必须以单引号结束;双引号也一样的;

(在PHP中双引号和单引号会影响对字符串的解释方式不同;但ECMAScript对这两种语法形式没有区别)

1、字符串特点

ECMAScript中字符串是不可以改变的;属于基本数据类型;字符串一单创建,值就不能改变;

如果改变某个变量保存的字符串;首先要销毁原来的字符串,然后用另一个包含新值的字符串填充该变量;

2、转换为字符串:一共两种方法;

1)、toString():布尔、数值、字符串、对象(没错、每个字符串都有一个toString()方法,该方法返回字符串的副本)都有一个toString()方法;但是null和undefined没有这个方法;(function有没有呢?)

    var a=function(){
alert("aaa")
};
function c(){
alert("ccc")
}
var b=11;
b.toString();
console.log(a.toString());//function也有这个方法;
console.log(c.toString());//function也有这个方法;
//输出的是下面的
/* text.html:21 function (){
alert("aaa")
}
text.html:22 function c(){
alert("ccc")
}*/
console.log(b.toString());//11

多数情况下toString是不需要传递参数的,但是可以传递一个参数来控制输出的基数;默认是以十进制格式返回数值的字符串表示;而通过传递基数;可以输出二进制,八进制,十六进制;

var num=10;
console.log(num.toString());//10
console.log(num.toString(2));//1010
console.log(num.toString(8));//12
console.log(num.toString(10));//10
console.log(num.toString(16));//a

注意:默认没有传递参数的时候,和基数10时候输出值相同;

2)、String():在不知道转换的只是不是null或者undefined的时候,用String()这个函数能将任何类型的值转为字符串;

String()函数遵循下列转换规则

  • 1、如果只有toString方法,则调用方法(没有参数)并返回相应的结果;
  • 2、如值是null;则返回“null”;
  • 3、如果只是undefined,则返回”undefined”
  • 因为null和undefined没有toString方法;所以String函数就返回这两个值的字面量;

要把某个值转为字符串,可以用+号操作符;把它与一个空字符串(””)相加即可;

3、字符串字面量;

意义:String数据类型包含了一些特殊的字符字面量;也叫转移序列;用于表示非打印字符的;或者具有其他用途的字符;

/*
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸??这个是什么鬼?
\\ 斜杠
\' 单引号(')。转义用
\" 同上
\xnn 以十六进制代码nn表示一个字符(其中n0~F;例如\41表示"A"
\unnnn
* */
var a="a\nc";
console.log(a);
console.log(a.length);//3
//任何字符串的长度都可以通过访问其length来获取;
var b="优衣,a-,/";
console.log(b.length);//8
//length是字符说,并不是字节数;
//高程三上说:如果字符串包含双字节自,那么length属性可能不会精确第返回字符串中的字符数目;但是我测试了下,发现可以正常用的;

Object类型:

JavaScript对象就是一组数据和功能的集合;(无序的集合,数组是有序的集合)

var o=new Object();//如果不给构造函数传递参数,那么后面的括号是可以省略的;
var a=new Object;//这样是可以的,但是不推荐这么做;

Object类型是所有他的实例的基础;Object类型所有的任何属性和方法同样在于更具体的实例中;

Object的每一个是例都具有下列属性和方法;

var a=new Object();
a.constructor; //保存创建当前对象的函数;构造函数(constructor)相当于Objec()本身;
a.hasOwnProperty(prototyName);//用来检查给定的属性是不是在当前实例中(而不是在实例的原型中;)prototyName必须的字符串的形式;
a.isPrototypeOf(object);//用于检查传入的对象是否是传入对象的原型;
a.propertyIsEnumerable(prototyName);//指定的属性,是否能够用for in语句来枚举;prototyName必须的字符串的形式;
a.toLocaleString();//返回对象的字符串表示;该字符串与执行换的地区对应
a.toString();//返回对象的字符串表示;
a.valueOf();//返回对象的字符串、数值或布尔值表示;通常与toString()方法的返回值相同;

·····················