《JavaScript高级程序设计》:JS基础概念

378 阅读19分钟

前言

本系列是在学习JS的过程中所做的读书笔记,将重点知识提取出来在闲暇时刻翻阅,如果你看过这本书,那收藏起来当复习用;如果你没看过这本书,那还犹豫啥,收藏起来抱佛脚用的啦~~~

注:内容摘抄或总结自《JavaScript高级程序设计》第三到七章

一、语法

语法

  • JS区分大小写
  • 标识符:不能把关键字、保留字、true、false 和null 用作标识符
  • 注释:包括单行注释和块级注释。单行注释以两个斜杠开头
  • 严格模式:要在整个脚本中启用严格模式,可以在顶部或函数内部的开头添加如下代码: "use strict";
  • 语句:句末分号和代码块

关键字和保留字

  • 关于这部分一般不用记啦,常用的我们肯定不会用,记不住的编辑器也不会通过

变量

  • JS的变量是松散型变量:意为每个变量仅仅是一个用于保存值的占位符而已,可以保存任何类型的数据
  • 不建议改变变量所保存值的类型,但是这样的操作有效
  • 用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说, 如果在函数中使用 var定义一个变量,那么这个变量在函数退出后就会被销毁
  • 虽然省略 var 操作符可以定义全局变量,但这也不是我们推荐的做法

二、数据类型

typeof操作符

  • 注意:typeof是一个操作符而不是函数
  • typeof的返回值
    • "undefined"——如果这个值未定义
    • "boolean"——如果这个值是布尔值
    • "string"——如果这个值是字符串
    • "number"——如果这个值是数值
    • "object"——如果这个值是对象或 null
    • "function"——如果这个值是函数。
  • 可以写成typeof(XXX)或者typeof XXX
  • 只能准确判断基本类型,不能判断引用类型,引用类型会返回Object

Undefined类型

  • Undefined 类型只有一个值,即特殊的 undefined。在使用 var声明变量但未对其加以初始化时,这个变量的值就是 undefined
  • 一般而言,不存在需要显式地把一个变量设置为 undefined 值的情况。字面值 undefined 的主要目的是用于比较
  • 对于尚未声明过的变量,只 能执行一项操作,即使用 typeof 操作符检测其数据类型,会显示undefined
  • 对未初始化和未声明的变量执行 typeof 操作符都返回了 undefined 值

Null类型

  • Null 类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因
  • 只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值。
  • 实际上,undefined 值是派生自 null 值的,因此 alert(null == undefined); //true

Boolean类型

  • Boolean 类型是JS中使用得最多的一种类型,该类型只有两个字面值:true 和 false。 这两个值与数字值不是一回事,因此 true 不一定等于 1,而 false 也不一定等于 0。
  • 区分大小写,True 和 False (以及其他的混合大小写形式)都不是 Boolean 值,只是标识符
  • 可以对任何数据类型的值调用 Boolean()函数,而且总会返回一个 Boolean 值
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0 和NaN
Object 任何对象 null
Undefined X undefined

