JS基础知识
//var 定义变量
// const 定义常量
var num;
const pai=3.1415926;
js的命名规范
1、.JS中严格区分大小写
2、命名的时候可以使用$、_、数字、字母
,但是数字不能作为名字的第一位
var $xxx;// =>一般都是应用JQ获取到的值
var _xxx;// =>一般这样的情况代表变量是一个全局或者公用的变量
JS的数据类型
- 基本数据类型(值类型)
- number:数字
- string:字符串
- boolean:布尔
- null:空对象指针
- undefined:未定义
- 引用数据类型
- object对象数据类型
- {}普通对象
- []数组
- / ^$/正则
- function函数数据类型
这么多数据类型JS如何去检测呢
- typeof :检测数据类型的运算符 (局限性1 typeof null 不是’null‘,而是’object‘。因为null虽然一个单独的数据类型,但是它原本的意思是空对象指针,浏览器使用typeof检测的时候会把它按照对象来检测; 2使用typeof 无法具体细分出到底是数组还是正则,因为返回的结果都是’object‘)
- instanceof : 检测某个实例是否属于这个类
- constructor :获取当前实例的构造器
- Object。prototype.toString.call :获取当前实例的所属类信息
布尔
** Boolean()
**
把其他数据类型的值转换为布尔类型
只有
0、NaN、空字符串、null、undefined
这五个数据值转换为布尔数据类型的false,其余的都会变为true
!
!= : 不等于
叹号在JS中还有一个作用:取反
,先把之转化为布尔类型,然后再去取反
!!
在一个叹号取反的基础上再取反,取两次反相当于没有做操作,但是却已经把其他类型值转换为布尔类型了,和Boolean是想通的效果
字符串
在JS中单引号和双引号包起来的都是字符串
number数字
0 12, JS中多增加一个number类型的数据: NaN
NaN==NaN :false,NaN和任何其他的值都不相等
isNaN()
用来检测当前这个值是否是非有效数字,如果不是有效数字,如果不是有效数字检测的结果是true,反之是有效数字则为false,当我们检测的值不是number类型的时候,浏览器会默认的把值先转换为number类型,再去转化
Number()
把其他数据类型只转化为number类型的值
在使用Number转换的时候只要字符串中出现任何一个非有效数字字符,最后的结果都是NaN
Number(true) -> 1
Number(false) -> 0
Number(null) -> 0
Number(undefined) -> NaN
Number([]) -> 先把引用数据类型转换为number,首先需要把引用数据类型转化为字符串(toString),在把字符串转换为number即可 例如 :[] => ' ' ' ' => 0
parseInt()
也是把其他数据类型值转换为number,和Number方法在处理字符串有所区别
提取规则:从左往右依次查找有效数字字符,知道遇见非有效数字字符为止(不管后面是否还有,都不找了),把找到的转换为数字
parseFloat()
在parseInt的基础上可以识别小数点
null和undefined
空字符串和null的区别
空字符串相对于null来说开辟了内存,消耗了那么一丢丢的性能
null和undefined的区别
null一般都是暂时没有,预期中以后会有的(可能以后也没有达到预期):在JS中null一般都是手动先赋值为null,后期我们在给其赋具体值
undefined:完全没在预料之内的
判断操作语句
if、else if、else
三元运算符
条件?条件成立执行:条件不成立执行;
if(条件){}else{}
// =>改写为三元运算符
if(num>5 && num<10){
num++;
console.log(num);
}else{
/ num--;
}
num>5 && num<=10 ? num++ : num--;
//改写成三元运算符:1如果条件成立或者不成立的某一怔情况并不需要做什么处理,我们空着语法不符合,我们使用null 、 undefined、void、0(就是undefined)占位即可。
2 某一种情况执行多条操作,使用小括号抱起来,中间用逗号隔开;
3 在三元运算符的操作中不能出现break 、continue 、return 这些关键词,我们无法用三元运算符替代if 、 else;
num>5 && num<=10 ?(num++ ,console.log(num)) : null;
switch case
switch case 应用于if 、else中一个变量在不同情况下的不同操作
var num;
switch(num){ // =>switch 后面小括号中存放的是一个值(一般我们都写成变量:把变量存储的值拿来用,有时候也可能是一个计算)
case 1:
...
break;
case 10:// => case后面放入的都是值,目的是验证switch后面的值和哪一种case后面的值相等,相等的进行对应处理
...
break;
...
default:// => switch后面的值和每一种case情况对应的值不行等,执行最后的default,类似于else
}
for循环
for(设置循环起始值;设置循环执行的条件;布长累加){
//循环体
}
函数
创建函数
function[函数名](){
//函数体(实现功能的具体JS代码)
}
执行函数
函数名();
可以执行很多次
在真实项目中,我们一般都会把实现一个具体功能代码封装在函数中。
JS中函数的核心原理
闭包
函数执行会形成一个私有的作用域,让里面的私有变量和外界互不影响(互不干扰,外面的无法直接获取里面的变量值),此时我们可以理解微私有作用域把私有变量保护起来,我们把这种保护机制称之为
闭包
;
栈内存
作用域(全局作用域/私有作用域):提供一个供JS代码执行的环境
堆内存
所有的引用数据类型,它们需要存储的内容都在堆内存中(相当于一个仓库,目的是存储信息)
- 对象会把键值对存储起来
- 函数会把代码当作字符串存储起来
函数中的形参和实参
arguments 实参集合
当我们不知道用户具体要传递几个值得时候需求,(传递几个都行),此时我们无法设置形参得个数;遇到此类需求,需要使用函数内置得实参集合:arguments
[图片上传失败...(image-7466e-1531971803932)]
arguments[0]第一个实参信息
2 有一个length的属性,存储的是当前几个的长度(当前传递实参的个数)
arguments.length
arguments.callee:存储的是当前函数本身
arguments.callee.caller:存储的是当前函数在哪执行(宿主函数),在全局作用域下执行的,结果是null
JS中的返回值 return
返回值是函数提供的一个出口:我们如果想在函数外面使用函数的一些私有信息,那么需要通过return,把这些信息return 出来。//return后面跟的都是值;
JS中的匿名函数
没有名字的函数
- 函数表达式
- 自执行函数
oBox.onclick=function(){
// => 把一个没有名字的函数(有名字也无所谓)作为赋值给一个变量或者一个元素的某个事件等:.函数表达式.
}
;(function(n){
// => 创建函数和执行函数放在一起了,创建完成立马执行: .自执行函数.
// n是传进来的实参
//';'可替换成‘~’‘-’‘’‘+’
})(10);
数组
数组的基础结构
数组也是对象数据类型的
typeof [] -> 'object'
数组也有属性名,只不过属性名是数字,我们把数字属性名称称之为它的索引:数组是以数字微索引,索引从0开始,有一个length属性戴白哦数组的长度。
类数组 : 类似于数组,但是不是数组
1 通过getElementsByTagName获取的元素集合
2 函数中实参集合arguments
数组的遍历
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
}
for(var key in arr){
//key:属性名(数组中的属性名是索引)
console.log(arr[key]);
}
// 区别 for循环只能遍历到数组私有的一些属性,而for in循环可以把一些自定义的公共属性也能遍历到
数组中的常用方法
数组中有很多常用方法
console.dir(Array.prototype)
1 方法的意义和作用
2 方法的形参
3 方法的返回值
4 通过此方法,原来的数组是否发生了改变
实现数组的增加、修改、删除
var arr=[1,2,3];
//增加
//
/* 1 push:向数组的末尾追加新内容
* 参数:一到多个,何数据类型都可以,想要给数组末尾追加什么,直接传递到push方法即可,传递多个用逗号隔开;
* 返回值:新增后数组的长度
* 原有数组改变
* /
/*
*2 unshift:向数组开头追加新内容
* 参数:需要追加的内容(可以是多个数据类型的值)
* 返回值 :新增后数组的长度
* 原来数组改变了
*/
/*
*3 把数组当成一个普通的对象,使用对象键值对的操作,给其设置新的属性(索引)
*arr[arr.length]='XXX' 向数组的末尾追加了新的内容
* 返回值 :新增后数组的长度
* 原来数组改变了
*/
//删除
/* 1 pop:向删除数组最后一项
* 参数:无;
* 返回值:被删除的那一项
* 原有数组改变了
* /
/* 2 shift:删除数组第一项
* 参数:无;
* 返回值:被删除的那一项
* 原有数组改变了
* 使用shift删除第一项之后,后面的每一项的索引都要向前进一位(导致后面的索引发生改变)
* /
* 返回值 :新增后数组的长度
* 原来数组改变了
*/
/*
*3 把数组当成一个普通的对象,使用对象键值对的操作,给其设置新的属性(索引)
*delete 删除: `delete arr[索引]` 删除指定索引这一项 (当前索引删除后,原有数组其他项不会改变,当前数组的length不变)
* 原来数组改变了
*/
/*
*4 arr.length--;
* 原来数组改变了
*/
/*
*5 splice:数组中内置的方法,可以实现数组的增加、修改、删除;
* splice(n,m):从索引n开始删除m个(m不写是删除到数组末尾,n也不写)
* 返回值 :被删除的内容(以一个新数组保存到被删除的内容)
* 原来数组改变了
* splice(0)清空数组
* splice() 一项都不删除,返回一个新的空数组
*/
//修改
/*
*splice(n,m,x):在原有删除的基础上,用X代替删除的内容
*/
//增加
/*
*splice(n,0,x):在修改的基础上,我们一项都不删除,把X插入到索引n的前面;
* ary.splice(0,0,x)向数组的开头追加新的内容
* ary.splice(ary.length,0,x)向数组的末尾追加新的内容
* splice(0,1)删除第一项
* splice(arr.length-1)删除最后一项
*/