js(基础版)
变量
变量是什么
理解变量是计算机存储数据的”容器“,用来存放数据的。
注意:变量不是数据本身,它们仅仅是一个用于存储数值的容器。可以理解为是一个个用来装东西的纸箱子
变量基本使用
1.变量的声明
要想使用变量,首先需要创建变量(也称为声明变量或者定义变量)
let 变量名
声明变量有两部份构成:声明关键字,变量名(标识)
let即关键字(let:允许,许可,让,要),所谓关键字是系统提供的专门用来声明(定义)变量的词语
2.变量的赋值
定义一个变量后,能够初始化他(赋值)。在变量名之后跟上一个”=“,然后是数值。
1.声明一个age变量
let age
2.age变量赋值为18
age = 18
//1和2完成了变量初始化
3.输出age变量
alert(age)
注意:通过变量名来获得变量里面的数据
3.更新变量
变量赋值后,还可以通过简单地给他一个不同的值来更新它
1.声明一个age变量
let age = 18
2.age变量的数据发生变化改为19
age = 19
3.页面输出的结果为19
document.write(age)
注意:let不允许多次声明一个变量
4.声明多个变量
变量赋值后,还可以通过简单地给它一个不同的值来更新它
语法:多个变量中间用逗号隔开
1.
let age = 18 ,uname = 'pink'
2.
let age = 18
let uname = 'pink'
第二个可读性更好
变量的本质
内存:计算机中存储数据的地方,相当于一个空间
变量本质:是程序在内存中申请的一块用来存放数据的小空间
变量命名规则与规范
1.规则
不能使用关键字:有特殊含义的字符,例如:let,var,if,for等
只能用下划线,字母,数字,$组成,且数字不能开头
字母严格区分大小写,如Age和age是不同的变量
2.规范
起名要有意义
遵守小驼峰命名法:第一个单词首字母小写,后面每个单词首字母大写。例:userName
数组
一种数据存储在单个变量名下的优雅方式
let arr = []
声明语法
let 数组名 = [数据1,数据2,...数据n]
数组是按顺序保存,所以每个数据都有自己的编号,计算机中的编号从0开始,所以小明的编号为0,小刚编号为1,以此类推,在数组下,数据的编号也叫索引或下标,数组可以存储任意类型的数据
一些术语
1.元素:数组中保存的每个数据都叫数组元素
2.下标:数组中数据的编号
3.长度:数组中数据的个数,通过数组的length属性获得
常量
概念
使用const声明的变量称为”常量“
类似于let,但是变量的值无法被修改
使用场景
当某个变量永远不会被改变的时候,就可以使用const来声明,而不是let
命名规范
和变量一致
常量使用
1.声明一个常量
const G = 9.8
2.shu输出这个常量
console.log(G)
注意:常量不允许重新赋值,声明的时候必须赋值(初始化)
小技巧:不需要重新赋值的数据使用const
数据类型
计算机世界中的万事万物都是数据。计算机程序可以处理大量的数据,所以要给数据分类,可以更加充分和高效的利用内存,也更加方便程序员使用数据
js是弱数据类型,变量到底属于那种类型,只有赋值之后,我们才能确定
基本数据类型
number 数字型
我们数学中学习到的数字,可以是整数,小数,正数,负数。数字可以有很多操作,比如,乘法*,除法/,加法+,减法-,取余%,所以经常和算术运算符一起
优先级:先乘除取余,后加减,有小括号先算小括号里面的
NaN代表一个计算错误,他是一个不正确的或者未定义得到数学操作所得到的结果,NaN是粘性的,任何对NaN的操作都会返回NaN
parselnt——只保留整数
parseFloat——可以保留小数
string 字符串型
通过单引号,双引号或反引号(``)包裹的数据都叫字符串,单引号和双引号没有本质上的区别,推荐使用单引号
注意:
1.无论单引号或是双引号必须成对使用
2.单引号/双引号可以互相嵌套,但是不以自己嵌套自己(口诀:外双内单,或者外单内双)
3.必要时可以使用转义符\,输出单引号或双引号
使用场景:拼接字符串和变量,在没有它之前,要拼接变量比较麻烦
document.write('大家好,我叫'+ name + ',今年' + age + '岁')
更好的,``(反引号),内容拼接变量时,用${}包住变量
document.write(`大家好,我叫${name},今年${age}岁`)
Boolean 布尔型
它有两个固定的值true和false,表示肯定的数据用true(真),表示否定的数据用false(假)
undefined 未定义型
未定义是比较特殊的类型,只有一个值undefined。
只声明变量,不赋值的情况下,变量的默认值为undefined,一般很少【直接】为某个变量赋值为undefined
let age//声明变量但是未赋值
document.write(age)//输出undefined
null 空类型
仅仅是代表”无“,”空“或者”值未知“的特殊值(将来有个变量里面存放的是一个对象,但是对象还没创建好,可以先给个null)
let obj = null
console.log(obj)//null
null和undefined区别:
undefined表示没有赋值
null表示赋值了,但是内容为空
引用数据类型
object 对象
通过typeof关键字检测数据类型
typeof运算符可以返回被检测的数据类型。它支持两种语法形式:
1.作为运算符:typeof x(常用的写法)
2.函数形式:typeof(x)
换言之,有括号和没有括号,得到的结果是一样的,所有我们直接使用运算符的写法。
为什么需要类型转换
因为prompt获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,通俗来说,就是把一种数据类型的变量转换成我们需要的数据类型
类型转换
隐式转换
某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换
规则:
+号两边只要有一个时字符串,都会把另外一个转成字符串
除了+以外的算术运算符,比如- * /等都会把数据转成数字类型
缺点:
转换类型不明确,靠经验才能总结
小技巧:
+号作为正号解析可以转换成数字型
任何数据和字符串相加结果都是字符串
console.log(11 + 11)//输出22
console.log('11' + 11)//输出1111
console.log(11 - 11)//输出0
console.log('11'- 11)//输出0
console.log(1 * 1)//输出1
console.log('1' * 1)//输出1
console.log(typeof '123')//输出string
console.log(typeof +'123')//输出number
console.log(+'11' + 11)//输出22
显示转换
编写程序是过度依靠系统内部的隐式转换是不严禁的,因为隐式转换规律并不清晰,大多是靠经验总结的规律。为了避免因隐式转换带来的问题,通常根逻辑需要对数据进行显示转换
概念:
自己写代码告诉系统该转成什么类型
例:Number(数据)转换为数字型
如果字符串内容里有非数字,转换失败时结果为NaN既不是一个数字
NaN也是number类型的数据,代表非数字
运算符
赋值运算符
将等号右边的值赋予给左边,要求左边必须是一个容器
+=
-=
*=
/=
%=
n元运算符
一元运算符——正负号,自增(++),自减(--)
二元运算符——num=10+20
条件?满足条件执行的代码:不满足条件执行的代码
比较运算符——比较boolean类型,即只会得到true或false
>:左边是否大于右边
<:左边是否小于右边
>=:左边是否大于或等于右边
<=:左边是否小于或等于右边
==:左右两边值是否相等
===:左右两边值和类型是否相等
NaN===NaN,false,因为NaN不等于任何人,包括他自己
字符串比较,是比较的字符对应的ASCll码,从左往右依次比较,如果第一位一样在比较第二位,依次类推,尽量不要比较小数,因为小数由精度问题
不同类型之间比较会发生隐式转换,最终把数据隐式转换转成number类型再比较
!==:左右两边是否不全等
逻辑运算符
&&:符号两边都是true,结果才为true(一假则假)
||:符号两边有一个true就为true(一真则真)
!:true变false,false变true(真变假,假变真)
运算符优先级
语句
表达式
是可以被求值得代码,js会将其计算出一个结果,因为表达式可被求值,所以它可以写在赋值语句的右侧。
语句
语句不一定有值,所以比如alert() , for 和break等语句就不能被用于赋值。
分支语句——根据条件选择执行代码
if
三元运算符
switch case
循环语句——某段代码被重复执行
while
for
break:退出循环,continue:结束本次循环,继续下次循环
数组
数组是什么
是一种可以按顺序保存数据的数据类型
数组的基本使用
按顺序保存,每个数据都有自己的编号,数据的编号也叫索引或下标,数组可以存储任意类型的数据
元素:数组中保存的每个数据都叫数组元素
下标:数组中数据的编号
长度:数组中数据的个数,通过数组的length属性获得
遍历数组:用循环把数组中每个元素都访问到,一般会用for循环遍历
查:数组[下标]
改:数组[下标] = 新值
增:
arr.push(新增的内容)——push可以实现一次性添加多个的效果添加到数组的末尾并返回该数组的新长度,推荐使用
arr.unshift(新增的内容)——在开头添加元素,返回该数组长度
删:
arr.pop()——在数组中删除最后一个数
arr.shift()——在数组中删除第一个元素
arr.splice(操作的下标,删除的个数)——删除指定元素
操作数组
数组案例
函数
为什么需要函数
function——是被设计为执行特定任务的代码块
函数可以把具有相同或相似逻辑的代码”包裹“起来,通过函数调用执行这些被”包裹“的代码逻辑,这么做的优势是有利于精简代码方便复用,比如我们前面使用的alert(),prompt()和console.log()都是一些js函数,只不过已经封装好了,我们可以直接使用
函数使用
语法:
1.函数的声明语法
function 函数名(){
函数体
}
2.例子
function sayHi(){
document.write('hai~~')
}
函数名命名规范:
1.和变量命名基本一致
2.尽量小驼峰式命名法
3.前缀应该为动词
4.命名建议:常用动词约定
函数的调用:
函数名()
声明(定义)的函数必须调用才会被真正被执行,使用()调用函数
函数传参
函数完成功能需要调用者传入数据,那么就需要用有参数的函数
1.传入数据列表
2.声明这个函数需要传入几个数据
3.多个数据用逗号隔开
声明语法:
function 函数名(参数列表){
函数体
}
例子:
function getSquare(num1){
document.write(num1 * num1)
}
形参:声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
形参可以理解为是在这个函数内声明的变量(比如 num1=10)实参可以理解卫视给这个变量赋值
参数默认值:undefined
如果做用户不输入实参,则undefined + undefined结果是——NaN,用户不输入实参,可以给形参默认值,可以默认为0,这样程序更严谨
函数返回值
当调用某个函数,这个函数会返回一个结果出来,这就是有返回值的函数
1.在函数体中使用return关键字能将内部的执行结果交给函数外部使用
2.return后面代码不会再被执行,会立即结束当前函数,所以return后面的数据不要换行写
3.return函数可以没有return,这种情况函数默认返回值为undefined
return后面不接数据或者函数内不写return,函数的返回值是undefined
return能立即结束当前函数,所以return后面的数据不要换行写
作用域
通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域,作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突
全局作用域
全局变量在任何区域都可以访问和修改
局部作用域
局部变量只能在当前函数内部访问和修改
变量的访问原则
在不同作用域下,可能存在变量命名冲突的情况
1.只要是代码,就至少有一个作用域
2.写在函数内部的局部作用域
3.如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
4.访问原则:在能够访问到的情况下,先局部,局部没有在找全局(采用就近原则的方式来查找变量最终的值)
匿名函数
函数有具名函数和匿名函数
具名函数
1.声明
function fn(){}
2.调用
fn()
匿名函数
function (){}
没有名字的函数,无法直接函数
使用方式:
1.函数表达式
将匿名函数赋值给一个变量,并且通过变量名称进行调用,我们将这个称为函数表达式
语法
//定义函数
let fn = function(){
//函数体
console.log('我是函数表达式')
}
//调用
fn()
2.立即执行函数
避免全局变量之间的污染
语法
1.方式1
(function () {console.log(11)})();
2.方式2
(function () {console.log(11)}());
不用调用,立即执行,多个立即执行函数之间用分号隔开
对象
对象是什么
js里的一种数据类型,可以理解为是一种无序的数据集合,注意数组是有序的数据集合。
用来描述某个事物,例如描述一个人(人有姓名,年龄,性别等信息,还有吃饭睡觉打代码等功能,如果用多个变量保存则比较散,用对象比较统一)
特点
无序的数据的集合,可以详细的描述某个事物
对象声明语法
let 对象名 = new Object()
let 对象名 = {}
例子
let person = new Object()
对象使用
对象有属性和方法组成
属性:信息或叫特征(名词)。比如手机尺寸,颜色,重量等.....
1.属性都是成对出现的,包括属性名和值,它们之间使用英文:分隔
2.多个属性之间使用英文,分隔
3.属性就是依附在对象上的变量(外面是变量,对象内是属性)
4.属性名可以使用“”或‘’,一般情况下省略,除非名称遇到特殊符号如空格,中横线等
方法:功能或叫行为(动词)。比如手机电话,发短信,玩游戏......
let 对象名 = {
属性名: 属性值,
方法名: 函数
}
增:对象添加新的数据
对象名.新属性名 = 新值
删:删除对象中属性
delete 对象名.属性名
改:重新赋值
对象.属性 = 值
查:查询对象
1.对象.属性
2.对像 [ ' 属性名' ]
对象中的方法
数据行为性的信息称为方法,如跑步,唱歌等,一般是动词性的,其本质是函数
let person = {
name: 'andy'
sayHi: function(){
document.write('hi~~')
}
}
1.方法是由方法名和函数两部分构成,它们之间使用:分隔
2.多个属性之间使用英文 , 分隔
3.方法是依附在对象中的函数
4.方法名可以使用"" 或'',一般情况下省略,除非名称遇到特殊符号如空格,中横线等
5.对象名.方法名()来调用,也可以添加形参和实参
遍历对象
let obj = {
uname:'andy',
age: 18,
sex: '男'
}
for(let k in obj){
console.log(k)//打印属性名
console.log(obj[k])//打印属性值
}
1.一般不用这种方式遍历数组,主要是用来遍历对象
2.for in语法中的k是一个变量,在循环的过程中依次代表对象的属性名
3.由于k是变量,所以必须使用【】语法解析
4.一定记住: k是获得对象的属性名,对象名[k]是获得属性值
内置对象
js内部提供的对象,包括各种属性和方法给开发者调用(document.write())
Math
Math.random:生成0-1之间的随机数
如何生成N-M之间的随机数
Math.floor(Math.random()*(M-N+1))+N