003-读书笔记-JavaScript高级程序设计 基本概念(上)

这篇笔记的内容对应的是《JavaScript高级程序设计(第三版)》中的第三章。javascript

1.语法

1-1 区分大小写

ECMAScript 中的一切都是区分大小写的。java

  • testTest 首字母不一样,那么它们就不相同
  • typeoftypeOf 中间有个字母大小写不一样,那么它们也不相同

1-2 标识符

认识标识符函数

  1. 标识符的做用:用于变量、函数名、属性名、函数的参数
  2. 标识符的规则:
1. 第一个字符必须是字母、下划线(_)或美圆符($)
2. 其余字符能够是字母、数字、下划线或美圆符

注:
1. ECMAScript 标识符通常采用驼峰方式定义,即第一个字母小写,剩下每一个有意义的单词首字母大写(不是强制规定)
2. 不能使用关键字、保留字、true、false 和 null 做为标识符(强制规定)

思考:可不可使用 undefined 做为标识符?性能

使用 var 来定义变量的时候不能够:测试

var undefined = 123;
console.log(undefined); // undefined

使用 const 或 let 定义变量的时候能够:this

let undefined = 123;
console.log(undefined); // 123

结论:尽可能不要使用 undefined 做为标识符spa

1-3 注释

注释的方式有两种:debug

  1. 单行注释
  2. 多行注释
// 单行注释
/**
 * 多行注释
 */

1-4 严格模式

ECMAScript5 中引入了严格模式的概念。设计

  1. 严格模式的做用:为 JavaScript 定义一种不一样的解析与执行模型
  2. 严格模式的启用:在文件中定义一个编译指令 "use strict";

严格模式能够在文件中使用,也能够在函数中使用。若是要在整个文件中使用严格模式,就要在文件顶部添加编译指令;若是要让函数在严格模式下执行,要在函数体中增长编译指令。指针

"use strict";

// js文件中的其余代码
function func(){
  "use strict";
  // 函数体
}

1-5 语句

语句通常以分号结尾。

var num = 123;

结尾分号不是必须的,若是没有分号,以解析器肯定语句的结尾。

var num = 123

语句结尾手动增长分号的好处:

  1. 提升代码的性能(解析器不须要推测在哪里须要插入分号)
  2. 避免一些没必要要的错误(如代码压缩时出错)

推荐语句的结尾使用分号

2.关键字和保留字

关键字在 ECMA-262 中具备特定的用途,通常用于:

  1. 用于控制语句的开始或结束
  2. 用于执行特定的操做等

ECMA-262 中的关键字以下:

break do instanceof typeof case
else new var catch finally
return void continue for switch
while debugger function this with
default if throw delete in
try

ECMA-262 中的保留字没有任何意义,可是之后有可能被用做关键字:

abstract boolean byte char class
const debugger double enum export
extends final float goto implements
import int interface long native
package private protected public short
static super synchronized throws transient
volatile let yield

关键字和保留字不能用做标识符

3.变量

ECMAScript 中定义变量的方式,var 操做符后面跟上变量名,如 var num;

ECMAScript 每一个变量仅仅是一个用来保存值的占位符而已,ECMAScript 中的变量能够保存任意类型的值:

var num = 123; // 定义一个变量,初始值为数字
num = '123'; // 更改变量的值,这个时候数值类型为字符串

不建议修改变量所保存的值的类型

若是变量在声明的时候,没有指定初始值,会保存一个特殊的值 undefined

var num;
console.log(num); // undefined

一条语句能够定义多个变量,可是要使用逗号操做符分割:

var num = 123, 
    str = 'test', 
    flag = true;

注意:严格模式下,不能定义名字为 eval 或 arguments 的变量,不然会报错。

'use strict';

var arguments = 123;
console.log(arguments);

会报出下面的错误:

SyntaxError: Unexpected eval or arguments in strict mode

分析:定义变量并结合做用域

在函数内部经过 var 定义的变量,在函数外部不能访问。

function func() {
  var name = 'wang'; // 这是一个局部变量,当函数执行结束的时候,该变量会被销毁
}
func();
console.log(name); // ReferenceError: name is not defined

若是在函数内部定义变量的时候不使用 var 关键字,那么就会默认定义的是一个全局变量。

function func() {
  name = 'wang';
}
func();
console.log(name); // 'wang'

上面的代码和下面的代码等价,由于发生了变量声明提高:

var name;
function func() {
  name = 'wang';
}
func();
console.log(name); // 'wang'

4.数据类型

ECMAScript 中有 5 种简单的数据类型和 1 种复杂的数据类型。

  • 简单数据类型:Undefined Null Boolean Number String
  • 复杂数据类型:Object

4-1 typeof 操做符

