1:变量,创建变量的几种方式
var、function、let、const 、import、class
import: 基于es6的模块规范导出需要的信息
class:基于es6创建类
2:变量命名
严格区分大小写、遵循驼峰命名法、下划线在前边一般都是公共变量,$开头一般是存储的是jq元素(不能以数字开头、不能是关键字、)
3:js 数值类型
基本数据类型:number \ string \ boolean \ null \ undefined
NAN 代表的不是一个数字,但是类型属于number
引用数据类型:普通的对象、日期对象、数组对象、正则对象、
es6新增的数据类型symbol(唯一的值)
4:isNaN :
基本数据类型先将对象的值用Number()转换,再调用isNaN,字符串中出现任何非有效数字字 符均为 NaN
引用数据类型,先调用toString转为字符串,然后再把字符串调用Number转为数字
Number(true) ->1
Number(false) ->0
Number(null) ->0
Number(undefined) -> NaN
对象:
({}).toString() = "[object Object]" ->NaN
数组:
([12,23]).toString() = "12,23" ->NaN
([12]).toString() = "12" ->12
正则、函数:都是NaN
isNaN([]) -> false 因为Number(" ") =0; ([]).toString = " ";
5:Number() 和parseInt() parseFloat()
共同点:都是为了将其他类型的值转为数字类型,
区别:Number出现任何非有效数字字符,结果就是NaN,parseInt把一个字符串中的整数部分解析出来,parseFloat是将字符串中的小数部分(浮点数)解析出来
6:如何将其他数据类型转为布尔类型 Boolean、!、!!
Boolean(1) -> 数字类型的只有0和NaN返回false,其他都是true
! -> 取反:先把其他数据类型转为布尔类型,再取反
!!->两次取反,相当于直接转换布尔类型
在js数据类型中只有0/" "空字符串/null / undefined/ NaN 这五种返回false,其余都转换成true;
7: null和undefined
null: 空对象指针,一般都是意料之中的没有(人为先赋值为null,后面程序中再赋值)
undefined: 未定义,代表没有,一般都不是人为手动控制的,大多数都是浏览器自主为空(后面可以赋值也可以不赋值)
8:对象数据类型(对象由键值对组成的)
键值对的操作:
1)【获取值】,obj.name、obj['name'] 一般来说,对象的属性名 都是字符串格式的;
2)【增/改】js对象中属性名是不允许重复的,是唯一的
3)【删】
彻底删除,对象中不存在这个属性了
delete
假删除,并没有移除这个属性,只是这个属性值为空
obj.name = null;
在获取属性值时候,如果当前对象有这个属性名,则可以正常获取到值,哪怕是null,如果没有这个属性名,则获取值为undefined;
属性名只能是字符串或数字类型,如果不是,则先转为字符串(toString),然后再进行存储,
获取值时,也是先将其他类型值转为字符串再取值;
4)数组,数组的属性名是数字
9)js的运行机制
1)当浏览器(它的内核/引擎)渲染和解析js 的时候会提供一个供js运行的环境,我们把这个环境称之为“全局作用域(global / window scope)”
2)代码自上而下执行(之前会有个变量提升过程)
基本数据类型会存储在当前作用域下;
var a= 1;
1:开辟一个空间存储1
2:在当前作用域声名一个变量a(var a)
3:让声名的变量和存储的1关联起来(把1赋值给a,赋值操作叫定义)
@:基本数据类型(也叫值类型),是按照值来操作的,是将之前的值复制一份,放到新的空间或位置上,之后的操作和之前的值没有关系,按值操作就是为了让两个空间没有任何关系
@:引用数据类型不能直接存储在当前作用域下(因为存储的数据可能过于复杂)我们需要开辟一个新的空间(理解为仓库),把内容存储在这个空间中;
var obj1 = { a: 1};
1:首先开辟一个内存空间,将键值对依次存储起来(为了后面能找到这个空间,此空间有个16进制的地址)
2:声名一个变量
3:让变量和空间地址关联起来(把空间地址赋值给变量)
引用类型不是按值来操作的,它操作的是空间的引用地址,把原来空间的地址赋值给新的变量,但是原来的空间没有被复制,还是一个空间,这样就会出现多个变量关联的是相同的空间,相互之间就会存在影响了