资讯专栏INFORMATION COLUMN

Javascript:数据类型与操作符

Leck1e / 2784人阅读

数据类型 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中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串(此过程是在后台发生的),然后再用另一个包含新值的字符串填充该变量
字符字面量/转义序列

换行
制表
回车
 空格
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;   

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86132.html

相关文章

  • JavaScript--变量基本数据类型

    摘要:中变量可能包含两种不同的数据类型的值基本类型和引用类型。本文主要介绍基本数据类型及其特点。操作符在介绍基本类型值之前,先说下操作符,操作符会返回数据类型的字符串表示。所有未初始化的变量均会保存该值。 前言JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保...

    XanaHopper 评论0 收藏0
  • WebSocket系列之JavaScript中数字数据如何转换为二进制数据

    摘要:以和为例,说明中的数字数据如何转换为二进制数据。对象用来表示通用的固定长度的原始二进制数据缓冲区。中的数字数据如何转换为二进制数据对和有了一个大概的了解,下面让我们来看下它是如何进行二进制数据操作的。 概述 本文主要通过对JavaScript中数字数据与二进制数据之间的转换,让读者能够了解在JavaScript中如何对数字类型(包括但不限于Number类型)进行处理。 二进制数据在日常...

    MASAILA 评论0 收藏0
  • 数据类型 - Javascript语法基础 - Javascript核心

    摘要:在编程语言中,能够表示并操作的值的类型称做数据类型。中的原始类型包括数字,字符串和布尔值。日期与时间语言核心包括构造函数,用来创建表示日期和时间的对象。其规则为如果是布尔值,和分别被转换为和如果是数字值,返回本身。 源代码: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/Javas...

    sevi_stuo 评论0 收藏0
  • JavaScript数据类型数据结构

    摘要:字符串类型的字符串类型用于表示文本数据。例如,使用一个分隔符,一个可以模仿一个列表一个的数组可能更适合一些。不幸的是,当一个分隔符在用于列表中的元素时,打乱了这个列表。属性的值可以是任意类型,包括具有复杂数据结构的对象。 编程语言都具有内建的数据结构,但各种编程语言的数据结构常有不同之处。本文试图列出 JavaScript 语言中内建的数据结构及其属性,它们可以用来构建其他的数据结构;...

    fireflow 评论0 收藏0
  • 前端基础进阶(一):内存空间详细图解

    摘要:一栈数据结构与不同,中并没有严格意义上区分栈内存与堆内存。引用数据类型的值是保存在堆内存中的对象。不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。为了更好的搞懂变量对象与堆内存,我们可以结合以下例子与图解进行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...

    _Suqin 评论0 收藏0
  • JavaScript-数据类型

    摘要:解释一行,执行一行这也意味着你可以使用同一个变量保存不同类型的数据二数据类型最新的标准定义了种数据类型种原型数据类型布尔值,和一个表明值的特殊关键字。我们称这些类型的值为原始值四布尔值布尔值数据类型只能有两个值,它们是文本和。 一、动态类型 JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。(解释一行,执行一行)这也...

    沈俭 评论0 收藏0

发表评论

0条评论

Leck1e

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<