1.JS版本
历史版本:
- ES3,IE6支持,总体评价:垃圾
- ES5,还是垃圾
- ES6,大部分浏览器支持,总体评价:一半垃圾(由于需要兼容旧版本),一半好
- ES2019与ES6差别不大
2.JS语法
2.1表达式与语句
表达式:
- add(1,2)表达式的值为函数的返回值
- console.log表达式的值为函数本身
注意:
- 表达式是大小写敏感的。
function与Function是不相同的,Object与object也是不相同的。 - JS中的大部分空格与回车是没有实际意义的。但是只有一个地方不能加回车,举例:
可以看到,在return语句后面加上回车,会对结果产生影响。
2.2 JS标识符命名规则
- 1.首字符可以是
Unicode字母或$或_或中文 - 2.后面的字符,除了上面所说的,还可以是数字
2.3 JS注释
//注释当前行/* 多行内容 */注释多行内容
2.4 if语句
- 语法:
if(表达式){语句1}else{语句2} - 特殊情况:1.
if (a=1),a=1的结果是为ture
2.5 switch语句
- 语法:
switch (fruit){
case "banana":
//
break;
case "apple":
//
break;
default:
//
}
- 注意:与Java一样,switch中的break不能省略。举例说明:
var a = 1;
switch(a) {
case 1:
console.log("数据是1");
case 2:
console.log("数据是2");
break;
}
结果:
2.6 三元表达式
与Java中表达的意思一致,写法:表达式1?表达式2:表达式3
2.7 逻辑运算符
&&与(存在短路特性) 举例:
console && console.log && console.log("XXX") /* ie中不存在console */
||或(存在短路特性) 举例:
a = a || 100; /* 100-保底值*/
!非
2.8 循环语句
while循环 语法:while(表达式){语句},表达式为真,执行语句,执行完再判断表达式。表达式为假则执行语句后的内容。特殊情况:
var a = 0.1;
while(a !== 1){
console.log(a);
a = a + 0.1;
}
由于浮点数的精度问题,上面的代码会造成死循环。
for循环 语法:for(语句1;表达式2;语句3){循环体},先执行语句1,然后判断表达式2,为真则执行循环体,然后执行语句3,为假则跳出循环。特殊情况:
for(var i = 0;i < 5;i++){
setTimeout(()=>{console.log(i)},0)
}
打印的结果为5个5:
这种情况下可用
let i = 0解决,如下图:
break和continue分别为跳出循环和跳出一次循环。
3.JS数据
JS中的8种基本数据类型:(不区分大小写)数字 number | 字符串 string | 布尔 bool | 符号 symbol | 空 undefined | 空 null | 对象 object | 整数 bigint
3.1 number
- 整数写法
1 - 小数写法
0.1 - 科学计数法
1.23e4 - 二进制写法
0b11或0B11 - 八进制写法
0123|00123|0o123 - 十六进制写法
0X3F或OX3F特殊值: - 正零负零,都为零
- 无穷大:
Infinity | +Infinity | -Infinity - 无法表示的数字:
NaN(Not a Number) -- 不能表示数字,但还是数字
存储:
JS数字的存储形式是64位的浮点数的形式存储,浮点数就是浮动的点,小数点会浮动。
- 符号占一位
- 指数占11位(-1023~1024)
- 有效数字占52位 范围(忽略符号位)
- 指数最大,有效数字最大,得到最大二进制数字:
Number.MAX_VALUE(1.7976931348623157E+308 = 2^1024-1) - 指数负方向拉满,有效数字为1:
Number.MIN_VALUE(5E-324 = 2^-1023)
精度(有效数字)
- 最多只能到52+1个二进制位表示有效数字,有效数字超过2^53,则不能正确表示。如下图:
3.2 string
写法:
- 单引号:
'你好' - 双引号:
"你好" - 反引号:`你好`
如果需要在字符串包括引号,则需要转义:
转义:用另一种写法表示想要的内容:
-
\"表示" -
\n表示换行 -
\r表示回车 -
\t表示tab制表位 -
\\表示\ -
\uFFFF表示对应的Unicode字符 字符串的属性
长度(stirng.length): -
'123'.length //3 -
'\n\r\t'.length //3 -
''.length //0 -
' '.length //1下标
index从0开始,并且index为length时,不会像Java那样报错。
base64转码 -
window.btoa -- 正常字符串转为Base64编码的字符串
-
window.atob -- Base64编码的字符串转为正常字符串
3.3 bool
只有两个值:true | false (注意区分大小写)。
注意:JS中的五个falsy值:
falsy就是相当于false但是又不是false的值,分别是undefined null 0 NaN '' ,除了这5个值之外,其他值都是true
3.4 null和undefined
- 首先:二者没有本质上的区别
- 细节1:一个变量声明了但是没有赋值,那么就是undefined,而不是null;
- 细节2:一个函数,没有写return,那么默认retuen为undefined,而不是null;
- 习惯上:把非对象的空值写为undefined,把对象的空值写为null;
3.5 symbol
基本不用
3.6 bigint
几个月前新出的,所以基本上用不到,有需要的可以去bigint -- mdn学习。
4. 变量的声明
变量声明的三种方式:
- var a = 1;
- let a = 1;
- const a = 1; 三者区别:
- var是过时的、不好用的方式
- let是新的,更合理的方式
- const是声明时必须赋值,且不能修改的方式 注意:变量声明的时候,类型也指定了。
4.1 var
var-不推荐使用
4.2 let
规则:
- 遵循块作用域,即使用范围不能超出{}
- 不能重复声明
- 可以赋值,也可以不赋值
- 必须先声明再使用,否则报错
- 全局声明的
let变量,不会变成window的属性。但是使用var声明的变量,就会变成window的属性。
4.3 const
规则:
- 跟
let几乎一样 - 区别之处在于:
const声明之时就要赋值,赋值后不能更改
4.4 类型转换
- number => string
1.String(n) | 2. n+'' - string => number
1.Number(s) | 2.parseInt(s) /parseFloat(s) | 3.s - 0注意:
1.parseInt()方法,默认转换为10进制数字,但是可以通过第二个参数指定,举例:
2.
stirng => number时,超过二十位数时,会采用科学计数法存储。如下图:
3.
Number直接采用toString()方法转换为string时会出错: