1、变量和常量
变量:存储信息的容器,值可以改变。
变量声明:使用关键字var来声明变量;使用"="为变量赋值;未初始化的变量自动取值为"undefind";未声明和初始化变量,直接使用会报错;未声明仅初始化的变量,会自动创建为全局 变量;建议所有变量使用前都先声明。
变量命名规范:可包含数字、字母、下划线;不能以数字开头;常用于表示变量、函数、数组、对象的名称;名称最好语义化;不能使用保留字作为名称;推荐使用驼峰命名。
***ES6中,添加Let来声明变量。它的用法类似于var,但Let生命的变量只在当前代码块内有效。
常量:声明后值不能改变的量。
常量声明:使用const关键字声明一个常量,习惯上常量名使用全大写字母形式;一旦创建,值不可更改。
**声明提前:程序在正式执行前,会将所有var生命的变量和function生命的函数提前到当前作用域的顶部,但是变量的赋值和函数体会留在原位置。
**按值传递:两变量间赋值,或将变量作为函数参数传递时,都仅将变量的值或函数的参数值复制一份副本传递,不会改变原变量。
2、ES6新加Let声明方法同var声明的区别。
(1)let不存在声明提前现象。所有变量只能在声明后使用,否则会报错。
(2)暂时性死区:只要块级作用域内有let,那let声明的变量与该作用域外的变量无关,它只受let影响。该作用域内let声明的变量之前的声明和使用该变量都会报错。该代码块对let生命的变量形成了封闭区。
(3)let不允许在同一代码块内一个变量名声明多次。
**ES6规定,const声明不允许一个变量名声明多次;它也会形成暂时性死区;一旦成名必须立即初始化。
**ES6规定,var
命令和function
命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐步与全局对象的属性脱钩。
3、数据类型及其转换
数据类型:
原始类型:number、string、boolean、null、undefind
引用类型:object、math、date、error、function、array、Number、String、Boolean、 Regexp、Global
数据类型转换:
**js是弱类型语言:
声明变量是不需要规定变量存储的数据类型;
赋值时,才动态判断数据类型,同一变量可先后保存不用类型的值;
js会在需要时自动转换数据类型。
隐式转换:不需要程序员干预,js自动完成的类型转换。
(1)算数计算:一切数据都默认转为数字;"+"运算时,如果碰到字符串,则变成连字符,结果为字符串(字符串转换);若数值无法被转为数字 类型,则为"NAN"。
**NAN不大于,不小于,不等于任何数。NAN参与任何计算,结果都为 NAN。
!isNaN(x)判断x是否为数字,true为数字,false为非数字。
(2)关系运算:所有类型都转为数字再比较;若参与比较的两个数据都是字符串,则依次比较每个字符串的字符unicode号。
(3)逻辑运算:所有类型转为布尔类型。只有5个值转为false: "",NAN,undefind,null,0;其余转为true。
强制转换:程序员主动调用专门的函数,执行数据类 型转换。
***typeof(x)获得x的数据类型名称。
(1)转字符串:x.toString()或String(x);toString()不能转undefind和null;
String()相当于隐式转换。
****number.toString(n)转为n进制数
(2)转数字类型:Number(x),专用于将非字符串类型转数字;parseInt()自动从第一个字符开始读取每个数字,只要碰到第一个非数字字符就停止,自动跳过开头的空字符(取整);parseFloat()用法同parseInt()相同,取浮点数。
(3)boolean类型:Boolean()相当于隐式转换。
快速转换:x+""转为字符串;!!x转为boolean.
***undefind和null区别:
(1)undefind表示所有只声明为赋值的变量的默认值。在内存中占有空间。
(2)null表示变量赋值为null,用于释放内存,不在内存中占据空间。
undefind==null为true,但是undefind===null为false.
**ES6新增块级作用域:let生命的变量支队当前作用域有效。在块级作用域中可以声明函数,函数声明类似于var,即会提升到全局作用域或函数作用域的头部;同时,函数声明还会提升到所在的块级作用域的头部。