前言
在javaScript有六大变量类型,今天我们的话题就围绕这六大类型进行讨论
Number
String
Object
Boolean
function
undefined
undefined
undefined,顾名思义,就是未定义的意思,当我们初始化一个变量时,没有给一个变量赋初始值,那么这个变量默认为undefined,而不是null,他跟null不一样,他是单独一个类型,而null属于object类型,这个值的出现,实际上也是为了区分空指针和未初始化数据。一般用于比较。
var x;
console.log(x)
// 结果为true
console.log(x==undefined)
当然了,因为是为未初始化,所以变量类型也不能确定,另外存放undefined的变量和未定义的变量还是有区别的,未定义的变量直接使用会报错
var x;
// 结果还是undefined
console.log(typeof x)
// 报错啦,没有定义y
console.log(y)
事实上undefined衍生于null值,所以他们比较结果是true
// 结果为true
console.log(undefined==null)
Boolean
Boolean只有两个值true和false,在javaScript中,Boolean的值还是区分大小写的,也就是说写true和True还是有很大的区别的,值得注意。另外我们可以强制转换Boolean在javaScript中,如果我们写if(100)就等价于写if(Boolean(100))。
// true 非零数字即可
console.log(Boolean(1));
console.log(Boolean(-1));
// false
console.log(Boolean(0));
// false
console.log(Boolean(""))
console.log(Boolean(null))
console.log(Boolean(undefined))
// true
console.log(Boolean("非空字符串"))
Number
数值类型有整形和浮点型,number的最大和最小我们都可以通过指令获取,如果越界了就是infinite有正负号
Number.MAX_VALUE
Number.MIN_VALUE
在进制表示中,ECMA规范跟java几乎一致,但是在8进制表示中有所不同(java没试过,各位试试?)
// 十六进制转十进制输出10
console.log(0xA)
// 输出6
console.log(6)
// 无效的八进制数,实际上是80,0被舍弃
console.log(080)
// 有效的八进制数,结果是63
console.log(077)
在javaScript可以保存0和-0,但是他们比较还是一样的
var x=0;
var y=-0;
console.log(x==y);
浮点数就比较特殊,因为要保存小叔子后面的数字,所以他占用的空间比较大,为了节省空间,javaScript通常会自动将类似83.00000这种浮点数转为整数(也就是小数点后面全是0的数)
console.log(83.00000);
当然因为精度的关系,所以浮点数的比较不一定精准,当然,我没找到具体的例子,就直接给出解决方案把,解决思路就是:比较他们之间的差距,如果可以忽略不计,那么我们则认为他们相等
var x=0.1
var y=0.3
if(Math.abs(x+y-0.4)<=0.000000001){
console.log("x+y等于0.4")
}
还有一种比较特殊的类型NAN—Not a number(不是一个数字),官方给了一个函数来判断一个变量是否为数字isNaN()
//true
isNaN(undefined)
//true
isNaN("a")
//因为可以转化为数字,所以不是NaN
isNaN("100")
//Boolean true转1 false转0,所以Boolean类型返回结果都为false
isNaN(true)
那么如何将其他类型转化为数字呢?我们通常使用parseInt和number进行强转,是不是很像java呢?我这里还是推荐使用parseInt,因为number自动化操作有点多,规则也不好记,而parseInt我们可以手动操控,十分方便
parseInt("10000111",2)
// 十六进制转化,会省略空格哦
parseInt(" AB",16)
// 默认是十进制哦,如果有0x符号就是十六进制
parseInt("10000111")
// 会忽略前置0
parseInt("010000111")
// 从第一个1遍历到人结束,直接输出100
parseInt("0100人00111")
// 小数点也是一样
parseInt("0100.00111")
// 小数举一反三,用parseDouble啦
parseDouble("0100.00111")
// 但是只能解析一个小数点
parseDouble("0100.001.11")
函数
javaScript的函数使用方法十分简单,只需要记住关键字function,用法有两种,如下
QueryDay=function(n){
"use strict"
arguments[0]=1;
switch(true){
case n==1:alert("1");break;
case n==0:alert("0");break;
default:alert("07");break;
}
}
function QueryDay(n){
"use strict"
arguments[0]=1;
switch(true){
case n==1:alert("1");break;
case n==0:alert("0");break;
default:alert("07");break;
}
}
javaScript传参的思想一定要搞明白,不要死记硬背。其实也很简单,函数参数的传递过程实质上就是先把你要传的参数放入一个数组,然后在将这个数组传进去,这个数组的名字叫arguments,如果你只传了一个参数,但是你要用>1个参数,那么除了第一个参数被初始化,其他参数都是默认为undefined,当然,我们可以重写参数里面的东西,但是前提得保证不是严格检查模式,严格检查模式重写会失效。
function QueryDay(n){
arguments[0]=1;
switch(true){
case n==1:alert("1");break;
case n==0:alert("0");break;
default:alert("07");break;
}
}
javaScript并没有函数的重载,而是后面的函数会覆盖前面的函数,这样设计也有一定合理性,想想参数传递的原理,javaScript对函数的约束并不严格,不需要你传多少参数,传什么参数,甚至也不需要你返回什么。当然建议要么让一个函数永远有返回值,要么永远没有返回值。这样也能减少代码调试的难度
function QueryDay(n){
arguments[0]=1;
switch(true){
case n==1:alert("1");break;
case n==0:alert("0");break;
default:alert("07");break;
}
}
function QueryDay(n){
alert("真好");
}
}