数据类型,操作符

数据类型

ECMAScript 中有5 种简单数据类型(也称为基本数据类型s):Undefined、Null、Boolean、Number和String,还有1 种复杂数据类型——Object,Object 本质上是由⼀组⽆序的名值对组成的。

八种数据类型:

1.Undefined、Null、Boolean、Number和String、symbol、bigint,

2.复杂数据类型——Object

typeof操作符

typeof操作符可以⽤来检测变量(直接量)的数据类型。

undefined-未定义

boolean-布尔值

string-字符串

number-数值

object-对象或null

function-函数

if(typeof 100 === 'string'){

alert(1)

}else{

alert(2)

}

typeof可以操作变量,也可以直接操作字⾯量。

var boxName = '蒋超琼';

alert(typeof boxName) //操作变量

alert(typeof '中国加油') //直接操作了字⾯量

alert(typeof('typeof是操作符⽽不是内置函数'))

1.typeof是操作符⽽不是内置函数

2.函数在ECMAscript中是对象,不是⼀种数据类型,所以使⽤typeof来区别函数和object对象是非常重要的

Undefined类型

Undefined 类型只有⼀个值,即特殊的undefined。在使⽤var 声明变量但未对其加以初始化时,这个变量的值就是undefined

var box;

alert(box)

这个例⼦只声明了变量box,但未对其进⾏初始化。比较这个变量与undefined 字⾯量,结果表明它们是相等的。

var box = undefined;

alert(box == undefined); //true

这个例⼦使⽤undefined 值显式初始化了变量box,但我们没有必要这么做,因为未经初始化的值默认就会取得undefined值。

1.我们没有必要去显⽰的给⼀个变量赋值为:undefined,因为没有赋值的变量会隐式的⾃动的赋值为undefined,⽽undefined主要的⽬的是为了⽤于比较,为了正式区分空对象与未经初始化的变量

var box;

alert(a) //Uncaught ReferenceError: a is not defined

2.如果使⽤typeof去检测⼀个未经初化化的值,返回的是:undefined,q我们在定义变量的时候,要尽可能的做到不要只声明,不赋值

var box; // 这个变量声明之后默认取得了undefined 值

// 下⾯这个变量并没有声明

// var age

alert(typeof box); // "undefined"

alert(typeof age); // "undefined"

即便未初始化的变量会⾃动被赋予undefined 值,但显式地初始化变量依然是明智的选择。如果能够做到这⼀点,那么当typeof 操作符返回"undefined"值时,我们就知道被检测的变量还没有被声明,⽽不是尚未初始化。

Null 类型

Null 类型是也是⼀只有⼀个值的数据类型,这个特殊的值是null。从逻辑⾓度来看,null 值表⽰⼀个空对象指针,null 值表⽰⼀个空对象的引⽤(指针),⽽这也正是使⽤typeof 操作符检测null 值时会返回"object"的原因

var box = null;

alert(typeof box); // "object"

如果定义的变量准备在将来⽤于保存对象,最好就是把这个变量初始化为null,这样,我们在检查null值的时候就知道是否已经为这个变量分配好了对象引⽤了.

var box = null;

if(box != null){

alert('box对象已经存在') //因为box就是等于null,所以这句话,不会弹出警告,表⽰还是空对象的引⽤

}

实际上,undefined 值是派⽣⾃null 值的,因此ECMA-262 规定对它们的相等性测试要返回true:

alert(null == undefined); //true ==表⽰值相等 表⽰值相等.就是相等

alert(null === undefined); //false ===表⽰值相等,但是他们的类型不等 ===表⽰全等

由于undefined 和null两个值是相等的,所以,未初始化的变量和赋值为null的变量会相等,这个时候就可以采⽤typeof 变量的类型进⾏比较.

var a;

var b = null;

alert(a == b) //true

alert(typeof a) //undefined

alert(typeof b) //object

alert(typeof a == typeof b) //false undefined == object 不等

Boolean 类型

