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

数组中的常用方法

数组中有很多常用方法
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)删除最后一项
*/

你可能感兴趣的:(JS基础知识)