Javascript:数据类型与操作符

阿花和猫

数据类型

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为小数,但在进行算术运算时其精度远远不如整数。

clipboard.png

各种数值类型:十进制,八进制(在严格模式下无效),十六进制
八进制字面量的第一位必须是0,然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导0将被忽略,后面的数值将被当做十进制数来解析

070//56
079//79

十六进制字面值的前两位必须是0x,后跟十六进制数字(0~9及A~F)。其中字母A~F可大小也可小写

0xA//10

在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换为十进制数值

数值范围:

clipboard.png

整数检测

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

clipboard.png

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;   
阅读 2.3k

专栏只有一个就够了
临渊羡鱼不如退而结网
2.3k 声望
132 粉丝
0 条评论
你知道吗?

2.3k 声望
132 粉丝
文章目录
宣传栏