文章目录
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] }