重学js之JavaScript基本概念(上)=> 数据类型

1,656 阅读10分钟
注意: 本文章为 《重学js之JavaScript高级程序设计》系列第三章第一部分【数据类型】。
关于《重学js之JavaScript高级程序设计》是重新回顾js基础的学习。

前提:任何语言的核心都会描述这门语言最基本的工作原理,通常描述的内容会涉及到这门语言的语法 、操作符、数据类型、内置功能等用于构建复杂解决方案的基本概念。

1. 语法

1、js 中的变量、函数名和操作符都区分大小写,
2、另外一些像typeof这些关键字也不能使用

2. 标识符

所谓标识符就是指变量、函数、属性的名字,或者函数的参数。

标识符的写法标准如下:

1、第一个字符必须是一个字母、下划线或者一个美元符号
2、其他字符可以是字母、下划线、美元符号或数字
3、标识符中的字母采用驼峰大小写格式,例如:firstSecond、myCar

3. 注释

js的注释包括单行注释和块级注释,单行注释两个反斜杠开头,块级注释则是以(/)开始以(/)结束

单行注释

// 注释

块级注释

/*
    块级注释
*/

4. 语句

在js中语句是以分毫结尾但是不是必须的,但是推荐还是写上分号。因为这样在压缩代码的时候就不会出现不必要的问题。

5. 关键字和保留字

在js中有一些特定的关键字,这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等,关键字是语言特地保留的,所以不能用作标识符。另外在js中还有另外一些保留字,也是不能用来当作标识符。

6. 变量

因为js的变量是松散类型的,松散类型就是可以用来保存任何类型的数据。每个变量仅仅是用来保存值的占位符而已,定义变量需要用到var,在之后的ES6中增加了let和const关键字来定义变量。

var a = 10 // 定义一个变量a 给它赋值 10

注意:虽然省略 var 操作符可以定义全局变量,但是并不推荐这种做法,因为在局部作用域中定义全局变量会使得代码很难维护。

7. 数据类型

在js中有5种基本数据类型:Undefined、Null、Boolean、Number和String,复杂类型 Object。Object是一组由无序的名值对组成的。在ES中不支持任何创建自定义类型的机制。

8. typeof操作符

用来检测给定变量的数据类型,检测的返回值如下:

undefined -- 值未定义
Boolean -- 布尔值
string -- 字符串
number -- 数值
object -- 对象或者null
function -- 函数

typeof操作符的操作数可以是变量,也可以是数值字面量,typeof是一个操作符而不是函数。

9. undefined

它只有一个特殊类型的值即undefined,如果变量在var后没有赋值,那么这个变量的值就是 undefined。

var message;
message // undefined

注意:未初始化的变量和未赋值的变量 typeof之后都是undefined,所以为了更好的判断undefined的来源到底是未赋值还是未初始化,建议所有的值都声明在使用。

10. null类型

null 是第二个只有一个值的数据类型,值为 null,从表面看 null 表示的是一个空对象指针,而这个真是typeof 检测 null 返回值为 “object”的原因。

如果你想定义一个变量用来保存对象,那么最好的做法就是将变量赋值 null 这样检测 null 就知道 相应的变量是否保存了一个对象的引用。

注意:null == undefined 为 true,尽管这样两者的用途并不相同。无论任何情况下都没有必要将一个变量的值显式的设置为 undefined,而null则是如果保存对象的变量没有真正保存对象,那么就应该明确的让变量保存null值。这样可以进一步的区分 null 和 undefined。

11. Boolean类型

boolean类型有两个字面值:ture 和 false,另外这两个值和数字值不是一回事,ture 不一定等于1,false也不一定等于0.

注意:true 和 false 是区分大小写的,True 和 Flase 只是标识符。

我们可以通过函数** Boolean()** 将一个值转换为Boolean类型。 如下:

var message = 'haha,nihao';
var zh = Boolean(message)

各种类型的转换规则如下:

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 "" (空字符串)
Number 任何非零数字值(包括无穷大) 0 和 NaN
Object 任何对象 null
Undefined 不适用 undefined

12. number类型

在js中广泛使用的数据类型,有整数和浮点数值。可以通过十进制、八进制、十六进制的字面来表示。

var bjz = 070   // 八进制 56
var sjz = 56    // 十进制 56
var sljz = 0xA  // 十六进制 10

12.1 浮点数值

就是该数值中必须包含一个小数点,并且小数点后面至少有一位数字。

var f = 1.1

注意:由于保存浮点数的内存空间是保存整数的两倍,所以以下情况会自动将浮点转换为整数保存,如下:

var f = 1.  // 小数点后没有数字 保存为 1
var b = 10.0 // 保存为 10

另外对于 过大 或者过小的值可以通过 e(科学计数法)表示,如下:

var f = 3.125e7   // 3.125 * 10^7 => 31250000
var f = 3e-17     // js 会将小数点后面超过6个0的浮点数值转换为科学计数法

注意:0.1 + 0.2 != 0.3

12.2 数值范围

js中由于内存的限制并不能保存所有的数值,js能够表示的最小值为 5e-324,最大值为 1.7976931348623157e + 308。如果某次计算数值超过最大 就转换为Infinity,最小为 -Infinity。如果出现这两个值,那么该值就不能在参与之后的运算了。

