第3章 类型、值和变量

1. JS数据类型分为两类:原始类型(primitive type)和对象类型(object type)。原始类型包括数字、字符串、布尔值以及null(空)和undefined(未定义)两个特殊原始值,null和undefined分别代表了各自特殊类型的唯一成员。

  对象是属性的集合,每个属性由“名/值对”构成。JS中普通的对象是“命名值”(或者说“名/值对”)的无序集合,不过JS定义了一种特殊对象——数组,表示带编号值的有序集合。

  JS还定义了另外一种特殊对象——函数,JS中函数也是对象。数组和函数这两种特殊对象的行为与JS中普通对象的行为不一样,JS为这两种特殊对象的使用定义了专用语法,第7章专门讲述数组,第8章专门讲述函数。

  JS出了定义数组类和函数类这两种特殊类型之外,还定义了日期(Date)类型,正则(RegExp)类型和错误(Error)类型。当然,还可以定义自己的类型。

  • 原始类型:

      数字、字符串、布尔值、null、undefined。

  • 对象类型:

      数组类(Array)、函数类(Function)、日期类(Date)、正则类(RegExp)、错误类(Error)、自定义类。

  类可以看做是对象类型的子类型,从上面关系也可以看出。

2. JS数据类型可以分为原始类型和对象类型,也可以按照分类方式来分类。

  是否拥有方法:从技术上将,只有JS对象才能拥有方法,但是奇葩的是JS中数字、字符串和布尔值也拥有自己的方法。JS中只有null和undefined无法拥有方法。

  可变类型和不可变类型:可变类型的值是可以修改的。原始类型均为不可变类型,这一点也比较奇葩,因为字符串可以看成字符组成的数组,但是JS中的字符串是不可变的。

3. JS变量是无类型的,变量可以被赋予任何类型的值,同一个变量也可以重新被赋予不同类型的值。

  使用var关键字来声明JS变量。

  不在任何函数内声明的变量称为全局变量,具有全局作用域;在函数内声明的变量称为局部变量,并且只在函数内可见。

4. 数字

  当一个数字直接出现在JS程序中,称为数字直接量。

  • 整型直接量:JS支持十进制和十六进制,十六进制以0x(0X)为前缀。最好不要用八进制直接量,因为有的JS版本不支持八进制。
  • 浮点型直接量:包括传统写法和指数写法,指数写法在实数后面跟e(E),再跟指数,比如6.2e8,6.2e-5。

  JS中的算数运算:

    除了+、-、*、/、%之外JS还支持更加复杂的算数运算,这些复杂运算做为Math对象的属性来实现,比如Math.pow(2, 5)、Math.PI等。

  JS采用二进制浮点数,可以精确的表示分数1/2,1/8等,而对于十进制分数1/10,1/100等则不能完全精确的表示。例如JS中“0.3 - 0.2 == 0.1”这个表达式将返回false,还好这个问题只有在比较两个值是否相等的时候才会出现。
5. 字符串

  在ECMAScript3中字符串直接量必须写在一行,而在ECMAScript5中可以拆分成数行,每行以“”结束。

  JS字符串中的还有一个用处,转义字符,包括几个特殊转义字符以及两种通用转义字符,xXX(Latin-1字符)和uXXXX(Unicode字符)。

  字符串的使用:

  • 字符串连接:
msg = "Hello, " + "world"
  • 字符串长度:msg.length
  • 各种牛逼的方法

  JS创建正则表达式有两个方法,直接量写法或者调用RegExp()构造函数。两条“/”之间的文本构成了一个正则表达式直接量,第二条“/”之后可以跟随一个或多个字母,用来修饰匹配模式。

6. 布尔值

  true,false。与(&&)、或(||)、非(!)。

7. 包装对象

  JS对象是一种复合值:它是属性(命名值或者说“名/值对”)的集合。通过“.”符号来引用属性值。当属性值是一个函数的时候,称为方法,可以这么说:方法就是对象中的函数属性。

  我们能看到JS中字符串也具有属性和方法(方法固然也是属性的一种,这里分开说是为了表达方法是一种特殊的属性)。

var s = "hello world!";
var world = s.substring(s.index(" ") + 1, s.length);

  字符串既然不是对象,为什么它会有属性呢?因为在JS中,只要引用了字符串s的属性,JS就会将字符串通过调用new String(s)的方式转换为临时对象,既然已经变身为对象了,当然就可以拥有属性啦。同字符串一样,数字和布尔值也具有各自的方法:分别通过Number()和Boolean()构造函数创建临时对象。

  当然可以通过String(),Number(),Boolean()构造函数来显示创建包装对象:

var s = "test", n = 1, b = true;
var S = new String("test");
var N = new Number(1);
var B = new Boolean(true);

  JS会在必要时在背后偷偷摸摸的将这些对象转换成原始值,因此上段代码中的对象S,N和B经常表现的跟s,n,b很像。“=”等于运算符将原始值和其包装对象视为相等,但“===”全等运算符将他们视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。

8. 类型转换

  JS中的类型转换有点丰富,今天看烦了,以后再总结。

9. 变量声明

  JS中使用一个变量之前应该首先声明,声明变量的关键字是var。

  跟C或者Java等静态类型语言不同,JS是动态类型语言,你应该注意到JS中变量的声明并没有指定变量的数据类型。JS变量可以是任意数据类型,也可以被赋予其他类型的值。

10. 变量作用域

  包括全局作用域和函数作用域(不同于C语言中的块作用域哦)。需要注意的是函数作用域:JS的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。JS的这个特性称为声明提前,即JS函数里声明的所有变量(但不涉及值)都被提前至函数的顶部,因此为了反应出真实的变量作用域,可以将变量声明放在函数顶部,JS真够奇葩的,哈哈。

  

原文地址:https://www.cnblogs.com/iamswf/p/4565152.html