typeof 是一个操做符,不是一个函数,虽然在判断数据类型的时候能够写成 typeof(123),可是括号不是必须的。

typeof 123
typeof(123)

使用 typeof 操做符,返回值是下面值中的一个:

  • undefined : 值未定义
var arg1;
var arg2 = undefined;
var arg3 = void 0;
  • boolean : 值是布尔值
var arg1 = true;
var arg2 = false;
  • string : 值是字符串
var arg1 = '';
var arg2 = 'false';
  • number : 值是数值
var arg1 = 123;
  • object : 值是对象或 null
var arg1 = new Object();
var arg2 = null;
  • function : 值是函数
function func() {}
console.log(typeof func); // function

注意:typeof 操做符后面的内容能够是变量,也能够是字面量。

var str = 'test';
console.log(typeof str); // 变量
console.log(typeof 'test'); // 字面量

4-2 Undefined 类型

Undefined 类型中只有一个值:undefined。Undefined 类型存在的做用就是比较。不管什么状况下,都没有必要把一个变量的值,显示指定为 undefined

变量在声明的时候没有初始化,那么默认该变量的值就是 undefined

var arg;
console.log(arg === undefined); // true

还没有声明的变量,只能执行一项操做,就是检测该变量的数据类型。

console.log(typeof name); // undefined

因为声明为初始化和未声明的变量,经过 typeof 操做符获得的结果相同,所以在变量初始的时候,通常给其赋初始值,这样,在使用 typeof 操做符的时候,就能判断该变量是否是未声明的变量。

4-3 Null 类型

Null 类型中只有一个值:nullnull 表示的是空对象指针,所以,使用 typeof 操做符获得的结果是 object

var arg = null;
console.log(arg); // null

若是定义的变量,未来用来保存对象,那么就在定义的时候,初始化为 null

var obj = null; // 保存对象的引用

undefined 派生自 null,所以,在相等测试中返回 true

console.log(null == undefined); // true

4-4 Boolean 类型

Boolean 类型中有两个值:truefalse

Boolean 能够将其余数据类型转成 Boolean 类型,转换规则以下:

数据类型 true false
Boolean true false
String 任意非空字符串 ""(空字符串)
Number 任意非零数字 0和NaN
Object 任意对象 null
Undefined 不适用 undefined

使用方式:

Boolean('string') // true

在流程控制语句中,会自动执行 Boolean 进行转换:

var str = 'test';
if(str){ // 至关胡 if(Boolean(str)){
  console.log(123)
}

4-5 Number 类型

Number 类型使用 IEEE754 来表示整数和浮点数。

认识不一样的进制:

  1. 十进制:0-9表示,逢10进1
  2. 八进制:0-7表示,逢8进1
  3. 十六进制:0-9和A-F表示,逢16进1
var num1 = 12; // 十进制
var num2 = 014; // 八进制,以0开头
var num3 = 0x12; // 十六进制,以0x开头

无效的八进制会自动解析成十进制:

var num = 029; // 因为八进制中没有9,会自动解析成十进制的29

在严格模式下定义八进制的数字会报错:

'use strict';
var num = 017; // SyntaxError: Octal literals are not allowed in strict mode.

浮点数的组成:存在小数点,小数点后面存在数字。

var num1 = 0.1; // 浮点数
var num2 = .2; // 虽然小数点以前能够没有数字,可是不推荐这种写法

浮点数占用的内存是整数的两倍,所以,ECMAScript 会把小数点后面没有数字或数字为0的浮点数转成整数来节约内存。

var num1 = 1.;  // 解析成 1
var num2 = 1.0; // 解析成 1

能够用科学计数法表示很大的值或者很小的值:

var num1 = 3.123e10; // 可使用e,也可使用E
var num2 = 3.123e-10; // 表示小数

ECMAScript 可以表示的最大值 Number.MAX_VALUE 和最小值 Number.MIN_VALUE。能够经过 isFinite() 方法判断数值是否在 ECMAScript 可以表示的数值范围以内。

console.log(isFinite(123)); // true

超出这个可表示的范围的值,就是正无穷(Number.POSITIVE_INFINITY)和负无穷(Number.NEGATIVE_INFINITY)了。无穷大(Infinity)是不能参与运算的值,所以,若是有一个值的结果是无穷大,那么计算获得的值还是无穷大。

console.log(Number.POSITIVE_INFINITY + 1) // Infinity

NaN 是一个比较特殊的值,这个数值用来表示,原本应该返回数字的值,而最终的结果没有返回数值。

2/0 // NaN

NaN 和任何数值进行运算,获得的结果都是 NaN。

NaN + 1 // NaN

须要注意的是 NaN 和任何值都不相等,包括和本身自己。

console.log(NaN == NaN);  // false
console.log(NaN === NaN); // false

