JavaScript,第一天

173 阅读6分钟

这是我参与8月更文挑战的第6天,活动详情查看: 8月更文挑战

一、变量声明和语法规范

1.特点

解释型语言,编译一行执行一行

弱类型语言

基于对象

跨平台

JavaScript严格区分大小写

分为单行注释(//...)和多行注释(/.../)

2.变量

虽然不写关键字也可以声明变量

var/const/let

var声明的变量会挂载在window上,而letconst声明的变量不会

var声明变量存在变量提升,letconst不存在变量提升

letconst声明形成块作用域

同一作用域下letconst不能声明同名变量,而var可以

暂存死区

/*
*   1、一旦声明必须赋值,不能使用null占位。
*
*   2、声明后不能再修改
*
*   3、如果声明的是复合类型数据,可以修改其属性
*
* */
var a = 100;

if(1){
    a = 10;
    //在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
    // 而这时,还未到声明时候,所以控制台Error:a is not defined
    let a = 1;
}
1)变量的命名

变量名称可以由字母,数字,下划线,美元符号组成,不能以数字开头,不能使用关键字或者保留字。

username user_name 下划线命名 userName 驼峰命名(推荐)

2)变量的赋值

变量声明后可以不赋值,此时的值是undefined,未定义,可以多次赋值,并且赋不同类型的值,也是弱类型语言的特点。

3)一次声明多个变量

多个变量可以用逗号隔开

 var a=1,b=2,c;

二、数据类型

分为原始类型和引用类型

原始类型分为数值型、字符串型、布尔型、未定义型、空

1.原始类型

1)数值型

分为整型和浮点型

typeof 检测数据的类型

整型:

8进制 以0开头的数字

16进制 以0X开头的数字,af表示1015,不区分大小写

浮点型:

3141.5e-1

314.15

31.415e+1

3.1415e+2

2)字符串类型

被引号所包含的数据

查看任意一个字符的Unicode码

'a'.charCodeAt()

console.log('a'.charCodeAt())
3)布尔类型

只有两个值,分别是true 和 false,代表真或者假

比较运算的结果也会得到布尔型的值

4)未定义型

只有一个值undefined,声明变量未赋值结果为undefined

5)空

只有一个值null,常和引用类型的数据一起使用

2.数据类型转换

分为隐式转换和强制转换

1)隐式转换

加号(+)的作用 执行数值间的加法运算 执行字符串间的拼接

隐式转换为数值会自动调用Number函数

//数值+字符串
2 +'3'     //'23'
//数值+布尔型 布尔型转为数值 true=1 false=0
2 + true   //3
//字符串+布尔型 布尔型转为字符串
'2' + true //'2true'

例:

var a = 1,b = true,c='2';
a + b + c//'22'
b + c + a//'true21'
c + a + b//'21true'
2)强制转换

NaN: Not a Number 不是一个数字 将数据转数值的时候,没有成功的转为数值,返回NaN NaN和任何值执行运算结果还是NaN

(1)强制转为数值型

关键字:Number

Number('2')  	   //2
Number('2a')  	   //NaN
Number(true)  	   //1
Number(undefined)  //NaN
Number(null)   	   //0
(2)强制转为整型

关键字:parselnt

通常用于将字符串和小数转为整型,其它转换返回NaN

parseInt(3.14)  //3
parseInt('6.7a') //6
parseInt('a6.7') //NaN
(3)强制转为浮点型

关键字:parseFloat

通常用于将字符串转为浮点型,其它转换返回NaN

parseFloat('3.14a')  //3.14
parseFloat('a3.14')  //NaN
parseFloat('3a')    //3
(4)数值和布尔型强制转为字符串(了解)
var n=10;
var s=n.toString(2)// 转为字符串同时,可以设置进制

3.运算符

1)算术运算符
+  -  *  /   %   ++   -- 
%  取余
++  自增,在原来基础之上加1
--  自减,在原来基础之上减1
2)比较运算符

NaN和任何值比较(包括NaN本身)结果都是false

 >   <   >=   <=   
 ==(等于)  !=(不等于)   
 ===(全等于)   !==(不全等于)
3)逻辑运算符
&&  逻辑与(并且),关联的两个条件都是true结果是true,否则false
||   逻辑或(或者),关联的两个条件有一个为true结果是true,否则false
!   逻辑非(取反)

&& 当第一个条件为false的时候,不再执行第二个条件

|| 当第一个条件为true的时候,不再执行第二个条件

var  a = 5;
a>10 && console.log(b);
a<6 || console.log(c);
4)赋值运算符

运算赋值:先执行运算符,然后在执行赋值

 =     +=   -=   *=   /=   %=  ...
5)三目运算符

一目运算符,由一个运算符连接的一个表达式 ++ -- !

二目运算符,由一个运算符连接的两个表达式 + - * ...

三目运算符,由两个运算符连接的三个表达式

条件表达式 ? 表达式1 : 表达式2

如果条件表达式为true,执行表达式1

如果条件表达式为false,执行表达式2

4.浏览器端函数

alert();//弹出警示框
prompt();//弹出提示框(输入框)

5.流程控制

1)if语句
if(条件表达式){
    语句块;//结果为ture执行语句
}
2)if-else
if(条件表达式){
    语句块;
}else {
    语句块;////上面的执行不匹配,进行的语句
}
3)if-else嵌套

if-else可以一直写下去

if(条件表达式)
{
    语句块;
}
else if(条件表达式){
    语句块;
}else{
    语句块;
}
4)switch-case语句
switch(表达式){
       case1:
       	语句块 1break;
       caseN:
       	语句块 N;
       	break;
       default:
       	语句块n+1;//表达式和每个值进行比较只要匹配到一个,就执行后面的break进行结束
       }
5)递归
//创建函数,计算斐波那契数列第n项的值
function fib(n){
  //第1项和第2项的值都是1
  var n1=1,n2=1;
  //如果要求第n项的,只需要让n1和n2不断的往后挪动,挪动结束后,n2的值就是所求项的值
  //每次挪动从3开始,表示循环从3开始
  for(var i=3;i<=n;i++){
    //挪动的原理:n1的值是上一次n2的值,n2的值是上一次n1和n2相加的和
	var c=n1;
    n1=n2;
	n2=c+n2;
  }
  //挪动结束后,n2的值就是所求项的值
  return n2;
}

function getSum(n){
  //结束条件:当n为1的时候,返回1
  if(n===1){
    return 1;
  }
  //前n个数的和,等价于n + 前n-1项的和
  return n+getSum(n-1);
}
var r=getSum(100);

//练习:使用递归计算斐波那契数列第n项的值(20,40,50,70)
function fib(n){
  //结束条件:当n为1或者n为2的时候,返回1
  if(n===1 || n===2){
    return 1;
  }
  //第n的值,等价于第n-1项+第n-2项
  return fib(n-1) + fib(n-2);
}