软件:多条程序组成,可以实现一定功能
程序:多条指令组成
数据结构:储存数据的方式
机器语言
计算机语言
汇编语言
高级语言(1.编译性语言:整体翻译然后实现 2.解释性语言:单个翻译单个实现)
程序设计步骤
1.软件计划
2.需求分析设计
3.软件的设计(数据结构,算法)
4.软件的实现
5.软件的测试
6.运营和维护
错误(报错)
语法错误:没有按照要求的书写格式来书写.
逻辑错误:语法正确,能实现,只是实现的东西不对.
例:需求A+B 实现:A-B
运行错误:语法和逻辑正确,单程序运行一段时间后报错
例:1.死循环 2.输出内容增加
算法
定义:解决问题的方法和步骤
含义:解决问题 他是一个过程不是目的 符合开发思维
特点:
1.有效性.a除以b .b不能是0
2.有穷性.解决问题的步骤是有限的
3.确定性.在判断的时候给定明确目标,不能是模糊的.
4.零到多个输入
5.一到多个输出
流程图
流程线:带箭头的线
起止框:椭圆
输入框:平行四边形
执行框:矩形
判断框:菱形
ECMA script
ES5 ECMA spcript5 版本
ES6
js基础
js语句
如何判断一条语句的结束
判断条件"分号(😉"
书写格式
关键词 标识符 运算符 表达式 分号
标识符:变量
表达式:可以得到结果的公式
标识符命名规则
硬性要求
- 不能数字开头
- 可以包含:数字,字母,下划线,美元符号($) 不能包含其他字符
- 不能使用Javascript的关键字和保留字
- 大小写敏感
软性要求
- 望文知意
数据类型
1.基本数据类型
数值:Number
1.整数
2.浮点数
3.NaN NaN和任何数据对比都是false,包括自己
判断是不是非数字 isNaN(数据,变量);
字符型:String (有引号就是字符)
布尔型Boolean: True False
可以隐性转换成1和0;在console.log(isNaN(true));中输出false;
console.log(isNaN(“123”));同上;
空:null 值为null的时候,返回数值类型为Object 和0比较==时返回false
isNaN(null)返回true. null会转换为0
Undefined:undefined 是由null衍生来的,和null比较==时返回true.
1.标识符声明了,但是没有赋值 (不是报错)
2.输出没有声明的变量的数据类型
Symbol(对象时讲解)
2.引用数据类型
Object
输出当前标识符数据类型
控制台输出
console.log(typeof 标识符);
终端 node 文件名字(记得后缀名)
标识符
变量
- 声明变量
ES5格式
关键词 标识符 分号
var 名字 ;
ES6格式
let 名字 ;
const 名字 ;
var和let/const的区别
var声明的变量可以重复
let/const声明的变量不可以重复
let和const的区别
let是变量
const是常量,声明了一定要给值,不然报错.赋值之后不能更改(仅限于基础数据类型,复杂数据类型还是可以变)
f68=1 会补关键字var
如果只写f68,没有赋值就不会补.
let f68=10;
{
console.log(f68);
let f68=3;
}
报错未声明f68
原因:先使用用后声明
如果在局部作用域中,先使用了一个变量,后面用let或者const才声明该变量则会无视全局变量,生成暂时性死区
let f68=10;
{
f68=5
console.log(f68);
}
console.log(f68);
输出5和5. f68=5在修改全局变量的值(把10改成了5)
“+” 如果左右都是数值,则是加法,如果不是那就是拼接
let f68=1+2+3+“4”+5;
console.log(f68);
输出的是645
字符串前面是算术运算,从字符串开始往后都是拼接.
任何东西和字符串+都是拼接
let name=“cwg”;
let age=20;
let gender=“男”;
// console.log(“大家好,我是”+name+",年龄:"+age+",性别:"+gender);
console.log(大家好,我是${name},今年${age}岁,性别${gender}.
)
内容用``(不按shift的~键)包括,变量${变量}.
字符串中,空格不合并.
只有字符串才有.length属性
纯数字字符串减零可以变为数值
“0”+数值可以变为字符串
字符型一般都是true 只有空的" " 和空的’ ’ 和空的``是false(不能有空格)
数值中只有0和-0和NaN会转换为false 其他的都会转化为true
null和undefined也是false
运算符
算数运算符
二元运算符
+,-,*,/
%:取余
// i ** 100 意思为i的100此方.
一元运算符
++ 自增
– 自减
i++先使用,再自增
++i先自增,再使用
f68+=1 意思是f68=f68+1
三目运算符
书写格式:
条件?表达式1:表达式2;
功能
条件为真,执行表达式1
条件为家,执行表达式2
比较运算符 得到的结果永远是布尔(Boolean)值
大于>
小于<
等于==
不等于!=
大于等于>=
小于等于<=
绝对等于=== 值和类型都要相等才是true
不绝对等于!== 值和类型不相等才是true
逻辑运算符 得到的是布尔值(Boolean)
&& 并且 一假全假
|| 或者 一真全真
! 非 取反
位运算符
& |
安位进行转换
懂不起 了解
字符串与字符串比较,安位比较阿斯克码.不会转换
console.log(“100”>“80”) 返回false 8的阿斯克码大于1的
数据转换
let i=number(K);强制转换K为数值.
let i=parseInt(K);取整(从第一位开始找,一直到不是数字的一位,之前的数字全部获取.
let i=parseInt(“1 9”)获取到1,如果第一位是空格或者是0,或自动不看
parseInt特点:
- 获取第一个数字到第一个非数字的内容,如果第一位不是数字则返回NaN
- 第一个字符是0或者空格,自动无效
- 如果第一个不是数字,+,-,空格,返回NaN
使用场景:
取出单位 如:10000$.
取浮点数
let j=“123”;
let k=parseFloat(j);
console.log(k.toFixed(3));
toFixed(3)保留三位小数
Math.ceil()向上取整,取最近的大于我的整数(进一).
Math.floor()向下取整(舍一)
Math.round()四舍五入
let i=String(K);强制转换K为字符串.
let i=K.toString();K转换为字符串,括号中取值2-32.(多少进制) 默认是10进制
null和undefined不能使用toString 属性
快捷转换
字符(纯数字)- 0 (转Number) 如果不是纯数字会转换为NaN
非字符+""(String)
!!非布尔 转换为布尔(Boolean)
条件语句
适用场景
进行条件判断,根据不同的结果来执行相应的代码.
if语句
if(条件){
条件为真时执行的代码块
}else{
条件为假时执行的代码块
}
switch语句
书写格式
switch (匹配值){
case 表达式:
执行的代码块
break;
case 表达式:
执行的代码块
break;
case 表达式:
执行的代码块
break;
default:(没有匹配值时执行)
执行的代码块
}
工作原理:
匹配值与表达式去匹配(全等匹配)
匹配成功,则执行相应的的代码块
由于匹配成功后会一直往下执行下面的代码块直到switch最后,所以加break.
循环语句
使用场景
执行多次代码块,当条件不满足时,结束循环
书写格式:
while(条件){
代码块
}
先判断后执行
do{
代码块
}while(条件)
先执行 后判断(至少执行一次)
break:终止当前循环,后面的都不执行
continue:结束本次循环,直接进行下一次
数据结构
数组
一个标识符可以储存多个数据,可以不同类型
创建数组
-
字面量创建(声明)
格式 关键字 标识符 赋值符号(=) 中括号
let f68 = [];
-
构造函数创建
关键字 标识符 赋值符号 new Array();
let f68 = new Array();
使用数组的书写方式:名字[下标]
下标从0开始
f68[0]代表f68数组中的第一个值
下标超出就会返回undefined
名字.length 返回数组长度
属性和方法的区别看有没有()小括号;
查找数组中是否有某个值
名字.includes(值); 有返回true 没有返回fleas.
添加值
名字.push(值,值,值);可以在数组最后添加多个值
名字unshift(值,值,值);前面
数组.concat(添加内容)
添加的内容可以是数组
删除
名字.pop();只能删除最后一个值
名字.shift;只能删第一个
修改
f69=f68.slice(值,值)
不会修改原数组
可以只写一个值,一个值时代表此下标开始往后取完包括开始值
一个值时负数时,是从后往前取多少个值
-3 就是从后往前取3个值
两个值是之间的值,包括初始值,不包括结束值
两个负值,先把值和数组长度相加再取值.
不满足条件时,获取不到任何值.返回[]
f69=f68.splice(值,值,值)
会修改原数组
给两个值,
第一个值代表起始位置的下标
第二个代表个数
给三个值
第一个值代表起始位置下标
第二个:
为0时代表插入,插入到起起始位置的前面,修改第二个值后面的内容
为1时代表修改,修改起始位置的内容为第二个值后面的内容
不是0和1,代表从起始位置取多少个值修改为第二个值后面的内容
第三个:
需要插入或修改的内容
第N个值:
需要插入或修改的值
slice和splice返回的都是数组.因为不知道有多少个值
使用场景,两个一起用,看返回的值一不一样查看有没有重复的值
名字.indexOf(值);从前往后找到第一个为该值的值,返回下标
名字.lastindexOf(值);从后往前找
他俩是全等匹配.
他俩找不到NaN
include()可以找到NaN
解构
把复杂数据类型分解为简单数据类型
要求:赋值符号左右的类型相同
遍历数组
打印下标(键)
for(*let* indexNum in f68){
console.log(f68(indexNum));
}
打印具体的每一个值(值)
for(*let* indexNum of f68){
console.log(indexNum);
}
for(*let* i=0;i<=f68.length-1;i++){
console.log(f68[i]);
}
判断当前标识符是不是数组
Array.isArray(f68)
f68 instanceof Array
冒泡排序
// 循环的次数
for (*let* i = 0; i < f68.length-1; i++) {
//因为每比较一次,就能确定一个数的位置,所以条件为-i,然后遍历剩下的每个数
for (*let* j = 0; j < f68.length - i; j++) {
if (f68[j] > f68[j + 1]) {
[f68[j], f68[j + 1]] = [f68[j + 1], f68[j]];
}
}
}
选择排序
//遍历每个数拿来比较,最后一个不用取,因为内循环能取到,取到最后一个没意义
for (*let* i = 0; i < f68.length - 1; i++) {
for (*let* j = i+1; j <= f68.length - 1; j++) {
if (f68[i] > f68[j]) {
[f68[i],f68[j]]=[f68[j],f68[i]];
}
}
}
倒序排列(倒过来,没有排序)
f68.reverse()
从大到小排列
f68.sort((*a*,*b*)*=>b*-*a*)
从小到大排列
f68.sort((*a*,*b*)*=>a-*b*)
安位比较排列
f68.sort()
扩展运算符(…)
let* f68="ABC";
*let* f69=[...f68];
console.log(f69);
不用…输出[“ABC”]用了输出(“A”,“B”,“C”)
split(" ")
以引号中间的东西为分隔符取值.没有分隔符就每个字符分别取
字符串会转为数组
let* f68="2000,1,2";
*let* f69=f68.split(",")
console.log(f69);
数组转字符串
str=数组.join
数组.concat(添加内容)
添加的内容可以是数组
集合
let f68=new Set{};
可以存多个值,但是不能重复,重复的条件时全等.
属性和方法
属性
.size 长度
方法
添加括号里面写具体的值
.add()
删除括号里面写具体的值
.delete()
遍历出集合中的每一个值
for…of
获取值
.values
获取键
.keys
获取键值对
.entries
使用场景,去除数组的重复
let* arr=[1,1,2,2,4,5,7,8,"8"];
*let* f69=new *Set*(arr);
arr=*Array*.from(f69);
console.log(arr)
函数
函数:可以实现一定的功能,(封装)
创建
-
字面量创建
function 名字(){
代码块
}
名字不要以大写字母开头
function f68(){
console.log(`123456`)
}
-
函数表达式(匿名函数表达式)
let 名字 = function(){代码块}
let f68=function(){ console.log(`123456`) }
-
构造函数(一般不用)
let 名字 =new function(
’ 代码块 ',
’ 代码块 ’
);
写成字符串.能识别是js代码.
调用函数
名字();
返回值
return ;
每个函数都有返回值,没给就是undefined;
参数
形参
创建函数时的参数
实参
调用时的参数