引入js文件使用script标签,src属性用于书写引用的地址
变量
1.变量的作用? 存储数据
数据分为两种: /
固定数据:保存在硬盘中的固定的数据
临时数据:临时的数据是保存在内存中
数据是保存在内存中的某一个区域的,每个区域对应一个内存地址,我们想要使用某个区域中的数据,就需要找到指定的地址,使用起来不方便。
我们可以通过变量,变量实际上保存的是某个数据的地址,我们使用变量实际上就是使用变量中保存的地址中的数据。
2.变量的使用
3.变量的声明:
var 变量名; var—variable可变的 js是弱类型语言,变量的类型不定,可变
3.1变量的命名规则:
1、 不能使用关键字和保留字
2、 开头可以使用_$英文字母
3、 除了开头以外可以使用数字
4、 不能包含空格
5、 严格区分大小写 var a; var A;
3.2变量的赋值和初始化
初始化:在变量声明同时进行赋值 var num = 100;
赋值: var num = 100; num = 10; 由于js是弱类型,保存数值型的变量也可以保存其他类型数据。但是我们不推荐这样做,可能会对使用造成不良影响。
3.3变量的类型
基本数据类型:字符串string 数值型number 布尔类型boolean undefined null
字符串的值:
使用成对的双引号或者单引号进行包裹
js中所有的标点符号必须为英文半角 adwdwadaw dwaddwadawdwa
数值型的值:
0-9 0.1 0.2
NaN – not a number 不是一个数值类型
isNaN(数据); 是不是不是数 如果判断的数据不是数值型返回true
Infinity 表示无穷大,超出了js能承受的最大值
-Infinity 表示无穷小
布尔类型
true 真 false 假
undefined defined 定义
undefined出现的情况 变量声明未赋值
null 空
数据类型判断
typeof 变量 typeof(变量)
3.4变量的类型转换:
将其他类型转换为字符串类型:
1、 强制转换
a) toString()
变量.toString()
b) String()
undefined和null不支持toString()方法
2、 隐式转换
a) 通过任意类型+任意字符串操作可以将其他类型转换为字符串类型
b) 在使用+操作的时候为了不改变数据的原有内容,使用空字符串
c) 空字符串中不能有任何内容
基本类型值的不可变性
通过类型转换或者重新赋值都无法修改基本类型的原有值。
转换为数值型:
1、 强制转换
a) Number() 只能转换全部是数值型的字符串
b) parseInt() 可以转换前半部分为数字的字符串,转换结果为整数
c) parseFloat() 可以包含小数
2、 隐式转换
a) -*/% 可以进行转换
b) +操作需要将+号放在数据前进行使用。
转换为bool类型:
1、 强制转换
a) Boolean()
i. 转换值为false : 0 undefined null “” NaN
ii. 有值的字符串 有值的数
2、 隐式转换
a) !!
undefined和null类型只有一个值,不需要转换。
交换两个变量的值
4.运算符
算数运算符: +-*/%
一元运算符:一元指的是操作数的个数 ++ –
前置和后置不同。
前置:先自增(减) 然后参与当前运算
后置:先参与运算,再自增(减)
逻辑运算符:
操作数都是bool值时:
逻辑与(且) && 两个操作数都为true结果为true
逻辑或 || 有一个为ture就为true,两个都为false,结果为false
逻辑非 ! 取反
操作数不是bool值: 短路操作
比較运算符:
< >= <= != !== 返回结果为bool类型
赋值运算符:
= += -= *= /= %=
相等运算符
== 相等比較值 === 全等比較值和类型
注:相等比较值,不完全准确。会有特殊的地方。
运算符的优先级
5.条件判断语句
if else 分为三种结构;
单if结构:
if(条件){
满足条件执行,不满足继续向下
}
if..else:
if(条件){
条件满足执行
}else{
条件不满足执行
}
多个ifelse的情况:
if(){
}else if(){
}..else{
}
6.switch case语句
比较时是全等比較
switch(传入值){
case 值:
执行内部代码;
break;
case 值:
执行内部代码;
break;
default:
所有人都没执行,执行我。
}
通常情况下我们使用ifelse进行范围比较,使用switchcase进行单值比較。
7.三元运算符
bool表达式?表达式1:表达式2; bool表达式为真,执行表达式1否则执行表达式二
8.循环语句
for循环语法
for( 1循环变量初始化; 2循环条件; 4循环变量增减){
3循环内的代码
}
执行顺序 1 2 3 4 2 3 4 2 3 4
break 在循环内表示跳出
continue表示结束本次循环,进入下一次循环
while循环和dowhile循环
for循环和while和do..while可以互换使用的。
小数精度问题
在js中小数进行加减计算精度不准确,我们可以通过扩大要计算的数值来避免这一问题
var num1=0.1*100;
var num2=0.2*100;
console.log((num1+num2)/100)
字符串的长度属性
str.length 可以得到字符串的字符个数
转义符
如果在字符串中想要使用一些具有特殊含义的字符,例如引号,可以使用反斜杠\进行转义。后面正则表达式的地方会继续讲解。
undefined出现的情况
var num1;
console.log(num1);//undefined;
console.log(num)//报错,变量未声明直接报错。
变量声明未赋值,值为undefined,如果声明也没有,会报错
undefined和null的关系
相等(==),不全等(===)
console.log(null==undefined)//true
console.log(null===undefined)//false
进制方法
进制的转换(了解)
var num=10;
console.log(num.toString(16))
//toString()传入一个数值,表示得到几进制的值。
var str="10";
consoe.log(parseInt(str,2));
//表示传入的是个几进制的数。
将其他进制转换为10进制
0x10 16进制的写法 021 8进制
当前位的数值*进制数(8) 位数 注意,位数是从右往左算,第一位的位数为0
8进制的021转换为十进制: 1 * 80 + 2 * 81 + 0 * 82 = 17
if的隐式转换
if("呵呵"){//"呵呵”隐士转换为true
}
数组
为什么要有数组?
可以存储多个数据
数组的声明方式
var arr = [10,12,13,12];
var arr=new Array(10,12,13,12);
元素
数组中的每一个数据我们称为元素
由于js是弱类型,一个可以存储不同类型的元素。
一般不推荐在数组中保存多个类型的数据
数组的长度属性
arr.length 数组中元素的个数
数组的索引
数组中的元素是按照索引排列的,索引从左往右计算,第一位为0
遍历数组
我们将i看作数组的索引,从0开始,最大值
数组中最后一项的索引是arr.length-1
向数组最后添加一个新元素索引值为arr.length arr[arr.length]
数组的长度是随着数组元素的增减而增减的。
数组的长度可以进行设置,如果设置的长度大于数组元素个数,不影响内容,多出的部分值为undefined
如果小于了元素个数,超出的部分元素会被删除掉。
数组的类型
数组是一个复杂数据类型,通过typeof检测时得到object,不准确,我们可以通过下列方法去检测数组的类型。
var arr=[];
console.log( arr instanceof Array);//相对常用,true or false
console.log(Array.isArray(arr))//ie以下不支持,true or false
console.log(Object. prototype.toString.call(arr)=="[object Array]")
前两种得到的是bool值,最后一种得到字符串
基本数据类型和复杂数据类型的区别?
直观区别,数据量不同。
复制的区别:
保存上的区别:
基本数据类型的值保存在栈中
数组的复制
由于数组是引用类型(复杂数据类型),复制的时候会出现问题,我们需要用特殊的复制方式。
数组补充:
数组的声明:
var arr = [1,2,3,4,5]
var arr = new Array(1,2,3,4,5);
var arr = new Array(3) 输入一个数值表示设定默认长度,但是没用
综上所述,我们使用var arr = [];
索引问题:
arr[0] = 1;
arr[“0”] = 1; 跟上一个方式相同
二维数组:
var arr = [1,2,3,4,5,[1,2,3]];
如何遍历二维数组?
函数
为什么要用函数,当某一段代码的重复使用次数多时,我们可以使用函数这种方式实现重用。
1、函数的声明方式
function 函数名 ( ) {
大括号的作用是标示代码的范围
}
2、函数的调用方式。
函数内部代码本身不执行,需要调用。
调用方式 函数名();
3、函数的定义
函数是在调用时执行的可重复使用的代码块。
4、函数的参数
写在函数体的小括号内,多个使用,分隔
function 函数名(参数1,参数2。。。。){
函数代码
}
写在函数体内的参数称为形参-形式上的参数
函数的返回值:
在函数内声明的变量在函数外无法访问。
如果想要让函数的计算结果被外界得到,可以通过设置函数的返回值来实现。
在函数的最后添加return 值。
返回值通过函数调用语句进行接收。
return执行后直接结束函数,return后面的代码不会继续执行了。
函数没设定返回值,值为undefined。
函数名代表了函数体(函数本身)
arguments
arguments表示当前函数的实参列表(保存了当前了),本身是一个伪数组。
伪数组:支持长度和索引,但是不支持数组的方法。
*在其他语言中有重载,js中没有,js中函数不能重名,我们可以通过判断arguments的length来模拟这一效果。
函数的参数传递。
js中函数的参数传递方式为 值传递 (形参复制了实参的值)。
基本类型在复制的时候,相当于克隆,两者没有任何关联。
引用类型在复制的时候,两者指针(引用相同),也就是说两者是一样的。
函数的声明方式:
function 函数名(){},
使用函数声明,在函数声明语句的前后都可以进行调用
foo();
function foo(){
alert("woshifoo")
}
foo();
函数表达式:
只能在声明语句之后进行调用
var fun = function(){};
fun()//报错
var fun=function(){}
fun();
变量作用域
script标签内称为全局作用域。
在全局作用域下声明的变量称为全局变量,全局变量在全局可以访问。
在函数内部称为局部作用域。
而在函数内声明的变量,称为局部变量,局部变量只能在局部访问。
当我们在某一个作用域内使用变量时,寻找的时候是优先当前作用域
作用域大的区域无法访问作用域小的内部的变量。
作用域小的区域可以访问外部的变量。
变量提升
提升到当前作用域顶端
在每个作用域的代码执行前存在一个步骤,称为预解析。
在预解析阶段会寻找当前作用域内的var和function
//当找到变量var的时候,将变量声明语句提升赋值语句保留在原地。
//找到函数声明function时,函数整体提升(注意只有函数声明方式。函数表达式遵循变量提升的规则)。
变量的怪异声明方式:
var a = b = c = 9; 只有a属于当前作用域,b和c都是全局变量。(最好不这么写)
声明变量时不加var,这个变量就是全局变量。(最好不要这么写)