1. 基本语法
- 执行单位为行(line),每一行为一个语句,用分号隔开
- 表达式目的是返回一个值,不需要加分号
- 变量名区分大小写
- 声明一个变量用var语句
- 没有赋值的变量值为underfined
- 不用var创建变量,语句也有效,但是容易创建全局变量,不利于表达意图
js是一个动态类型语言,变量可以随时更改类型
相对比,java就是静态语言,数据类型需要提前指定,且不可变,否则报错
var a = 1; a = 'hello';
- 变量第二次赋值时,不再需要var命令;覆盖掉之前的值
- 变量提升:JS引擎先解析代码,把所有被声明的变量提到代码头部,然后再一行一行运行(变量提升hoisting),函数名好像也提升?
实际操作中,理论上可以先写语句再定义变量,但一般都会提前定义变量
- 标识符大小写敏感
- 标识符规则:第一个字符,unicode字母(包括中文汉字,但不推荐),美元符号,下划线;第二个字符还可以使用数字0-9
var 临时变量 = 1;
- 注释:两种注释
// 这是单行注释
/*
这是
多行
注释
*/
注:JS还兼容html的注释 ,也可以作为合法单行注释
- 大括号{},将多个相关的语句组合在一起,称为“区块”(block);但对Var命令来说,JS的区块不构成单独的作用域(scope)。JS的区块也就用来构成一些复杂的语法结构,例如循环,函数等。
- 赋值表达式(=)、严格相等运算符(=== ) 和相等运算符(==);为避免写错这三种运算符,在使用相等时(优先严格相等运算符)将常量写在运算符左边,这样如果写成赋值表达式,会报错
- if;if else;switch结构
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// 所有case都不符合,就执行Default
}
- switch举例
switch (1 + 3) {
case 2 + 2:
f();
break;
default:
neverHappens();
//需要注意的是,switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。
}
- 三元运算符
(条件) ? 表达式1 : 表达式2
;如果条件为TURE,执行表达式1;否则执行2 - while;for;循环
- break语句:用于跳出代码块或循环。
- continue语句:用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
- 标签的使用:格式;通常和break语句和continue语句配合使用,跳出特定的循环
label:
语句
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) continue top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2
- 关键字总结
关键词 描述
break 终止 switch 或循环。
continue 跳出循环并在顶端开始。
debugger 停止执行 JavaScript,并调用调试函数(如果可用)。
do … while 执行语句块,并在条件为真时重复代码块。
for 标记需被执行的语句块,只要条件为真。
function 声明函数。
if … else 标记需被执行的语句块,根据某个条件。
return 退出函数。
switch 标记需被执行的语句块,根据不同的情况。
try … catch 对语句块实现错误处理。
var 声明变量。
name: - 三种变量命名习惯
连字符:first-name(JS中不能用,为减法预留)
下划线:first_name(不推荐)
驼峰大小写(Camel Case):FirstName,LastName.(推荐JS使用)
2. 数据类型
2.1 简介
- 7种数据类型,数值(number);字符串(string);布尔值(boolean);underfined(未定义);null(空);object(各种值组成的集合);Symbol(ES6新增,不考虑);
数组(array),函数,以及狭义的对象都包含在object中
- number,string,boolean一般称为原始类型(primitive type)
- 对象则称为合成类型(complex type),因为往往是多个原始类型的值的合成。可以分为三个子类型
狭义的对象(object)
数组(array)
函数(function)
- 我们一般说的就是狭义的对象;函数其实是处理数据的方法,JS把他作为一种数据类型,可以赋值给变量,使得编程更加灵活,也奠定了函数式编程的基础
- 三种确定某一个值的数据类型的办法
typeof运算符
instanceof运算符
Object.prototype.toString方法
- typeof的使用
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {
}
typeof f
// "function"
v
// ReferenceError: v is not defined
typeof v
// "undefined"
typeof window // "object"
typeof {
} // "object",
typeof [] // "object",数组是特殊的对象
typeof null // "object",历史原因,为了兼容之前代码,故未更改
//实际编程中,这个特点多用在判断语句中
2.2 null,underfined和布尔值
- null表示空值
- underfined表示未定义
- 布尔值往往用于程序流程的控制
if ([]) { console.log('true'); } // true if ({ }) { console.log('true'); } // true
- 下列运算会返回布尔值
前置逻辑运算符: ! (Not)
相等运算符:=== ,! = =,==,!=
比较运算符:>,>=,<,<=
- 如果JS预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面6个值转为 false,其他都转为 true 。
undefined
null
false
0
NaN
""或’’(空字符串)
2.3数值
- JS内部,所有数字都是以64位浮点数形式存储,即使整数也是如此
- 对于只能整数才能完成的运算,JS会把64位浮点数转成32位整数
- 数值精度
国际标准IEEE 754,JS浮点数位64个二进制位,从最左边开始
第一位符号位,0表示正数,1表示负数
第2-12位(共11位):指数部分,决定数值的大小
第13-64位(共52位):小数部分(有效数字)决定了数值的精度
具体:(-1)^符号位 * 1.xx...xx * 2^指数部分
- 按标准,有效数字这时总是1.xx…xx的形式,其中xx…xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript
提供的有效数字最长为53个二进制位。
这意味着,绝对值小于2的53次方的整数,即-253到 253,都可以精确表示。再大的数,精度无法保证 - 数值范围
指数部分最大为2047(2的11次方-1),分出一半负数,则JS能够表示的数值范围是21024到2-1023(开区间),超出这个范围的数无法表示。
如果一个数大于21024,那么就会发生“正向溢出”,这时返回Infinity
如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0。
JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
- 数值的表示法
字面形式直接表示
科学计数法,利用e或E来表示数值的指数部分
小数点前数字多于21位,小数点后的零多于5个,会直接转变为科学计数法
- 数值的进制(整数有4种)
十进制:没有前导0的数值。
八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
十六进制:有前缀0x或0X的数值。
二进制:有前缀0b或0B的数值。
- 默认情况,JS会把其他进制转为十进制; 通常0前导,认为为八进制,但是如果前导0后边有数字8和9,则该数值被视为十进制.
0888 // 888(十进制)
0777 // 511(八进制)
- 特殊数值
+0和-0在做分母时,返回的值会有不同;除以正零得到+Infinity,除以负零得到-Infinity
Infinity:无穷
NaN,是JS的特殊值,表示非数字,主要出现在将字符串解析成数字出错的场合。不是独立的数据类型,仍然是number类型中的一个特殊值。使用typeof运算符可以验证。
运算规则
- NaN不等于任何值,包括它本身
- 布尔运算中,NaN当作false
- NaN与任何数(包括它自己的运算,得到的都是NaN)
- 与数值相关的全局方法
parseInt:方法用于将字符串转为整数。
parseInt('123') // 123
parseInt(' 81') // 81
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt(