数据类型
1.Undefined
表示变量已声明,但未被初始化。需要注意的是当使用typeof操作符判断数据类型时,未被声明的变量和未初始化的变量返回的值都为undefined
var message;
console.log(typeof message);//undefined
console.log(typeof age);//undefined
2.null:表示一个空对象指针
使用typeof操作符返回的值是'object',需要注意的是,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
console.log(null == undefined);//true
3.布尔值:true或false
ECMAScript中所有类型都有与这两个值等价的值,要将一个值转换为其对应的布尔
值,可以调用转型函数Boolean();
Boolean(NaN);//false
Boolean(0);//false
Boolean('');//false
Boolean(null);//false
Boolean(undefined)//false
4.Number类型
使用IEEE754格式来表示整数和浮点数值。
浮点数值:该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。浮点数值需要内存空间是保存整数值的两倍。最高精度是17为小数,但在进行算术运算时其精度远远不如整数。
各种数值类型:十进制,八进制(在严格模式下无效),十六进制
八进制字面量的第一位必须是0,然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导0将被忽略,后面的数值将被当做十进制数来解析
070//56
079//79
十六进制字面值的前两位必须是0x,后跟十六进制数字(0~9及A~F)。其中字母A~F可大小也可小写
0xA//10
在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换为十进制数值
数值范围:
整数检测
Number.isInteger(42); // ture
Number.isInteger(42.0); // true
Number.isInteger(42.3); // false
特殊数字
NaN
console.log(NaN === NaN)//false
0/0//NaN
isNaN
:接收一个参数,会尝试将这个值转换为数值,返回布尔值。只检查参数是否不是NaN,也不是数字。
console.log(isNaN('10'));//false
console.log(isNaN('bb'));//true
无穷数
如果某次计算中的结果中得到了一个超出javascript数值范围的值,那么这个值将被转换为特殊的Infinity值,该值无法参与下一次的计算,因为Infinity是无法参与计算的数值。如果这个数是正数则被转换为Infinity(正无穷),如果这个数是负数则被转换为-Infinity(负无穷)。
-10/0//-Infinity
10/0//Infinity
var result = Number.MAX_VALUE + Number.MAX_VALUE
result // Infinity
Infinity/Infinity // NaN
零值
对-0进行字符串化会返回'0';但反过来将字符串转化为数字结果是准确的。
// 转字符串
var a = 0 / -3;
a.toString() // '0'
a + '' // '0'
String(a); // '0'
// 转数字
+'-0' // -0
Number(-0); // -0
JSON.parse('-0'); -0
0 === -0 // true
// 区分0和-0
function isNegZero ( n ) {
n = Number(n);
return (n === 0) && (1/n === -Infinity);
}
// ES6加入了Object.is();来判断两个值是否绝对相等
数值转换
有3个函数可以把非数值转换为数值。Number()
:使用于任何数值类型。
-
null
Number(null)//0
-
undefined
Number(undefined)//NaN
-
布尔值
Number(true)//1
Number(false)//0 -
字符串
Number('bb')//NaN,非数值字符
Number('123')//123,数值字符
Number('')//0,空串 对象
如果是对象,则检查该值是否有valueOf()
方法,如果有并且返回基本类型值,则使用该值进行强制类型转化。如果没有,则调用对象的toString()
方法的得到的返回值进行强制类型转换。
parseInt()
/parseFloat()
:用于将字符串转换为数值。
parseInt():
从第一个字符串开始解析,直到解析到非数字字符,可接受两个参数,第二个参数代表不同的进制,默认转换为十进制数。
parseInt('')//NaN,空串
parseInt(22.4)//22
parseInt('12bu')//12
parseInt('10',2)//2
parseInt('10',8)//8
parseFloat():
从第一个字符串开始解析,第一个小数点有效,忽略前导0,只能转换为十进制数值。
parseFloat('')//NaN
parseFloat('090')//90
parseFloat('2.3.4')//2.3
5.String类型
String类型表示由0或多个16位Unicode字符组成的字符序列,即字符串。ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串(此过程是在后台发生的),然后再用另一个包含新值的字符串填充该变量
字符字面量/转义序列
\n
换行\t
制表\r
回车\b
空格\f
换页符\\
斜杠\'
单引号\"
双引号\xnn
\unnn
字符串转换:toString()
:只有null和undefined没有这个方法。
每个字符串也都有一个toString()方法,该方法返回字符串的一个副本。多数情况下,调用toString()方法不必传递参数,但是,在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。这个方法唯一要做的就是返回相应值的字符串表示。
var num = 10;
console.log(num.toString());//"10"
console.log(num.toString(2));//"1010"
String()
:适用于所有类型,遵循以下规则
如果值有toString()方法,则调用该方法(没有参数)并返回相应结果
如果值是null,则返回"null"
如果值是undefined,则返回"undefined"
JSON.stringfy()
6.Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。
ECMAScript中Object是所有对象的基础。
理解:Object类型是所有它的实例的基础,换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
-属性描述符
-属性定义
-存在性
-枚举
-遍历
Object的实例都具有以下属性和方法
1.Constructor
:保存着用于创建当前对象的函数
2.hasOwnProperty
(propertyName):用于检查给定的属性在当前对象实例中(而不是原型中)是否存在。其中作为参数的属性名必须以字符串指定
3.isPrototypeOf(object)
:用于检查传入的对象是否是另一个对象的原型
4.toLocalString()
:返回对象的字符串表示,该字符串与执行环境相对应
5.toString()
:返回对象的字符串表示
6.valueOf()
:返回对象的字符串、数字或布尔值表示。通常与toString()方法的返回值相同
操作符
一元操作符
只能操作一个值的操作符叫一元操作符。
一元操作符是ECMAScript中最简单的操作符。
1.递增和递减操作符
递增递减操作符直接借鉴C,而且各有两个版本:前置型和后置型。顾明思义,前置型应该让位于要操作的变量之前,而后置型应该位于要操作的变量之后。
前置型
var num1 = 1;
var num2 = 2;
var num3 = ++num1 + num2;//4
后置型
var num1 = 1;
var num2 = 2;
var num3 = num1++ + num2;//3
上述两段代码得出了不同的结果,原因就在与,后置递增递减与前置递增递减有一个非常重要的区别,即后置递增递减操作是先返回变量的当前值,再将变量的值加1
。
2.一元加和减操作符
一元加和减操作符主要用于基本的算术运算,也可以用于转换数据类型
布尔操作符
布尔操作符一共有三个:非(NOT)、与(AND)、或(OR)。
1.逻辑非
逻辑非操作符由一个叹号表示(
!
),可以应用于ECMAScript中的任何值。无论这个值是什么数据类型,这个操作符都会返回
一个布尔值。同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为
2.逻辑与
逻辑与操作符由两个和号(&&)表示,有两个操作数且可运用于任何类型的操作数。逻辑与属于短路操作,即如果第一个操作数求值结果是false,那么就不会对第二个操作数求值。
当两个值都为真值时,结果为true。当两个值为一真一假时,结果为false。当两个值都为假值时,返回false。
其中一个值不是布尔值时:遵循下列规则
第一个操作数为假,返回第一个
第一个操作数为真的时候,返回第二个。
如果第一个操作数是对象,则返回第二个操作数
var a = {b:1};
a && 'ss'//"ss"如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
'ss' && a//Object {b: 1}-
如果两个操作数都是对象,则返回第二操作数
var c = {d:2};
c && a//Object {b: 1} 如果有一个操作数是null,则返回null
如果有一个操作数是NaN,则返回NaN
如果有一个操作数是undefined,则返回undefinded
3.逻辑或
与逻辑与操作符相似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
第一个操作数为真,返回第一个 第一个操作数为假,返回第二个
乘性操作符
ECMAScript定义了3个乘性操作符:乘法、除法和模
Infinity*0//NaN
0/0//NaN
Infinity/Infinity//NaN
加性操作符
1.加法(转字符串)
两个操作符都是数值
执行常规的加法计算。
Infinity + -Infinity//NaN
如果有一个操作数是字符串
如果两个操作符都是字符串,则将第二个操作符与第一个操作符拼接起来
如果只有一个操作符是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
如果这个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于null和undefined,则分别调用String()函数并取得字符串"undefined"和"null"。
2 + '' //"2"
2.减法(转数值)
如果两个操作数都是数值
执行常规的算术减发操作并返回结果,如果有一个操作数是NaN,则结果是NaN
Infinity - Infinity//NaN
如果有一个操作数不是数值
如果有一个操作数是字符串、布尔值、null或undefined,则先在后台调用Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转化的结果是NaN,则减法的结果就是NaN。
-
如果有一个操作数是对象,则调用对象的valueOf()方法以取得表示该对象的数值。如果得到的值是NaN,则减法的结果是NaN。如果对象没有valueOf()方法则调用其toString()方法并将得到的字符串转换为数值。
5 - true//4
关系操作符
如果两个操作数都是数值,则执行数值比较
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
-
如果一个操作数是数值,则将另一个操作数
转换为数值
,然后执行数值比较var result = '23' < '3'//true
var result = '23' < 3//false
相等操作符
1.相等和不相等
先转换再比较
如果有一个操作数是布尔值,则在比较相等性之前,先将其
转换为数值
如果有一个操作数是字符串,另一个操作数是数值,先将其
转换为数值
如果有一个操作数是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值按前面的基本规则进行比较
null和undefined是相等的
要比较相等性之前
不能将null和undefined转换
为任何其他值如果两个操作数都是NaN,相等操作符也返回false,按规则,NaN不等于NaN
2.全等和不全等
仅比较而不转换
"55" !== 55 //true
条件操作符
variable = boolean_expression ? true_value : false_value
本质上,这段代码的含义就是基于对boolean_expression求值的结果,决定给变量variable赋什么值。如果求值结果为true,则给变量赋true_value;如果求值结果为false,则给变量variable赋false_value值。
赋值操作符
简单的赋值操作符由等号表示,其作用就是把右侧的值赋给左侧的变量。
逗号操作符
逗号操作符多用于声明多个变量;但除此之外,逗号操作符还用来赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项。
var num = (5,2,0); num//0;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。