啃一啃犀牛书--类型、值、变量(1)

啃一啃犀牛书–类型、值、变量(1)

javascript 数据类型

js的数据类型分为:原始类型和对象类型。

原始类型:数字(number),字符串(string),布尔值(boolean)。
其中有两个特殊的原始值:null,undefined。
最后一个就是对象类型了。

js的类型也可以按照是否拥有方法来分为可以拥有方法的类型,和不能拥有方法的类型。也可以分为可变类型和不可变类型。

可否拥有方法:

  • 拥有方法:string,number,boolean,object
  • 不能拥有方法: undefined,null

是否可变:

  • 可变类型: object(array)
  • number,boolean,null,undefined,string

下面针对每一个类型说一点可能注意不到的东西

tips

数字(number)

首先一定要注意,js是不区分整数值和浮点数值。js的所有数字均采用浮点数值表示。其采用IEEE 754标准定义的64位浮点格式表示数字。
主要说的是二进制浮点数和四舍五入的错误。

你肯定见过这样的情况,在控制台输出。

1
2
3
4
0.1+0.2     //   0.30000000000000004
var x = 0.3-0.2 // 0.09999999999999998
var y = 0.2-0.1 // 0.1
y == z // false

看官网的解释:

由于舍入的误差,0.3和0.2之间的近似差值实际上并不等于0.2余0.1之间的近似差值。这个问题并不只在js中才会出现,理解这一点很重要:
在任何使用二进制浮点数的编程语言中都会有这个问题。同样需要注意的是,杉上述代码中x和y值非常接近彼此和最终的正确值。这种计算结果可以胜任大多数的计算任务:这个问题也只有在比较两个值
是否相等的时候才会出现。

所以我们有时候遇见这样的操作一般都先乘以100,变成整数或者利用parseInt(),parseFloat()等方法拿到近似值。

这里面还有一个比较好玩的,大家应该也都知道,在日期和实践Date()这个构造函数中,直接上代码好了:

1
2
var nowTime  =  new Date();
nowTime.getMonth() //这里面是从0开始算的,即1月是0,最大到11.

字符串(string)

字符串这里看起来并没有什么可以特别指出的,关于字符串的方法会单独列出来进行整理。
这里单独说一个关于字符串的隐式转换。(关于js的隐式转换挺多的,单独说一个,后面有章节专门针对这个来说)
平时我们可能获取到的是number类型的值,可能在某种情况下需要转成字符串类型,我们可以显示的调用toString()方法,也可以直接在后面 +’’;

1
2
3
4
var a = 111;
var b = a.toString();
var c = a + '';
b===c //true

肯定大家都会~~~我就啰嗦一番好了。

布尔值(boolean)

布尔值应该跟字符串类似,觉得大家都应该很熟悉了,那就简单说两点,如何转换成布尔值。
如果调用Boolean()方法是直接可以返回boolean,那如果不这样做呢?

1
2
3
4
var a = 'true';
var b = Boolean(a);
var c = a==='true';
b===c //true

额,觉得貌似没有什么好玩的,算是换种思路吧,有时候你可能拿到的是字符串类型的,需要转换一下。

null 和 dundefined

这个地方,真不知道是应该多说还是少说。看一个代码:

1
2
typeof null                 //object
typeof undefined //undefined

从第一个返回结果来看,null还是对象了。确实,它是一个特殊的对象值,可以理解为”非对象”。
在我们有时候做判断的时候也需要注意一点:

1
2
null == undefined               //true
null === undefined //false

我们经常利用这个来区分~

全局对象

在代码的最顶级—-不在任何函数内的js代码—可以使用this来引用全局对象。

在浏览器环境中,全局对象指的window,而在nodejs中全局对象指的global。

包装对象

在看到这一章的时候,我也确实有点懵,名词真的是越来越多。看官方的解释好一点。

1
2
var s = 'hello world';
var word = s.substring(s.indexOf(' ')+1,s.length);

这样的代码我们经常写,但是,字符串既然不是对象,为什么它会有属性呢?

只要引用了字符串s的属性,js就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。
一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或者销毁这个临时对象,然而整个过程看起来像是这样)。

这里面有坑!!!

1
2
3
var s = 'test';
s.len = 4;
var t = s.len; //undefined

这段代码说明,在读取字符串,数字和布尔值的属性(或方法)的时候,表现的像对象一样。但如果你试图给其属性复制,则会忽略这个操作:
修改只是发生在临时对象上,而这个临时对象并未继续保留下来。

这一章的很多东西,可能读起来枯燥无味,但是有些时候我们遇到的问题,恰恰就出现在这里,这一章可能只说了一半,但是其内容,也够我消化了。
我只是把里面我觉得可能会出错的地方或者不理解的地方摘了出来,如果你还想详细的了解,请移步《JavaScript权威指南》!