变量提升(预解析):
在
当前作用域中 js代码自上而下执行之前,浏览器首先会把带‘var’或者 ‘function’关键字的进行提前的‘声明或定义’。声明(declare):var num;在当前作用域声明
定义(defined):num=12;给声明的变量附一个值
全局作用域:
windowglobal变量和常量能存任何数据类型
numberstringbooleannullundefined普通对象(json)数组/^$/ 正则Math 对象数据类型function 普通函数1 | var a=10; |
var a=12;
当前作用域中声明一个变量a,没有赋值是 undefined前作用域中开辟一个位置存储12进行关联
直接按值操作:把原有的值复制一份,放在新的空间位置上,和原来的值没有关系。 变量间相互不影响一个变量只能存一个值
创建一个变量(声明一个函数名和声明一个变量一样 ,如果两个变量名重复 是会冲突的);开辟一个新的内存空间,为了方便别的地方找到这个空间 会给空间分配一个16进制的地址 (16进制:0-9 a-f)按照一定顺序,把对象中的键值对存到内存空间
操作的是空间的引用地址:把原来空间地址赋值给新变量,但是空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响
Math称为数学函数,但是它属于对象类型typeof Math =》 ‘object’
之所以叫做数学函数,因为Math这个对象中提供了很多操作数字的方法
abs: 取绝对值,ceil/floor: 向上/向下取整1 | Math.ceil(10.01) =>11 |
round: 四舍五入(正数.5向上,负数.5向下)sqrt: 开平方pow: 取幂 (n的m次方)1 | Math.pow(2,10) =>1024 |
max/min: 取最大值、取最小值1 | Math.max(1,2,3,4) //4 |
PI:获取圆周率random:获取0-1之间的随机小数Math.round(Math.random()*(m-n)+n):获取n->m之间的随机正整数
基本数据类型的,字符串的每一次操作都是直接的对值进行操作,不像数组是基于空间地址来操作的,所以不存在原有字符串是否改变的问题,肯定都是不变的在
JS中所有用单引号或者双引号包起来的都是字符串,每一个字符串都由0到多个字符组成字符串中的每一个字符都有一个自己对应的位置的索引,也有类似于数组一样的
length代表自己的长度
1 | var str='abcdefghijk' |
charAt/charCodeAtcharAt 根据索引获取指定位置的字符,charCodeAt不是获取索引对应的字符,它获取的是索引对应的字符的Unicode编码值(ASC II码值)索引不存在的时候,str[x] 获取的结果是undefined,运行机制和对象是一样的,而charAt(x)获取的结果是空字符串String.fromCharCode(108) => 'l'1 | var str='liyapei'; |
indexOf / lastIndexOf这两个方法不支持IE低版本浏览器(IE6,7,8)
第一次或者最后一次出现位置的索引,有这个字符,返回大于等于0的索引,如果没有返回-1,基于这两个方法可以验证当前字符串中是否包含某一个字符slice 查找n开始找到索引为m处(包含n不包含m),把找到的字符当做新字符串返回数组的slice操作是一样的不写m是查找到字符串的末尾n/m 都不写是字符串的克隆负数索引;用字符串的总长度+负数索引做运算1 | var str = 'liyapeiaixuexi' |
substringslice支持负数索引,而substring不支持负数索引负数索引返回 空字符串
1 | var str = 'liyapeiaixuexi' |
数组去重1、依次拿出数组中的每一项(
排除最后一项:最后一项后面没有需要比较的内容)2、和当前拿出项
后面的每一项依次比较3、如果发现有重复的,我们把找到的这个
重复项在原数组中删除掉(splice)4、
i--防止数组塌陷
1 | var arr=[1,2,3,2,3,4,3,4,5] |
数组也是
对象数据类型,也是由键值对组成的1、以数字作为索引(属性名),
索引从0开始递增2、有一个
length的属性存储的是数组的长度数组中每一项都可以是任何数据类型
arr[0] 获取第一项
arr[arr.length-1] 获取最后一项
splice改变、slice查找
1.1-1.4新增返回长度,删除返回删除项
slice参数都是索引值
1 | var arr=[12,12,15] |
具备一定功能的方法
函数诞生的目的就是为了实现封装:**把现实一个功能的代码封装到一个函数中,后期想要实现这个功能,只需要把函数执行即可,不必再次编写重复的代码,起到低耦合高内聚(减少页面冗余代码,提高代码的重复使用率)的作用,我们把以上特点叫做函数封装**
OOP面向对象编程思想,需要我们掌握类的继承、封装、多态
1 | ES3: |
1 | function fn(){ |
12声明一个变量a进行关联一个变量只能存一个值
引用数据类型不能直接存储到当前作用域(因为存储的内容过于复杂),我们需要新开辟一个空间把内容存储在这个空间中
1、先创建一个变量(声明一个函数名和声明一个变量一样 ,如果两个变量名重复 是会冲突的)
2、浏览器为其开辟一个新的内存空间,为了方便别的地方找到这个空间 会给空间分配一个16进制的地址 (16进制:0-9 a-f)
3、按照一定顺序,把对象中的键值对存到内存空间
4、把开辟内存的地址赋值给变量(或者其他的东西比如事件),以后变量就可以通过地址找到内存空间然后进行操作
操作的是空间的引用地址:把原来空间地址赋值给新变量,但是空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响
栈内存:本身就是一个供js代码执行的环境,所有的基本数据类型都会在栈内存中开辟一个位置进行存储;作用域就是一个栈内存堆内存:用来存储引用类型中的信息值的,对象存储的是键值对,函数存储的是代码字符串+的 数学运算和字符拼接1、当表达式中出现字符串,就是字符串拼接否则是数学运算
2、数学运算:遇到的只要不是字符串都先转化为数字
3、字符串拼接:遇到的只要不是字符串都先调用toString方法转为字符串
4、在对象数据类型的数学运算中除了普通对象,其他的都是先转字符串再进行字符串拼接
没有字符串,但是引用数据类型转为数字,先转为了字符串,所以变为了字符串拼接,(在对象数据类型中除了普通对象,其他的都是先转字符串再进行字符串拼接)这些输出是控制台直接输出,console.log结果是"[object Object]10"