一。如何编写js:
- 通过浏览器窗口编写
- 通过html页面中的script标签内部进行JavaScript编写
- 通过通过script标签的src属性引入js文件
二。javascript的数据类型:2类
- 原始数据类型
- 引用类型对象
原始数据类型:
string-字符串
number-数字
boolean-布尔 (只有两种分为true和false)
undefined-所有仅声明,未赋值的变量的没默认值(修饰原始数据类型的空)
null -空(修饰对象的空)
symbol(se6)
2.引用类型对象:
array(数组)
function(函数)
三。数据类型转换-隐式转换
- 概念不需要程序员干预,js可以自动的完成类型转换,仅讨论算数计算时的隐式转 换算数计算中,一切数据都默认转换为数字后在做计算
- 减法
boolean:true->1;false->0;
null ->0
underfined->NAN->not a number(不是一个数字)所以underfined不能转换为数字一些数据不能转换为数字的话,则会转换为nan,nan不等于,不大于,不小于任何值包括他自己,nan虽然表示不是一个数字,但是它本身属于number数据类型,只要nan参与了运算那么计算结果永远是NaN
3.在加运算当中,只要碰到字符串,加号就不再是加法运算符号,而是变成了字符串拼接符号,导致另一个不是字符串的数据会变成字符串类型数据。
4.Js的强制转换:程序员主动调用专门的函数(API)执行数据转换何时使用:自动转换的结果不是我们想要的结果的时候任意
1.string 2个api
x.toString() x不能是undefined或是null;
String(X)->相当于隐式转换->万能转换方式
typeof(x)->返回的结果数据类型
string->number :2个api
2.parseInt(str/num):从第一个字符开始,一次读取每个数字,只要碰到第一个非数字字符就停止,默认跳过开头的空字符
parseFloat(str/num):解析规则同praseInt,只不过认识第一个小数点2
四.js中的运算符
- 算数运算:+ - * / %(模运算) ++递增1 --递减1 %表示不取商取余数
- 模运算的2个用途
- 判断是否能整除:比如判断奇偶性质
- 保证运算的结果不能超过除数
- ++递增1 --递减1有2种表达式:++n和n++
这两个表达式的共同点都是将n中的值递增1后,再存回n
如果上述两个表达式参与输出了,那么是有去别的
++n 返回表达式的新值(n递增后的值)
n++返回表达式的旧值(n递增前的值)
关系运算:将两个值作比较->true false有>, < ,>= ,<=, ==, !=
关系运算的比较规则
1.默认将所有类型转换为数字后,再做比较
2.如果参与比较的2个数据都是字符串
依次取出每个字符串中的字符 pk“unicode”码
扩展赋值运算
+= -= *= /= %=
例:n=n+m -->n+=m别的同理
注意:如果n=m-n不能简化
五.逻辑运算
概念:将多个关系运算综合起来,得出一个结论(true,false)
3种:&&(且) ||(或) !(非)
&&:2个条件都必须为true,才返回true
||:2个条件都必须为false,才返回false
短路逻辑(分支结构);
&&如果前一个条件为false,就已经得出结论false
||如果前一个条件为true,就已经得出结论true
引申出短路逻辑;
语法:1.条件&&(操作)
条件满足,执行后续操作,不满足则不执行
2.值1||值2
如果值1有效就用值1,否则就用值2
空字符串是一个无效值,返回false
如何在不声明新变量的情况下完成两个数的交换
x=3,y=4
x+=y x=3+4=7
y=x-y y=7-4=3
x-=y x=7-3=4
六.程序中的三种结构
1,顺序结构
2,分支结构
根据不同的条件,满足条件就执行,不满足就不执行
- 循环结构
- js的三目运算
三目运算,三元运算,条件运算
根据不同的条件,执行不同的操作/返回不同的值
语法:
条件1?值1或操作1;//满足条件1才取值1或执行操作1
条件2?值2或操作2;
....?
默认值或默认操作 //上诉条件都不满足
总结:多个条件,多见识,多选一执行
如果操作的语句比较简单,建议使用三目运算
分支结构:
3种
1。if结构:一个条件一件事,满足就做,不满足就不做
结构
if(条件){
满足条件执行操作
}
2.if...else结构:一个条件2件事二选一执行
语法:
if(条件){
满足条件执行的操作
}else{
不满足条件的执行操作
}
3.if..else if ...[else]结构:多个条件多件事,多选一执行(也有可能什么都不做))
语法:
if(条件1){
满足条件1执行的操作
}else if(条件2){
满足条件2执行的操作
}[else{
上述条件都不满足执行的默认操作
}]
switch case结构:
当条件都是全等比较的时候,才可以使用swicth case结构
全等比较:不仅比较值,还比较数据类型
语法:
switch(表达式){
case 值1:
满足值1才执行
default:
如果前面的值都不满足,执行默认操作
问题:经过运行后发现switch case结构如果没有break关键词,那么会根据条件进入到满足的条件的case执行,并以此触发后续的所有case操作(),所以如果想要独立的执行分支,必须要在每个case之间添加break关键词
break:终止当前结构执行,并跳出结构
循环结构:让程序返回执行同一段代码
循环三要素:
1.循环条件:让循环反复执行的条件
2.循环变量:循环条件中用于比较的变量
循环变量总是向着不满足循环条件的趋势经行迭代的
循环体:循环内部反复执行的代码段
循环分类:
1.while循环:先判断循环条件,再执行循环体
一般情况下,当循环条件的变化没有规律的时候
while(循环条件){
循环体;
迭代修改循环变量;
}
2.do...while循环;先执行循环体,在判断循环条件
do{
循环体;
迭代修改循环变量;
}while(循环条件)
注意while循环与do..while循环基本等效,区别在于看第一个循环条件是否满足,如果满足,则两者等效,不满足,while循环一次都不执行。do...while至少执行一次
for循环与while循环等效
语法 :
for(1初始化循环变量;2循环条件;3迭代修改循环变量){
4循环体;
}
执行顺序1,2,4,3,2,4,3
for(1初始化循环变量;2循环条件;){
3迭代修改循环变量
4循环体;
}
执行顺序1,2,4,3,2,4,3
七.函数
定义:程序中封装一项专门任务的步骤清单代码段
语法:
function 函数名([参数变量列表]){
任务步骤代码段
[return 返回值]
}
函数名(任务名):指向函数定义的一个变量,保存的是函数对象的引用
声明的时候;不执行,同时也不读取内部代码
在程序的任意位置:函数名([参数值列表]);
函数调用时:才开始读取内部代码,并执行;
变量作用域:一个变量的可用范围
2种:
1.全局作用域-window
全局变量-放在全局作用域里的变量
可在程序的任意位置进行访问并修改
2,局部作用域:在函数调用的时候才会动态创建的作用域
局部变量:2种
1.参数变量
2.在函数中var出来的变量
仅在函数调用时,动态创建
并且使用变量的规则是:如果局部有,就不用全局的
调用后,局部变量会伴随着局部作用域一同销毁
提前声明
正式开始执行程序之前,都会先将var声明的变量,和function声明的函数,提前到当前作用域的顶部,集中声明,同时赋值留在本地
注意:函数的声明比变量的声明更置顶
变量提升示意图:
八.数组
- 数组:
定义:一组变量的集合,连续保存多个数据引用类型的对象
如何创建数组:
- 创建一个空数组 var 数组名=[];
暂时不知道数组内容的时候使用,先创建再追加
2.创建数组的同时直接初始化内容
var 数组名=[值1,值2,值3]
3.创建指定个数的数组
var 数值名=new Array(n);
创建一个对象,同时初始化n个空元素
4.创建同时直接初始化
var 数组名=new array(值1,值2,值3)
注意:3和4创建数组的方式不常用,因为有分歧
var arr=new Array(7);
可以解释为初始化7个空元素
也可以解释为初始化了一个数组,只放了一个元素值为7
数组分类:
1.索引数组
下标从0开始每次递增1
length-元素个数
2.关联数组(哈希数组)
下标可以自定义,而且下标不可重复
length-失效
3.二维数组 - 元素又指向另一个子数组
下标分为行下标和列下标,都是从0开始,每次递增1
行- length获得数组中有多少个子数组对象
列- length获得子数组中元素的个数
所有数组都有下标,只不过每种数组的下标不同
都有length属性,length属性表示数组的长度,保存了多少元素
如何获得某个元素值:var 变量=arr[下标]
如何获得数组长度:arr.length
如何获得最后一关元素值:arr[arr.length-1];
undefined与null
1.所有仅声明但是未赋值的默认值-undefined
undefined为空-修饰原始数据类型
2.null-修饰对象的空
null表示一个变量不再指向任何对象的地址
null的用法有2种:
1.var 变量=null;相当于打标记
将来该变量有可能指向一个对象,只是此时声明都没有指向
2.var obj=对象;
把该对象使用完毕后,就把obj主动赋值为null,这么做的话,就能主动释放内存 ,节省 内存空间从而提高浏览器性能,内存种有个垃圾回收器,
js中的对象指的是:内存中保存一组相关数据和功能的整体
对象都是new操作符创建的
new专门在内存中开辟一个空间,保存数据和功能,返回存储地址
索引数组的下标为0开始 ,每次递增1的特性
这个 下标天生就是 一个 循环变量
下标递增到<length-循环条件
冒泡 排序:将数组中的元素按照从大到小(从小到大)的顺序进行排序;
关联数组(hash哈希数组)-可以自定义下标的数组
关联数组的key(下标)不可以重复 ,length属性失效
如何遍历hash数组:
for(var key in obj){
console.log(obj[key])
}