Boolean 类型是ECMAScript 中使⽤得最多的⼀种类型,该类型只有两个字⾯值:true 和false。这两个值与数字值不是⼀回事,因此true 不⼀定等于1,⽽false 也不⼀定等于0。另外JavaScript是区分⼤⼩写的,所以True和False或着其它的都不是Boolean的值。

var t = true;

var f = false;

alert(typeof f) //boolean

虽然Boolean 类型的字⾯值只有两个,但ECMAScript 中所有类型的值都有与这两个Boolean 值等价的值。要将⼀个值转换为其对应的Boolean 值,可以调⽤转型函数Boolean()

var boxName = '希望这次的疫情快点结束,可以在杭州尽快的⻅到⼤家';

var boxName2 = Boolean(boxName)

alert(typeof boxName)

alert(typeof boxName2)

上⾯这种转换叫"显⽰转换",属于强制性转换,但是在实际的应⽤过程中,还有⼀种叫隐式转换,比如,if条件语句⾥⾯条件判断,就存在隐式转换

var h = 'hello World';

if(h){

alert('如果说我条件为真(true),就执⾏我这条')

}else{

alert('如果说我条件为假(false),就执⾏我这条')

}

Boolean-true-false

String-任何非空字符串-空字符串

Number-任何非零数字值(包括无穷大-Infinity)-0和NaN

Object-任何对象-null

Undefined--undefined

Number类型

Number类型⼀共有两种数据:整型(整数)和浮点型(带⼩数点),这种类型使⽤IEEE754格式来表⽰。

八进制数值字⾯量,(以8为基数)前导制必须0.八进制的序列(0-7)

var n = 070; //56

var n = 079; //⽆效的八进制,会忽略前导0.⾃动转换79;

⼗六进制前导必须是0x,后在必须是(0-9及a-f)

var n = 0xA; //⼗六进制 10

浮点类型。就是数值中,必须要有⼀个⼩数点,且⼩数后⾯⾄少有⼀位数字

var n = 2.14;

var n = .1; //相当于就是0.1

alert(n)

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会⾃动地将浮点数值转换为整数值

var n = 1.; // ⼩数点后⾯没有数字——解析为1

var n = 10.0; // 整数——解析为10

关于浮点数值计算会产⽣舍入误差的问题,有⼀点需要明确:这是使⽤基于IEEE754 数值的浮点计算的通病,ECMAScript 并非独此⼀家;其他使⽤相同数值格式的语⾔也存在这个问题。浮点数值的范围在:Number.MIN_VALUE 和 Number.MAX_VALUE之间

alert(Number.MIN_VALUE)

alert(Number.MAX_VALUE)

访问Number.NEGATIVE_INFINITY 和Number.POSITIVE_INFINITY 也可以得到负和正Infinity 的值。可以想⻅,这两个属性中分别保存着-Infinity 和Infinity。

alert(Number.NEGATIVE_INFINITY) //-Infinity

alert(Number.POSITIVE_INFINITY) //Infinity

如何确定⼀个数值是否超过了规定范围,可以使⽤isFinite()函数来判断,如果没有超出返回true,超过了就返回false

var n = 100e1000;

alert(isFinite(n)) //false 已经超出了我们的最⼤范围值

尽管在计算中很少出现某些值超出表⽰范围的情况,但在执⾏极⼩或极⼤数值的计算时,检测监控这些值是可能的,也是必需的。NaN,即非数值(Not a Number)是⼀个特殊的数值,这个数值⽤于表⽰⼀个本来要返回数值的操作数

未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语⾔中,任何数值除以0 都会导致错误从⽽停⽌代码执⾏。但在ECMAScript 中,任何数值除以0 会返回NaN,因此不会影响其他代码的执⾏。

var n = 0 / 0; //NaN

var n = 12 / 0; //infinity

var n = 12 / 0 * 0 //NaN

在其它语⾔中的⽰例