12.3 NaN

js 中的非数值,是一个特殊的值。主要是为了防止抛出错误,用来表示一个本来返回数值的操作数未返回数值的情况。

NaN 有两个特定,1、任何涉及NaN的操作都会返回NaN,2、NaN与任何值都不相等包括其本身。针对这两个特点,ES定义了isNaN() 函数,这个函数接受一个参数,该参数可以是任何类型,而该函数会帮我们确定这个参数是否 “不是数值”,isNaN()接受参数之后会尝试将这个值转换为数值,某些不是数值的值会直接转为数值。如下:

isNaN(NaN)      // true
isNaN(10)       // false (10是一个数值)
isNaN("10")     // false (可以被转换成数值10)
isNaN('blue')   // true (不能转换成数值)
isNaN(true)     // flase (可以被转换成数值 1)

注意:isNaN()也可以用于对象,在基于对象调用的时候,首先会调用 valueOf()方法,然后确定该方法的返回值是否可以转换为数值,如果不能则基于这个返回值在调用 toString() 方法,在测试返回值。

12.4 数值转换

有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat(),第一个函数可以用于任何数据类型。另外两个函数用于将字符串转换为数值。

Number()转换规则如下:
    Boolean值  => true or flase => 1 or 0
    number => 传入和返回
    null => 返回 0 
    undefined => 返回null
    字符串
        如果包含十进制数值 则 '123' => 123 ,'012' => 12
        如果是浮点字符串 则 '1.1' => 1.1 , '01.1' => 1.1
        如果包含十六进制 则 '0xf' => 相同的十进制
        如果为空 则 '' => 0
        如果包含除了上述格式 则 '' => NaN
        如果是对象,则调用对象的 valueOf()方法,在按照之前的规则转换返回值,
    如果转换对象是NaN,则调用对象的 toString() 方法,在按照之前的规则返回字符串
    值。

parseInt()转换规则如下:
    它会忽略字符串前面的空格,如果第一个字符不是数字或者负号则返回NaN。
    如果是其他进制,则转换为响应的十进制数值。
    
    var n = parseInt('1234blue')    => 1234
    var m = parseInt('')            => NaN
    
parseFloat()转换规则如下:
    从第一个字符开始解析每个字符,知道遇到第一个无效的浮点数字字符为止
    也就是说字符串中第一个小数点是有效的,第二个小数点就无效的了。因此
    它后面的字符串就被忽略了。
    
    var n = parseFloat('1234blue')    => 1234
    var m = parseFloat('0xA')         => 0
    var c = parseFloat('22.21.2')     => 22.21
    var b = parseFloat('22.4')        => 22.4

13. string类型

用于表示由零或者多个16位 Unicode字符组成的字符序列,即字符串。由双引号("")或者单引号 ('')包裹而成

var a = '124'
var b = "123"

// 注意:双引号开头必须双引号结尾!

13.1 字符字面量

一些特殊的字符字面量,即转义序列。用于表示非打印字符,或者具有其他用途的字符。

字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
' 单引号
" 双引号

这些字符可以出现在字符串冲的任意位置,而且也会被当作一个字符来解析。

任何字符串的长度都可以通过 length 属性来获取。

let b = '1kljk'
b.length // 5

13.2 字符串的特点

在 ES 中字符串是不可变的。字符串一旦被创建,它的值将不能被改变。如果要改变某个字符串的值则需要销毁原本的值,在重新赋值

var lang = 'shanghai'
lang = lang + 'daxue'

// shanghaidaxue

13.3 转换为字符串

如果想将一个值转换为字符串有两种方法。一、通过toString(),如下:

var age = 11;
var agestring = age.toString() // '11'
var b = true
var bstring = b.toString() // 'true'

大多数数据类型(数值、布尔值、对象和字符串值)都有** toString**方法,但是 null 和 undefined 没有。大多数情况下 toString 是不需要传递参数的。默认是以十进制格式返回数值的字符串表示。但是其实是可以传递八进制、二进制、十六进制参数的。

var num = 10;
num.toString()      // '10'
num.toString(2)     // '1010'
num.toString(8)     // '12'
num.toString(10)    // '10'
num.toString(16)    // 'a'

14. object类型

对象是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。创建的object类型的实例,可以为其添加属性和方法。

var o = new Object()

在ES中 Object类型是所有它的实例的基础,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。

Object的每个实例都具有下列属性和方法:

constructor => 保存用于创建当前对象的函数

hasOwnProperty(propertyName)=> 用于检查给定的属性在当前对象实例中是否存在。propertyName必须以字符串形式指定。

isPrototypeOf(object) => 用于检查传入的对象是否是另一个对象的原型。

propertyIsEnumerable(propertyName) => 用于检查给的属性是否能够使用 for-in语句来枚举,与hasOwnProperty()方法一样,作为参数的属性名必须以字符串指定。

toString() => 返回对象的字符串表示

valueOf() => 返回对象的字符串、数值或布尔值表示。·

欢迎关注我的公众号 【小夭同学】