Number类型

  • 浮点数值
    • 所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字
    • 保存浮点数值需要的内存空间是保存整数值的两倍,所以能转的情况下通常保存为整数
    • 对于那些极大或极小的数值,可以用 e表示法(即科学计数法)表示的浮点数值表示。用 e表示法 表示的数值等于 e前面的数值乘以 10的指数次幂
      var floatNum = 3.125e7; // 等于 31250000
    • 浮点数值的高精度是 17位小数,但在进行算术计算时其精确度远远不如整数
  • 数值范围
    • 最小数Number.MIN_VALUE 在大多数浏览器中,这个值是 5e-324
    • 最大数Number.MAX_VALUE 在大多数浏览器中,这个值是 1.7976931348623157e+308
    • 超出JavaScript数值范围的值,将被自动转换成特殊的 Infinity 值。-Infinity(负无穷) Infinity(正无穷)
    • 如果某次计算返回了正或负的 Infinity值,那么该值将无法继续参与下一次的计算
    • isFinite(X)函数:可以检测X数值是否在最大最小值之间
  • NaN
    • NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数 未返回数值的情况(这样就不会抛出错误了)
    • JS中,任何数值除以 0会返回 NaN,因此不会影响其他代码的执行
    • 任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN
    • NaN 与任何值都不相等,包括 NaN 本身
    • isNaN()函数:isNaN()在接收到一个值之后,会尝试将这个值转换为数值。而任何不能被转换为数值的值都会导致这个函数返回 true。
    • 在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。
  • 数值转换
    • Number():可以用于任何数据类型
    • parseInt()和 parseFloat():把字符串转换成数值
    • parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字 符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN
    • parseInt()可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)。不指定基数意味着让parseInt()决定如何解析输入的字符串
    • parseFloat()也是从第一个字符(位置 0)开始解析每个字符。而且 也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。
    • parseFloat()只解析十进制,所以不用指定基数,与parseInt()的第二个区别在于它始终都会忽略前导的零

String类型

  • 字符字面量:也叫转义序列,用于表示非打印字符,或者具有其 他用途的字符。
字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
' 单引号('),在用单引号表示的符串中使用。例如:'He said,'hey.''
" 双引号("),在用双引号表示的符串中使用。例如:"He said,"hey.""
\xnn 以十六进制代码nn表示的一个符(其中n为0~F)。例如,\x41表示""
\unnnn 以十六进制代码nnnn表示的一个Unicod字符(其中n为0~F)。例如,\u03a3示希腊字符Σ
  • 字符串特点
    JS字符串是不可变的也就是说,字符串一旦创建,它们的就不能改变。要改变某个变量保存的符串,首先要销毁原来的字符串,然再用另一个包含新值的字符串填充该变
  • 转换为字符串
    toString()方法:数值(可以传递基作为目标进制)、布尔值、对象和字串值适用,但 null 和 undefined值没有这个方法,分别返回null 和undefined

Object类型

对象其实就是一组数据和功能的集合。Object的每个实例都具有下列属性和方法

  • constructor:保存着用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定
  • isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

三、操作符

一元操作符

  • 只能操作一个值的操作符叫做一元操作符
  • 递增和递减操作符
    • 前置:执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的(变之后再求值)
    • 后置:递增和递减操作是在包含它们的语句被求 值之后才执行的(求值之后再变)
  • 一元加和减操作符
    • 一元加操作符放在数值前面,对数值不会产生任何影响
    • 对非数值应用一元加操作符时,该操作符会像 Number()转型函数一样对这个值执行转换。
    • 在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,一元减操作符遵循与一元加操作符相同的规则,后再将得到的数值转换为负数

位操作符

  • 位操作符用于在基本的层次上,即按内存表示数值的位来操作数值
  • 对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号:0表示正 数,1表示负数。
  • 按位非(NOT) - 按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码 - 按位非操作的本质:操作数的负值减 1。 (例如25按位非之后-26)
    • 按位与(AND)
      • 按位与操作符由一个和号字符(&)表示,它有两个操作符数。
      • 按位与操作只在两个数值的对应位都是 1时才返回 1,任何一位是 0,结果都是 0。
    • 按位或(OR)
      • 按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。
      • 按位或操作在有一个位是1的情况下就返回1,而只有在两个位都是0的情况下才返回 0。
    • 按位异或(XOR)
      • 按位异或操作符由一个插入符号(^)表示,也有两个操作数。
      • 这个操作在两个数值对应位上只有一个 1时才返回 1,如果对 应的两位都是 1或都是 0,则返回 0。
    • 左移
      • 左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。
    • 右移
      • 有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即 正负号标记)。
      • 无符号右移操作符由 3个大于号(>>>)表示,这个操作符会将数值的所有 32位都向右移动。对正 数来说,无符号右移的结果与有符号右移相同。

