这是我参与8月更文挑战的第6天,活动详情查看: 8月更文挑战
一、变量声明和语法规范
1.特点
解释型语言,编译一行执行一行
弱类型语言
基于对象
跨平台
JavaScript严格区分大小写
分为单行注释(//...)和多行注释(/.../)
2.变量
虽然不写关键字也可以声明变量
var/const/let
var
声明的变量会挂载在window
上,而let
和const
声明的变量不会
var
声明变量存在变量提升,let
和const
不存在变量提升
let
和const
声明形成块作用域同一作用域下
let
和const
不能声明同名变量,而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(表达式){
case 值1:
语句块 1;
break;
case 值N:
语句块 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);
}