js基础:数据类型

js基础:数据类型

引入

复习一下js基础:数据类型

ECMAscript有6种简单数据类型

分别是undefined,Null,Boolean,Number,NaN,String,Symbol

1种复杂数据类型叫Object(对象)

在ECMAscript不能定义自己的数据类型

所有值都可以用上述7种数据类型之一来表示

参考书籍:《javascript高级程序设计》

Undefined

Undefined类型只有undefined值,用于那些声明了却没初始化的变量

增加这个undefined就是为了

区别空对象指针NULL和未初始化变量undefined的区别

Null

Null类型只有null一个值,表示一个空对象指针

注意undefined是由null派生来的

因此有

console.log(null==undefined)//true
console.log(null===undefined)//false

在定义将来要保存对象值的变量时,建议用null来初始化

Boolean

Boolean类型有俩个字面量true和false(注意区分大小写)

可以将别的值用Boolean()转型函数转变为boolean类型值

这一过程被if等控制语句自动执行

比如

let a="hello";
if(a){
 alert(1);//被执行,弹出1
}

Number

Number类型表示一个数字

可以八进制(开头0),可以十六进制(开头0x),也可以正常的十进制

let a=071;//八进制的57
let b=079;//无效,0被忽视,79十进制
let c=0x1f;//十六进制的31

也可以是浮点值,也可以是整数(与其他语言不太相同)

let a=1.1//1.1
let b=1.0//js为节省存储空间,把b当整数1处理
let c=3.12e8;//3120000000

注意:由于和c一样使用IEEE 754格式表示整数和浮点数(双精度值)

0.1+0.2不是0.3,而是0.3000000000000000004(与c,java相同)

一些特定常数

由于内存限制,ECMAscript不支持所有数值

有最大值Number.MAX_Value和最小值Number.MAX_Value

任何超过或小于这个范围的数就是Infinity

console.log(Number.MAX_VALUE);//1.7976931348623157e+308

NaN

NaN类型有一个值就是它本身,意思是**“不是数值”**

用于表示本来要返回数值的操作失败了(不是抛出错误)

console.log(0/0);//NaN
console.log(5/0);//Infinity
console.log(NaN==NaN);//false    NaN不等于包括NaN在内的任何值

isNaN函数可以判断一个参数是否“不是数值”,可以配合ValueOf()toString()用于测试对象

console.log(isNaN(NaN));//NaN不是数值,true
console.log(isNaN("10"));//"10"可以被转化为数值,false

String

String类型的值为字符序列

与c,java不同的是

js中双引号和单引号都可以,但建议统一使用某一种

ECMAscript中的字符串不可变,一旦创建不能更改,要改必须先销毁之前那个字符串重新创建一个

let a=java;
a=a+"script";//这的a和上面的a不是一回事

其他类型转换为字符串的几种方法

toString()

String()

变量+“”

模板字符串

模板字符串是普通字符串的加强版

它可以用${}插值js表达式,并解析表达式,并通过toString强制转型为字符串。

它保留换行字符

对于定义模板时特别有用

let name="xsr";
let age=18;
let me=`i am ${name},i am ${age} years old`;//字符串插值
console.log(me);//"i am xsr,i am 18"
模板字符串中的标签函数(本博客重点)

模板字符串也支持定义标签函数,通过标签函数可以自定义插值行为。

什么意思?举个例子

假如现在有name变量,三门成绩语文英语数学变量

let name="xsr";
let math=90;
let english=80;
let chinese=70;

用模板字符串输出一下name的相关信息(插值)

let result=`我是${name},我的三门成绩分别是${math}${english}${chinese}`;
console.log(result);//我是xsr,我的三门成绩分别是90,80,70

但如果我们需要得到一个三门成绩的平均数

如果我们直接插值,就是这样

let result=`我是${name},我的三门成绩分别是${math}${english}${chinese}
平均成绩为${(math+english+chinese)/3}`;

写在程序里的代码就很繁琐了,那如果不是求平均数,而是更难的逻辑呢?

所以我们需要一个标签函数去处理这些插值变量

插值函数的第一个参数会接收被插值记号分割后的模板(存为数组)

其他参数可以拿到每个表达式求值的结果

function GetAverageTag(Strings,...experssions){
    let num=0;
    for (let index = 1; index < experssions.length; index++) {
         num+=experssions[index];
    }
    let average=num/(experssions.length-1);
    return `本人三门成绩平均分为${average}`;
}

上面的代码块中GetAverageTag就是标签函数的名字(随意起)

Strings就是第一个参数,它可以拿到被插值分割后的模板,并收集到一个数组中

console.log(Strings);//[ '我是', ',我的三门成绩分别是', ',', ',', '' ]

…experssions利用剩余运算符将每个表达式求值的结果收集到一个数组中

console.log(experssions);//[ 'xsr', 90, 80, 70 ]

现在我们就可以正常的对它操作了,这个时候再来看上面的GetAverageTag函数就简单了

里面的话我们就把它当作数组一样对待就ok了

我这里写的不是很好,只是想说明这个东西(doge)

然后调用标签函数

let average_result=GetAverageTag`我是${name},我的三门成绩分别是${math},${english},${chinese}`;
console.log(average_result);//本人三门成绩平均分为80

Symbol

Object

类似于java.lang.object

ECMAscript中的object也是派生其他对象的基类

也就是说

let a={
	name:"xsr",
	a1:function add(){
		console.log(1);
	}
}
console.log(typeof a);//object

object类型是一组数据和功能的集合

在object实例上都有很多属性和方法

console.log(a.hasOwnProperty("name"));//true
console.log(a.toLocaleString());//[object Object]
console.log(a.toString());
console.log(a.valueOf());//{ name: 'xsr', a1: [Function: add] }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程就是n踢r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值