布尔操作符

  • 逻辑非: 逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAScript中的任何值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再 对其求反。
  • 逻辑与: 逻辑与操作符由两个和号(&&)表示,有两个操作数
    • 如果有一个操作数是 null,则返回 null;
    • 如果有一个操作数是 NaN,则返回 NaN;
    • 如果有一个操作数是 undefined,则返回 undefined。
  • 逻辑或 :逻辑或操作符由两个竖线符号(||)表示,有两个操作数
    • 如果两个操作数是 null,则返回 null;
    • 如果两个操作数是 NaN,则返回 NaN;
    • 如果两个操作数是 undefined,则返回 undefined。

乘性操作符

  • 乘法:乘法操作符由一个星号(*)表示,用于计算两个数值的乘积。
    • 正负乘法法则,另外,乘积超过JS数字范围, 则返回 Infinity 或-Infinity;
    • X * NaN = NaN;
    • Infinity * 0 = NaN;
    • Infinity * Infinity = Infinity;
    • 如果是 Infinity 与非 0数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数 的符号;
    • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
  • 除法:除法操作符由一个斜线符号(/)表示,执行第二个操作数除第一个操作数的计算
    • 特殊情况与乘法类似
  • 求模:求模(余数)操作符由一个百分号(%)表示
    • 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN;
    • 如果被除数是有限大的数值而除数是零,则结果是 NaN;
    • 如果是 Infinity 被 Infinity 除,则结果是 NaN;
    • 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
    • 如果被除数是零,则结果是零;
    • 如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。

加性操作符

  • 加法
    • 如果有一个操作数是 NaN,则结果是 NaN;
    • Infinity + Infinity = Infinity;
    • -Infinity + -Infinity = -Infinity;
    • Infinity + -Infinity = NaN;
    • 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
    • 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接 起来。
    • 如果有一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值, 然后再应用前面关于字符串的规则。对于 undefined 和 null,则分别调用 String()函数并取得字符 串"undefined"和"null"。
  • 减法
    • 如果有一个操作数是字符串、布尔值、null 或 undefined,则先在后台调用 Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN,则减法的结果 就是 NaN;
    • 如果有一个操作数是对象,则调用对象的 valueOf()方法以取得表示该对象的数值。如果得到 的值是 NaN,则减法的结果就是 NaN。如果对象没有 valueOf()方法,则调用其 toString() 方法并将得到的字符串转换为数值。

关系操作符

  • 小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比 较,返回一个布尔值。
  • 规则
    • 如果两个操作数都是数值,则执行数值比较。
    • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
    • 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较.
    • 如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执 行比较。如果对象没有 valueOf()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较
    • 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。

相等操作符

  • 相等和不相等 == !=
    - 转换为数值进行比较 - null 和 undefined 是相等的。 - 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
    • 全等和不全等 === !==
      • null === undefined //false
  • 条件操作符
    • var max = (num1 > num2) ? num1 : num2;
  • 赋值操作符
    • 简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量
    • 乘/赋值(*=);
    • 除/赋值(/=);
    • 模/赋值(%=);
    • 加/赋值(+=);
    • 减/赋值(-=);
    • 左移/赋值(<<=);
    • 有符号右移/赋值(>>=);
    • 无符号右移/赋值(>>>=)。

逗号操作符

  • 使用逗号操作符可以在一条语句中执行多个操作

四、语句

if语句

  • 推荐使用代码块

do-whlie语句

  • do-while 语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。 换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。

while语句

  • while 语句属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。 因此,循环体内的代码有可能永远不会被执行。

for语句

  • for 语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代 码的能力。
  • 使用 while 循环做不到的,使用 for 循环同样也做不到。也就是说,for 循环只是把与循环有关 的代码集中在了一个位置。

