这篇笔记的内容对应的是《JavaScript高级程序设计(第三版)》中的第三章。javascript
ECMAScript 中的一切都是区分大小写的。java
test
和 Test
首字母不一样,那么它们就不相同typeof
和 typeOf
中间有个字母大小写不一样,那么它们也不相同认识标识符函数
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
注释的方式有两种:debug
// 单行注释
/** * 多行注释 */
ECMAScript5 中引入了严格模式的概念。设计
"use strict";
严格模式能够在文件中使用,也能够在函数中使用。若是要在整个文件中使用严格模式,就要在文件顶部添加编译指令;若是要让函数在严格模式下执行,要在函数体中增长编译指令。指针
"use strict"; // js文件中的其余代码
function func(){ "use strict"; // 函数体 }
语句通常以分号结尾。
var num = 123;
结尾分号不是必须的,若是没有分号,以解析器肯定语句的结尾。
var num = 123
语句结尾手动增长分号的好处:
推荐语句的结尾使用分号
关键字在 ECMA-262 中具备特定的用途,通常用于:
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 |
关键字和保留字不能用做标识符
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'
ECMAScript 中有 5 种简单的数据类型和 1 种复杂的数据类型。
Undefined
Null
Boolean
Number
String
Object
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
: 值是对象或 nullvar 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'); // 字面量
Undefined 类型中只有一个值:undefined
。Undefined 类型存在的做用就是比较。不管什么状况下,都没有必要把一个变量的值,显示指定为 undefined
。
变量在声明的时候没有初始化,那么默认该变量的值就是 undefined
。
var arg; console.log(arg === undefined); // true
还没有声明的变量,只能执行一项操做,就是检测该变量的数据类型。
console.log(typeof name); // undefined
因为声明为初始化和未声明的变量,经过 typeof 操做符获得的结果相同,所以在变量初始的时候,通常给其赋初始值,这样,在使用 typeof 操做符的时候,就能判断该变量是否是未声明的变量。
Null 类型中只有一个值:null
。null
表示的是空对象指针,所以,使用 typeof 操做符获得的结果是 object
。
var arg = null; console.log(arg); // null
若是定义的变量,未来用来保存对象,那么就在定义的时候,初始化为 null
。
var obj = null; // 保存对象的引用
undefined
派生自 null
,所以,在相等测试中返回 true
。
console.log(null == undefined); // true
Boolean 类型中有两个值:true
和 false
。
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) }
Number 类型使用 IEEE754 来表示整数和浮点数。
认识不一样的进制:
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
把非数值转成数值,有三个函数可使用:
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() 方法
该方法在转换成数值类型的时候,会有下面的操做:
'+'
'-'
空格 数字,若是不是,则转成 NaNparseInt('123') // 123 parseInt(' 12.012') // 12 parseInt('a12') // NaN
该方法能够指定第二个参数,表示第一个参数是哪一种进制的数值字符串:
parseInt('12', 8) // 10,12是八进制值,转成十进制就是10
parseFloat() 方法
该方法在转换成数值类型的时候,会有下面的操做:
'+'
'-'
空格 数字 小数点,若是不是,则转成 NaNparseFloat('.12') // 0.12 parseFloat('.12.') // 0.12 parseFloat('+.12') // 0.12 parseFloat('a.12') // NaN
这个方法没有第二个参数。
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'
建立 Object 实例的方式,能够经过构造函数的形式建立:
var obj = new Object();
若是构造函数中没有传递参数,那么能够省略括号:
var obj = new Object; // 这种方式不推荐
每一个 Object 实例都有下面的属性和方法:
hasOwnProperty(propertyName)
: 检查实例中是否包含某个属性,不是实例原型上的属性isPrototypeOf(object)
: 检查传入的对象是不是另外一个对象的原型propertyIsEnumerable(propertyName)
: 属性可否使用 for-in 语句进行遍历toLocalString
: 转成与本地运行环境相匹配的字符串toString
: 返回对象的字符串表示valueOf
: 返回对象的字符串、数值或布尔值的表示这些内容做为记忆,在后续的章节会有对这些内容的详细解释。