数据类型、变量、作用域

1.数据类型

基本数据类型:number   string  boolean    null  undefind   symbol
引用数据类型:Array   Object  RegExp

2.数据类型检测

 typeof问题:不能细分引用数据类型,打印出来都是object
 instanceof:当前这个对象属于某个类。当前这个对象只要是在它的原型链上永远都是true    
 construtor:打印出对象所属的类。给这个类的construtor自己赋值的时候就会出问题
 Object.prototype.toString.call()   打印当前实例this所属类的详细信息要检测谁this指向谁

3.number

1.isNaN  判断 (检测的内容)检测内容是不是有效数字 is not a NaN 。
  如果不是有效数字,返回true,是一个有效数字false;
  如果要检测的内容不是数字类型的,先转为数字类型再判断(Number())
2.Number(null)返回0  Number(undefined) 返回NaN  //true  
Number(‘’)  返回0  Number(false) 返回 0
Number()强制转换,将其他的类型,转为Number类型 如果要检测字符串,字符串中必须全是数字,返回false,否则返回true
parseInt()  非强制转换    从左到右依次查找是数字继续查找。
 遇到有个字符不是有效数字,就停止查找,直接返回之前查找的数字
parseFloat()  非强制转换  只能多识别一个点.

4.boolean

1. !一个叹号,取反  先转为bool类型再取反,0 null undefined  NaN ""  这五个值取反为true其他都是false
2.!!相当于直接转为boolean类型
3.Boolean()强制类型转换  等价于 !! 方法执行的结果为true和false

5.Function

1)函数执行的四阶段
   -  形成一个私有的作用域
   - 给形参赋值
   - 预解释
   - 代码从上到下执行 

2)函数的对象的关系
   - 所有的函数都是Function这个类中的实例
   - 所有的对象都是Object类中的实例
   - object所有的类都是Function这个类的实例
   - 所有的函数都是Object这个类的实例
   - apply()
    1.第一个参数用来改变this指向,第二个参数是数组,从左到右依次赋值
    2.当aplly改完this指向,传完参数后,让apply前面的函数立即执行
   - bind()预处理机制
      先把bind前面的函数中的this指向改变。参数传了,然后返回一个修改后的函数,需要的时候调用。
3)函数返回值出现undefined的情况
    没有return    写了return但没有赋值

6.Array数组中的方法

1.push() 向数组的末尾添加一项,返回值是添加内容后的长度,原数组发生改变。
2.pop()   数组的末尾删除一项,返回值是删除内容后的长度,原数组发生改变。
3.unshift() 向数组的最开始位置添加一项,参数是要添加的内容,返回增加后数组的长度,原数组发生改变。
4.shift() 删除数组第一项,返回被删除的一项,原数组发生改变。
5.splice(n,m)从索引n开始,删除m项;返回删除的元素,以新数组的形式返回。
     splice(n) 从索引n开始,删除到末尾
     splice()没有删除元素,原来数组不发生改变;
     splice(n,m,x)从索引n开始删除m个用x替换删除的元素。
     splice(n,0,x) 在索引n的前面增加一项;
     splice(0) 克隆   slice(0) 克隆    slice()克隆  ary.concat ()克隆

原数组不发生改变:
6.slice(n,m) 从索引n开始,截取到索引为m处;
7.concat() 拼接数组
  1)toString()数组转字符串 ,元数组不发生改变;
  2)join()  eval() 一起用,join进行分割,eval是将字符串转成js代码执行;
8.sort()排序,只能排0-9之间的数字  sort(function(a,b){return a-b;})
9.revrse()  倒叙排列数组,原数组发生改变
10.常用不兼容的方法:
indexof()根据内容找第一次出现时的索引。
lastIndexof()   内容出现最后一项的索引;
11. ary.map()用来遍历数组中的每一项;
12. ary.forEach()用来遍历数组中的每一项;    map有返回值,forEch没有返回值;

7.字符串常用的方法

1.charAt(索引) 通过索引找到对应的字符(通过索引找字符)
2.charCodeAt(索引)通过索引找到对应字符的unicode编码
3.indexof(字符) 通过字符找出出现第一次的索引
4.lastIndexof(字符) 通过字符找出出现最后一次的索引(通过字符找索引)
5.字符串截取
  5.1 substr(n,m) 从索引n开始截取m个字符
  5.2 substring(n,m) 从索引n开始截取到m处
  5.3 slice  从索引n开始截取到m处
6.转大小写:
  6.1 toLowerCase    大写转小写
  6.2 toUperCase      小写转大写
7.replace(旧,新);字符串替换
8.split(分隔符) 根据分隔符把字符串转成数组
9.macth(字符 ) 返回字符的详细信息
10.search()和indexof一样,可以放正则 返回索引,找不到返回-1

8.数据类型之间的转化

相同的数据类型直接比较,对象特殊,返回false
*  对象==对象  返回false
*  对象==字符串  [1,2,3].toString()=="1,2,3" 对象先转为字符串(.toString())方法,然后再比较
*  对象==数字  对象先转为字符串再转为数字,转为数字类型执行的是Number();
*  对象==布尔    对象先转为字符串,再转为数字,布尔直接转为数字    true 返回1  false  返回0
*  布尔==字符串  布尔转数字,字符串也转数字。 ‘’空字符串返回的是0
*  布尔==数字    布尔转数字
*  数字==字符串    字符串转数字
*  null==undefined    返回true
*  null或者undefined任何比较返回的都是false
*  对象转为字符串永远是[object Object]
*  对象转字符串再转数字,字符串直接转数字,布尔也是

变量笔记

1.命名

匈牙利命名法:变量名=类型+对象描述
命名规则:
  1)首字符字母或者下划线
  2)字母数字下划线
  3)不能使用关键字和保留字
声明变量:
  1)不能没有变量  重复声明  隐式声明  不声明直接赋值
  2)先声明,后读写   先赋值,后运算
  3)var let const

2.变量类型

基本数据类型:
  1. 占用空间固定,保存在栈中
  2.保存与赋值的值本身
  3.使用typeof检测数据的类型
  4.基本数据类型是值的类型
引用数据类型:
  1.占用空间不固定,保存在堆中
  2.保存与复制的是指向对象的一个指针
  3.使用instanceof检测数据的类型
  4.使用new()方法构造出的对象的引用型

作用域笔记

1.作用域

全局变量:
包含:在函数体外定义的变量
      在函数体内部定义的无var的变量
调用:任何位置

局部变量:
包含:在函数内部使用var声明的变量
     函数的参数变量
调用:当前函数体内部

作用域的优先级:
局部变量>同名参数变量>同名全局变量
局部变量高于同名全局变量
参数变量高于同名全局变量
局部变量高于同名参数变量

作用域的特征:
全局变量是全局对象的属性
局部变量是调用对象的属性
作用域链: 内层函数可访问外层函数局部变量
         外层函数不能访问内层函数局部变量

声明周期:
 全局变量:除非被显示删除,否则一直存在
 局部变量:自声明起至函数运行完毕或显示删除
 回收机制: 标记清除  引用计数

你可能感兴趣的:(数据类型、变量、作用域)