for-in语句

  • for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。
  • 通过 for-in 循环输出的属性名的顺序是不可预测的。 具体来讲,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
  • 如果表示要迭代的对象的变量值为 null 或 undefined,for-in 语句会抛出错误。

label

  • 使用 label 语句可以在代码中添加标签,以便将来使用。
  • 这个例子中定义的 start 标签可以在将来由 break 或 continue 语句引用。加标签的语句一般都 要与 for 语句等循环语句配合使用。

break和continue语句

  • break 和 continue 语句用于在循环中精确地控制代码的执行。
  • break 语句会立即退出循环,强制继续执行循环后面的语句。
  • continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶 部继续执行。

with语句

  • with 语句的作用是将代码的作用域设置到一个特定的对象中。
  • 定义 with 语句的目的主要是为了简化多次编写同一个对象的工
  • 由于大量使用 with 语句会导致性能下降,同时也会给调试代码造成困难,因此 在开发大型应用程序时,不建议使用 with 语句。

switch语句

  • switch 语句与 if 语句的关系为密切,而且也是在其他语言中普遍使用的一种流控制语句。
  • break 关键字会导致代码执行流跳出 switch 语句。
  • 如果省略 break 关键字, 就会导致执行完当前 case后,继续执行下一个 case。
  • default 关键字则用于在表达式不匹配前 面任何一种情形的时候,执行机动代码(因此,也相当于一个 else 语句)。
  • 可以在 switch 语句中使用任何数据类型(在很多其他语言中只能使用数值),无论是字符串,还是对象都没有 问题。
  • 每个 case的值不一定是常量,可以是变量,甚至是表达式。

五、函数

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。否则,如 果函数有时候返回值,有时候有不返回值,会给调试代码带来不便。

严格模式对函数有一些限制:

  • 不能把函数命名为 eval 或 arguments;
  • 不能把参数命名为 eval 或 arguments;
  • 不能出现两个命名参数同名的情况。
  • 如果发生以上情况,就会导致语法错误,代码无法执行。

参数

  • JS函数不介意传递参数的个数和类型。例如即使定义的是两个参数,但是你也可以传递多个参数或者不传递。原因是JS中参数在内部都是以数组表示,函数接收的始终是一个数组,并不关心里面的数值类型及个数。
  • 在函数体内可以通过 arguments 对象来 访问这个参数数组,从而获取传递给函数的每一个参数。
  • arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访 问它的每一个元素。
  • 通过访问 arguments 对象的 length 属性可以获知有多少个参数传递给了函数。
  • 没有传递值的命名参数将自动被赋予 undefined 值。

没有重载

  • 如果在 JS中定义了两个名字相同的函数,则该名字只属于后定义的函数

小结

  • JS中的基本数据类型包括 Undefined、Null、Boolean、Number 和 String。  与其他语言不同,ECMScript没有为整数和浮点数值分别定义不同的数据类型,Number 类型可 用于表示所有数值。
  • JS中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基 础类型。
  • 严格模式为这门语言中容易出错的地方施加了限制。
  • JS提供了很多与 C及其他类 C语言中相同的基本操作符,包括算术操作符、布尔操作 符、关系操作符、相等操作符及赋值操作符等。
  • JS从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。
  • JS中的函数与其他语言中的函数有诸多不同之处。
  • 无须指定函数的返回值,因为任何 JS函数都可以在任何时候返回任何值。
  • 实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。
  • JS中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式 传递的。
  • 可以向JS函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数。
  • 由于不存在函数签名的特性,JS函数不能重载。

基础概念部分结束啦!感谢您的阅读!怎么样?不翻开其他章节看看??

《JavaScript高级程序设计》:JS基础概念

《JavaScript高级程序设计》:JS变量、作用域和内存问题

《JavaScript高级程序设计》:引用类型

《JavaScript高级程序设计》:面向对象的程序设计

《JavaScript高级程序设计》:函数表达式