NaN 本⾝有两个非同寻常的特点。⾸先,任何涉及NaN 的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN 与任何值都不相等,包括NaN 本⾝。

alert(NaN == NaN); //false

可以通过Number.NaN得到NaN的值。任何和其NaN的计算运算的结果都是NaN。

alert(Number.NaN) //NaN

alert(NaN + 1) //NaN

ECMAScript提供了isNaN()函数,这个函数接受⼀个参数,会帮我们确定这个参数是否“不是数值”,

isNaN()在接收到⼀个值之后,会尝试将这个值转换为数值。

alert(isNaN(NaN)) //true

alert(isNaN(25)) //false

alert(isNaN('你好')) //true

alert(isNaN('25')) //false 字符串数据可以转换

alert(isNaN(true)) //false 可以转换成1

isNaN()函数同样也适⽤于对象。在调⽤isNaN()函数过程中,会去调⽤⼀个⽅法valueOf⽅法。然后确定返回值是否能够转换成数组,如果不能,则基于这个返回值再调⽤toString()⽅法,再测试返回值。

var obj = {

toString:function(){

return 'hello world';

}

}

alert(isNaN(obj)) //true

数值转换

有3 个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。

如果是对象,则调⽤对象的valueOf()⽅法,然后依照前⾯的规则转换返回的值。如果转换的结果是

NaN,则调⽤对象的toString()⽅法,然后再次依照前⾯的规则转换返回的字符串值。

var obj = {

toString:function(){

return '0xa';

//可以把return '0xa' 改成数值或普通字符串查看结果

}

}

alert(Number(obj))

parseInt()函数

由于Number()函数在转换字符串时比较复杂⽽且不够合理,因此在处理整数的时候更常⽤的是parseInt()函数

parseInt()函数除了可以识别⼗进制,也可以识别八进制和⼗六进制

ECMAScript 3 认为是56(八进制),ECMAScript 5 认为是70(⼗进制)

ECMAScript为parseInt()提供了第⼆个参数,⽤于解决进制问题;

parseFloat

parseFloat 是⽤于浮点数值转换的,和parseInt()⼀样,第⼀位解析到非浮点数值的位置

String类型

String 类型⽤于表⽰由零或多个16 位Unicode 字符组成的字符序列,即字符串。字符串可以由双引号(")或单引号(')表⽰

字符串的特点

ECMAScript中的字符串是不可变的,也就是说,字符串⼀量创建成功,它们的值就不能改变。要想改变某个变量保存的字符串。⾸先必须要销毁原来的字符串,然后再⽤另⼀个包含新的字符串去填充变量

var lang = "Java";

lang = lang + "Script";

toString⽅法

toString()⽅法可以把值转换成字符串

var box = true;

var box = 11;

alert(typeof box.toString())

正常情况下,或着是⼤多数情况下,toString()⽅法是不需要传参的,但是在数值转换的时候,可以传递进制参数

var n = 10;

alert(n.toString()) //10 默认输出

alert(n.toString(2)) //1010 ⼆进制输出

alert(n.toString(8)) //12 ⼆进制输出

alert(n.toString(10)) //10 ⼆进制输出

alert(n.toString(16)) //a ⼆进制输出

如果在转型之前,不知道变量是是否null或undefined的情况下,我们可以使⽤转型函数String(),这个函数可以把任何类型的值转为字符

var box = null;

alert(String(box))

Object类型

ECMAScript 中的对象其实就是⼀组数据和功能的集合。对象可以通过执⾏new 操作符后跟要创建的对象类型的名称来创建。⽽创建Object 类型的实例并为其添加属性和(或)⽅法,就可以创建⾃定义对象

var obj = new Object()

这个语法与Java 中创建对象的语法相似;但在ECMAScript 中,如果不给构造函数传递参数,则可以省略后⾯的那⼀对圆括号。也就是说,在像前⾯这个⽰例⼀样不传递参数的情况下,完全可以省略那

var o = new Object; // 有效,但不推荐省略圆括号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值