可使用 isNaN 函数来判断一个数是否不是数字,规则:若是参数能转成数字,返回 false;若是参数不能转成数字,返回 true。

isNaN(NaN) // true
isNaN(true) // false

4-6 数值转换

把非数值转成数值,有三个函数可使用:

  • Number() : 将任意数值类型转成数字
  • parseInt() : 将字符串转成整数
  • parseFloat() : 将字符串转成浮点数

Number() 方法

1.布尔类型:

Number(true)  // 1
Number(false) // 0

2.数值类型: 原样输出

Number(12)   // 12
Number(12.3) // 12.3

3.Null类类型:

Number(null) // 0

4.字符串:

Number('123')    // 123,数字会转成对应的十进制的值
Number('+123')   // 123
Number('-123')   // -123
Number('123.12') // 123.12
Number('')       // 0,空字符串结果为0
Number('0xf')    // 十六进制对应的十进制
// 其他字符串转成 NaN

使用一元加操做符,获得的结果和 Number 函数的结果相同

+'' // 0

parseInt() 方法

该方法在转换成数值类型的时候,会有下面的操做:

  1. 首先检查字符串开头的字符是不是 '+' '-' 空格 数字,若是不是,则转成 NaN
  2. 若是是,则检查到第一个不为数字的字符为止,中间的内容转成数字
parseInt('123')      // 123
parseInt('  12.012') // 12
parseInt('a12')      // NaN

该方法能够指定第二个参数,表示第一个参数是哪一种进制的数值字符串:

parseInt('12', 8) // 10,12是八进制值,转成十进制就是10

parseFloat() 方法

该方法在转换成数值类型的时候,会有下面的操做:

  1. 首先检查字符串开头的字符是不是 '+' '-' 空格 数字 小数点,若是不是,则转成 NaN
  2. 若是是,则检查到第一个不为数字或小数点的字符为止,中间的内容转成数字
  3. 注意:若是字符串以小数点开头,那么到第二个小数点的位置为止,中间的值做为浮点数
parseFloat('.12')  // 0.12
parseFloat('.12.') // 0.12
parseFloat('+.12') // 0.12
parseFloat('a.12') // NaN

这个方法没有第二个参数。

4-7 String 类型

String 类型用于表示由零个或多个16位 Unicode 字符组成的字符序列,即字符串。字符串能够由引号(单引号或双引号均可以)括起来表示。

'这是一个由单引号括起来的字符串'
"这是一个由双引号括起来的字符串"

转义字符:

字面量 含义
\n 换行
\t 制表符
\b 空格
\r 回车
\\ 斜杠
\' 单引号
\" 双引号
\xnn 以十六进制代码nn表示一个字符,如\x41表示'A'
\unnnn 以十六进制代码表示一个 Unicode 字符

字符串的特色:

字符串一旦建立,值就不能改变。若是要改变,须要从新开辟内存,建立字符串,而后更新变量的指向。

转成字符串:

除了 null 和 undefined,每一个数据类型都有 toString,所以,可使用 toString 方法转成字符串。

123..toString()  // '123',第一个点会被解析成小数点,第二个才是调用方法的操做符
(123).toString() // '123'

toString 的第二个参数用来指定转成数字的基数。

12..toString(2) // 转成二进制

若是对 null 和 undefined 使用 toString 方法会报错:

undefined.toString() // TypeError: Cannot read property 'toString' of undefined
null.toString()      // TypeError: Cannot read property 'toString' of null

一种更增强大的转换成字符串的方法 String,能够接收 null 或 undefined,做为参数;同时也能够接收其余数据类型做为参数。

console.log(String(null));      // null
console.log(String(undefined)); // undefined

一种更简单的转成字符串的方式是,将数值类型与空字符串相加:

123 + ''  // '123'
null + '' // 'null'

4-8 Object 类型

建立 Object 实例的方式,能够经过构造函数的形式建立:

var obj = new Object();

若是构造函数中没有传递参数,那么能够省略括号:

var obj = new Object; // 这种方式不推荐

每一个 Object 实例都有下面的属性和方法:

  • Constructor : 构造函数,用于建立对象的函数
  • hasOwnProperty(propertyName) : 检查实例中是否包含某个属性,不是实例原型上的属性
  • isPrototypeOf(object) : 检查传入的对象是不是另外一个对象的原型
  • propertyIsEnumerable(propertyName) : 属性可否使用 for-in 语句进行遍历
  • toLocalString : 转成与本地运行环境相匹配的字符串
  • toString : 返回对象的字符串表示
  • valueOf : 返回对象的字符串、数值或布尔值的表示

这些内容做为记忆,在后续的章节会有对这些内容的详细解释。

相关文章
相关标签/搜索