JS语法

198 阅读2分钟

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解决,如下图:

  • breakcontinue 分别为跳出循环和跳出一次循环。

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) -- 不能表示数字,但还是数字

存储:
\quad 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字符 字符串的属性
    \quad 长度(stirng.length):

  • '123'.length //3

  • '\n\r\t'.length //3

  • ''.length //0

  • ' '.length //1 下标
    \quad index从0开始,并且index为length时,不会像Java那样报错。
    base64转码

  • window.btoa -- 正常字符串转为Base64编码的字符串

  • window.atob -- Base64编码的字符串转为正常字符串

3.3 bool

只有两个值:true | false (注意区分大小写)

注意:JS中的五个falsy值:
\quad 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时会出错:

5.参考文档