一,数据类型:
基本数据类型:Undefined Null Boolean String Number Symbol(es6新增,后续在说。。)
引用数据类型: Object
typeof 操作符用来检测给定变量的数据类型
1,Undefined:
Undefined 表示未定义,即在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,只有一个值,类型就是Undefined类型;
例如:下面案例只声明了msg,并没有对其进行初始化,返回true,已声明 未经初始化的值 默认就会是undefined;
对于没有声明过得变量,只能执行一步操作,使用typeof操作符检测其数据类型,
2,Null:
Null类型 也是只有一个值得数据类型,这个特殊值是null,表示 ‘定义了但为空’。null表示一个空对象指针,也是使用typeof操作符检测null值时会返回“object”的原因,如下示例:
var msg = null;
console.log(typeof msg);//object
如果定义的变量在将来用于保存对象,可将该变量初始化为null,而不是其他值,这样只要直接检查null值就可知道相应的变量是否已经保存了一个对象的引用,如下示例:
if(msg != null){
//对msg对象执行操作
}
null与undefined不同 null是关键字,所以在任何代码中,都可以放心使用null关键字来获取null值
3,Boolean:
Boolean类型是使用最多的一种类型,有两个值:true和false,表示逻辑意义上的真和假,区分大小写,
要将一个值转换为其对应的Boolean值,可以调用转型函数Boolean();如下示例:
var msg = "hello";
var msgAsBoolean = Boolean(msg)
console.log(msgAsBoolean)// true
上面示例中 字符串 msg 被站转换成了一个Boolean值,该值被保存在 msgAsBoolean变量中,可以对任何数据类型的值调用 Boolean()函数,而且总会返回一个Boolean值;
各种数据类型及其对应的转换规则:
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空的字符串 | 空字符串(' ') |
Number | 任何非0的数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a(不适用) | undefined |
4,Number类型:
(1) Number类型表示我们通常意义上的“数字”.。Number类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值),最基本的数值字面量格式是十进制整数,除十进制表示外,整数还可以通过八进制或者十六进制来表示;
十进制整数可以直接在代码中输入,如 :
var num = 21
八进制的字面值得第一位必须是零(0),然后是八进制数字序列(0 - 7),如果字面值中的数值超出了范围,前导零将被忽略,后面的数值将被当做十进制数值解析;
十六进制字面值得前两位必须是0x,后跟任何十六进制数字(0-9及A-F)字母 A - F可大写 也可小写。
在进行算数计算时,所有以八进制和十六进制表示的数值最终豆浆被转换成十进制数值;
(2)JavaScript中有+0和-0,在加法类运算中它们没有区别,但是出发的场合则需要特别留意区分:忘记检测除以-0,而得到负无穷大的情况经常会导致错误,而区分+0和-0的方式,正是检测1/x是 Infinity 还是 -Infinity;
要想确定一个数值是不是位于最小和最大的数值之间,可以使用isFinite() 函数,这个函数在参数位于最小与最大数值之间时会返回true,如下示例:
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)) //false
(3)根据双精度浮点数的定义:
Number类型中有效的整数范围是-0x1fffffffffffff 至 0x1fffffffffffff,所以Number无法精确表示此范围外的整数;
非整数的Number类型无法用 ==(===)来比较:如
console.log(0.1 + 0.2 == 0.3) 结果为 false
输出结果为false ,说明两端不相等,浮点数的运算精度问题导致等式左右的结果并不是是严格相等,二十差了个微小的值,正确的比较方法是使用JavaScript提供的最小精度值:
console.log(Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON) //true
检查等式两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。
(4)NaN 非数值,任何涉及NaN的操作都会返回NaN,NaN与任何值都不相等,包括NaN本身,如下示例:结果为false
console.log(NaN == NaN) //false
5,String类型:
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。可用引号( " )或者单引号( ' )来表示,如下示例:
var name = "lanlan";
var yname = 'lanlan';
(1)String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,这些字符字面量可以出现在字符串中的任意位置,也将被作为一个字符来解析;
如下表是常用字符字面量:
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\\ | 斜杠 |
(2)字符串是不可变得,字符串一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值得字符串填充该变量,例如:
var name = "Java";
var yname = name + 'Script';
console.log(yname)//JavaScript
(3)String有最大长度2^53 - 1,这个所谓最大长度并不完全是你理解中的字符数,因为String的意义并非字符串,而是字符串的UTF16编码,字符串的操作 charAt,charCodeAt,lenght等方法针对的都是UFT16编码,所以字符串的最大长度实际上是瘦字符串的编码长度影响的;
(4)转换为字符串,要把一个值转换为一个字符串有两种方式,第一种是 toString() 方法,另一个种是String()函数;
toString()方法:返回相应值的字符串表现:例如:
var name = 11;
var yname = name.toString();
console.log(yname)//字符串 ‘11’
var f = true;
var ft = f.toString();
console.log(ft)//true
多数情况调用toString()方法不用传递参数,但在调用数值的toString()方法时,可以传递一个参数,输出数值的基数,默认的情况下,toString()方法以十进制格式返回数值的字符串表示,通过传递基数,toString() 方法可以输出以二进制 八进制 十六进制 乃至其他人以有效进制格式表示的字符串值,例如:
var num = 11;
console.log(num.toString())// '11'
console.log(num.toString(2))// '1011'
console.log(num.toString(8))// '13'
console.log(num.toString(10))// '11'
console.log(num.toString(16))// 'b'
在不知道要转换的值是不是null或者undefined的情况下 可以使用转换型函数String(),能够将任何类型的值转换为字符串,String()函数遵循如下转换规则:
如果有toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是null,则返回 ‘null’ ;
如果值是undefined 则返回 'undefined' ;
如下示例:
var num1 = 11;
var num2 = true;
var num3 = null;
var num4;
console.log(String(num1))// '11'
console.log(String(num2))// 'true'
console.log(String(num3))// 'null'
console.log(String(num4))// 'undefined'
6,Object类型:
Object表示对象的意思,是一组数据和功能的集合,对象可以通过new操作符后跟要穿件的对象类型的名称来创建,如下示例:
var n = new Object();
在 ECMAScript中,Object类型是所有它的实例的基础,即 Object所具有的任何属性和方法也同样存在于更具体的对象中,
Object的每个实例都具有下列属性和方法:
constructor:保存着用于创建单签对象的函数。对于前面的例子而言,构造函数就是Object();
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在,其中,作为参数的属性名(propertyName)必须以字符串形式指定 例如:
a.hasOwnProperty("name")
isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句类枚举,与hasOwnProperty()方法一样作为参数的属性名 必须以字符串形式指定;
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
toString():返回对象的字符串;
valueOf():返回对象的字符串,数值或布尔值,通常与toString()返回值相同;
二,数值转换:
Number()函数,parseInt()函数,parseFloat()函数 可以把非数值转换为数值;
(1) Number()可以用于任何数据类型,转换规则如下:
如果是Boolean值,true和false将分别被转换为1和0;
如果是数字值,只是简单的输入和返回;
如果是null值,返回0;
如果是undefined,返回NaN;
如果是字符串,则遵循如下规则:
如果字符串只包含数字,则将其转换为十进制数值,即“1”会变成 1,"321"会变成321,而"011"会变成11;
如果字符串中包含有效的十六进制格式,例如 "0xf",则将其转换为相同大小的十进制数值;
如果字符串是空的,不包含任何字符,则将其转换为0;
如果字符串中包含除上述格式之外的字符,则将其转换为NaN;
如果是对象 则调用对象的 valueOf()方法,如果转换的结果是 NaN,则调用toString()方法;
如下Number()转换示例:
var num1 = Number('hello');
var num2 = Number('');
var num3 = Number('000011');
var num4 = Number(true);
console.log(num1)// 'NaN'
console.log(num2)// '0'
console.log(num3)// '11'
console.log(num4)// '1'
(2) parseInt()函数转换规则:
parseInt()在转换字符串时,更多的是看其是否符合数值模式,会忽略字符串前面的空格,直至找到第一个非空格字符。
如果第一个字符不是数字字符或者负号,parseInt()会返回NaN。
如果第一个字符是数字字符,parseInt()会继续解析第二个字符,知道解析完所有后续字符或者遇到了一个非数字字符。
示例如下:
var num1 = parseInt('1234hello');
var num2 = parseInt('');
var num3 = parseInt('0xA');
var num4 = parseInt(22.6);
var num5 = parseInt('070');
var num6 = parseInt('70');
console.log(num1)// '1234'
console.log(num2)// 'NaN'
console.log(num3)// '10' 十六进制数
console.log(num4)// '22'
console.log(num5)// '70'
console.log(num6)// '70' 十进制数
parseInt()可以指定基数进行转换 指定基数会影响转换结果。示例如下:
var num1 = parseInt('10','2');
var num2 = parseInt('10','8');
var num3 = parseInt('10','10');
var num4 = parseInt('10','16');
console.log(num1)// '2' 按二进制进行解析
console.log(num2)// '8' 按八进制进行解析
console.log(num3)// '10' 按十进制进行解析
console.log(num4)// '16' 按十六进制进行解析
(3) parseFloat()函数转换规则:
示例如下:
var num1 = parseFloat('11234abck');
var num2 = parseFloat('0xA');
var num3 = parseFloat('22.5');
var num4 = parseFloat('22.34.5');
var num5 = parseFloat('0908.5');
var num6 = parseFloat('3.125e7');
console.log(num1)// '11234'
console.log(num2)// '0'
console.log(num3)// '22.5'
console.log(num4)// '22.34'
console.log(num5)// '908.5'
console.log(num6)// '31250000'