⼀起来了解数据类型(也许通俗易懂)
我是⼀个菜鸡,笔试完⼀家公司,笔试完后的我就傻掉了。于是开始奋笔疾书,记录⼀下,也不知道会不会更全。话不多说直接放代码。
⾸先看到typeof操作符:
声明了但是没有赋值和没有声明的变量,两种都是undefined。然后呢,undefined本⾝也是undefined。
var cc;
var ccc;
console.log(typeof ccc);// undefined
console.log(typeof cccc);// undefined
console.log(typeof undefined);// undefined
于是我想了⼀下,如果上⾯两个声明但是未定义值得两个数加减会怎么样,结果全是number型,
console.log(typeof(ccc - cc));// number
console.log(typeof(cc + ccc));// number
console.log(typeof(cc * ccc));// number
console.log(typeof(cc / ccc));// number
所以得出了我的⼀个结果: (undefined ±*/ undefined = number)
(在这⾥做⼀个简单的补充就是,未声明变量和声明了变量但是没有初始化【就是没有赋值】)是有区别的。看下⾯的代码
var ss;
console.log(ss);// undefined
console.log(ssss);// ReferenceError: ssss is not defined
好了,我继续开始下⼀个验证,说到了number就先看number吧,看看有哪些会得出number的值来,
// 加法
console.log(typeof(1+1));// number
console.log(typeof(1+'1'));// string
console.log(typeof('1'+1));// string
console.log(typeof('1'+'1'));// string
// 减法乘法除法
console.log(typeof(1-*/1));// number
console.log(typeof(1-*/'1'));// number
console.log(typeof('1'-*/1));// number
console.log(typeof('1'-*/'1'));// number
由此,得出了我的第⼆个结果: 加法出了数字加数字是number以外,加其他的都是string类型,剑法,乘法,除法,都是number类型,不管数字是number型还是字符型
画个分割继续来,不仅数字可以加减,如果是布尔类型加减呢,来看⼀下会有什么样的结果
console.log(true+true);//2
console.log(true-false);// 0
console.log(true*/true);// 1
console.log(typeof(true+-*/true));//number
通过true的加减乘除可以得知第三个结果: 布尔类型之间互相加减的时候,是会编程数字进⾏操作的,true为1, false为0
了解完了这⼀层以后,但是还是有⼏个值是特殊的,如下。
console.log(false/false);// NaN  (这个说不清楚,看后⽂,相信我也许会懂的)
console.log(true/false);// Infinity  (这个词表⽰的是⽆穷⼤)
既然是number类型,⾃然⽽然就得要去分清楚 整型, 浮点型 吧。也要了解下 ⼗进制,⼋进制,⼗六进制吧 好了,直接放代码了解(为什么要放这个呢, 因为笔试 做到了!)。
好了,开始放代码,⾸先时整数型的,
var intNum =55;// 这是最简单的⼀个⼗进制整数了。
// 下⾯这三个都是⼋进制,⼋进制第⼀位必须为0,数字序列必须为7
// 如果字⾯值超出了范围,前导0将会被忽略。
var ocralNum =070;// ⼋进制的  56 ,打印ocralNum = 56
var ocralNum1 =078;// ⽆效的⼋进制,数值,打印 79
var ocralNum2 =08;// ⽆效的⼋进制,数值,打印 8
// 下⾯是⼗六进制的值
// ⼗六进制前⾯两位必须是 0x, 后⾯跟任何⼗六进制
var hexNum1 =0xA;// ⼗六进制的10
var hexNum2 =0x1f;// ⼗六进制的 31
代码清晰明了,注释也⽐较清晰明了,我懂了,好,继续浮点型,先看看定义: 浮点数值,就是数值中必须包含⼀个⼩数点,⽽且⼩数点后⾯必须⾄少有⼀个数字。
var a =1.1;
var b =0.1;
var c =.1//  这种⽅法不推荐使⽤,虽然可以使⽤。
⼩数很简单,通俗明了, 但是要了解⼀个知识点,保存浮点数值需要的内存空间是保存整数值的 两倍 。因此ECMAScript 会不失时机的将浮点数值转换为整数值。
什么意思呢 看下⾯代码和注释你也许就能明⽩了( 就是⼀个数虽然看起来是⼩数,但是他表⽰是整数,他就会被转换为整数 )
var a =1.;// ⼩数点后⾯没有数字 --- 解析为 1
var a =10.0;// 整数 ---- 解析为  10
是不是很明了 (Javascript ⾼级程序设计⾥⾯的例⼦哈哈,盗⽤了 )。
表⽰完了浮点,还有⼀种 极⼤或者极⼩的数值,可以⽤ e 表⽰法。
var floatNum =3.12e7// 等于 312 000 00 这个数值
var floatNum =3e-7;//等于 3乘以10的-7次⽅
现在让我们来看看,NaN,好多地⽅都能看到 NaN这种玩意,那⼀般什么时候才会得到NaN这个值呢 还是先看看定义吧。
NaN,即⾮数值,是⼀个特殊的值,这个数值⽤于表⽰⼀个本来要返回数值的操作数,但是未返回数值的情况。
听不懂对吧,我也不懂,好继续看这⾥
即任何数值除以⾮数值会返回NaN,因此不会像其他编程语⾔那样影响代码的执⾏。
好,⼤概理解了,其实就是⼀种不会影响代码执⾏的报错嘛。那就根据代码理解看看吧。
console.log(1/'a');// NaN
console.log(1/true);// 1
console.log(0/false);// NaN
console.log(1/false);// Infinity
console.log(1/[]);// Infinity
console.log(1/{});// NaN
看到这⾥,我⼈就有点傻了(毕竟我是个菜鸟)。⼤概意思估计是: [ ] 作为被除的数时候,会变成0. false 和true上⾯已经提过,此处不再提起。好吧。懵⾥懵懂先这样理解咯,看看后⽂会不会有答案。
看了下 NaN 就发现了这么⼀堆疑问。决定先放弃看完。继续看书。发现了他有两个特性。
任何涉及 NaN 的操作 ( 例如 NaN / 10) 都会返回 NaN,这个特点在多步计算 中有可能导致问题。
NaN 与任何值都不等,包括 NaN 本⾝。如 alert(NaN == NaN) 返回 false.
这两个定义应该还是很好理解的,也就不过多解释了。
注:第⼀个定义我已经能测试的都测试过了。全是NaN,你们可以试试看。有其他的欢迎评论。
针对这两个特点,定义了⼀个⽅法 ::isNaN().这个函数会帮我们确认这个参数是否 ”不是数值“。不说了,看代码如何⽤
alert(isNaN(NaN))// true  不是数值
alert(isNaN(10))// false  是数值
alert(isNaN("10"))//  10 是⼀个数值,因为 "10" 可以被转换成数值  10
alert(isNaN("blue"))//  true  不是数值
alert(isNaN(true))//  false  是数值因为 true 可以被转换成数值1
alert(isNaN([]))// false  是数值因为 []  可以被转换成数值 0
alert(isNaN({}))//  true 不是数值
所以我们可以知道: isNaN() 判断是否 ”不是数值“,数字字符串和boolean值会转换成 数值型
但是看到上⾯ [] 和 {} 的值就会很疑惑,为什么会这样呢。有这样的思考就有这样的解决⽅法,⾃然是。数值转换了。 ⾸先我们先看看 []和 {} 转换成数值是什么样的。虽然我上⾯给了注释,但是我们验证⼀下⽐较好。
console.log(Number([]))//  0
console.log(Number({}))//  NaN
现在懂了。{} 转换成数值是NaN呀,当然true了
现在开始
现在开始我认为number⾥⾯重要的点了。
数值转换
有三个函数可以把⾮数值转换为数值: Number(), parseInt()和 parseFloat()
1. 看看Number的转换规则:(代码配注释)
// Boolean 值, true  false  --> 1 0
console.log(Number(true))// 1
console.log(Number(false))// 0
// 如果是 null -->  0
cosole.log(Number(null))//  0
// undefined  -->  NaN
console.log(Number(undefined))// NaN
// "" --> 0
console.log(Number(""))// 0
如果是字符串。啊,看了下规则也太多东西了。
⾏吧,⼀点点来。
// 如果是这种,则返回 NaN
console.log(Number("helloworld"))// NaN
// 如果是这种,返回数字
console.log(Number('123'))// 123
// 如果是这种,⼋进制⼗六进制显⽰的字符串,显⽰的也是,数值,不会被转变。
console.log(Number('072'))// 72
/
/ 如果是字符串true ,false 也不会被转变打印NaN
console.log(Number('true'))// NaN
// 。。。。。。
Number介绍点暂时就到这⾥了,由于 Number 函数在转换字符串中⽐较复杂⽽且不够合理,因此在处理函数的时候更常⽤的是parseInt()函数。
paeseInt()函数
在转换字符串时,更多的是看其值是否符合数值模式。
它会忽略字符串串前⾯的空格,直到到第⼀个⾮空格字符。
如果第⼀个字符不是数字字符,则返回NaN.
如果第⼀个是数字字符,则继续解析第⼆个字符,直到解析完所有后续字符或者遇到了⼀个⾮数字字符。
它也能够识别出各种整式格式,⼗进制,⼋进制,⼗六进制等。
这个定义很重要
这个定义很重要
这个定义很重要
重要的事情说三遍
很好,看不懂没关系,看实例就懂了
console.log(parseInt("123456blue"));// 123456
console.log(parseInt(""));// NaN
console.log(parseInt("0xB"));// 11 (⼗六进制数转换)
console.log(parseInt(22.5));// 22
console.log(parseInt('070'));// 56  ⼋进制数转换来的
console.log(parseInt('70'));// ⼗进制
console.log(parseInt('0xf'));// 15  ⼗六进制数
// 这⾥请注意
console.log(parseInt('22.5'));// 22  .不是数值,所以取前⾯两个,⽽不是。22.5取整。这⾥要搞清楚
console.log(parseInt("af",16))// 175  表⽰ af 数字,但是是16进制的打印出 175 整数
//  16的位置也可以设置成, 2,8,100, 16
开始吧,parseFloat
parseFloat()
从第⼀个字符开始解析。
⼀直解析到字符串末尾,或者解析遇到⼀个⽆效的浮点数字字符(即第⼆个⼩数点。)
unicode文件格式
它会始终都忽略前导的 0。
parseFloat()只解析⼗进制值,没有第⼆个参数的⽤法。
如果,if, 字符串包含的是⼀个可解析为整数的数(⽆⼩数点或者⼩数点后⾯都是0),会返回整数。
console.log(parseFloat('1234blue'));// 1234
console.log(parseFloat('0xA'));// 0
console.log(parseFloat('22.5'));// 22.5
console.log(parseFloat('22.34.5'));// 22.34
console.log(parseFloat('0908.5'));// 908.5
console.log(parseFloat('3.125e7'));// 31250000
console.log(parseFloat([]))// NaN
诶,看到这⾥,不知不觉,码字到这⾥好累啊,但是确实不知道写了点什么东西。算了,继续吧。也许到最后就知道了呢。接下来字符串string
来到这⾥的第⼀件事情⾃然是要了解下。字符字⾯量咯(别说了,我也记不住,好了写个表格意思意思)
字⾯量含义
\n换⾏
\t制表
\b退格
字⾯量含义
\r回车
\f进纸(换页)
\斜杠
’单引号,再⽤单引号表⽰的字符串中使⽤: 'he said, ’ hey ’ ’
"双引号,意思同上
\xnn以⼗六进制代码 nn 表⽰的⼀个字符。 如 , \x41 表⽰ ‘A’
\unnnn以⼗六进制代码 nnnn 表⽰的⼀个 Unicode字符
感觉要记录的也就前⾯⼏个,最后两个 emmm, 看个⼈需要吧。
转换字符串
转换字符串的⽅式有两种
toString()⽅法
转型函数String()
⾸先我们看看toString()吧
var age =10;
var agestring = String();// "10"
var found =true;
var foundString = String()// "true"
这两种应该是最常见的number boolean 转换成字符串型的代码了吧。
(扩充下: 数值,布尔值,对象,字符串值 都有 toString() ⽅法)
下⾯看看第⼆种toString的⽤法: 转换进制数
var num =10;
String());// "10"  默认。 10进制
String(2));// "110"  ⼆进制
String(10));// "10"    ⼗进制
String(8));// "12"  ⼋进制
String(16));// "a"  ⼗六进制
看上⾯的例⼦,toString⾥⾯的数字就是要转换的进制。toString可以改变输出的值。根据不同的进制转换为不同的数值格式。下⾯看看第三种toString的⽤法。(请判断能不能使⽤哦)
然后我⼜把String()的⽤法结合和toString的⽤法放在⼀起⽐对,判断他们之间的异同