变量提升(预解析):
在
当前作用域
中 js代码自上而下执行之前,浏览器首先会把带‘var’或者 ‘function’
关键字的进行提前的‘声明或定义’
。声明(declare):var num;在当前作用域声明
定义(defined):num=12;给声明的变量附一个值
全局作用域:
window
global
变量和常量能存任何数据类型
number
string
boolean
null
undefined
普通对象
(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/charCodeAt
charAt
根据索引
获取指定位置的字符
,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' |
substring
slice支持负数索引
,而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"