变量须要声明,而且建议在声明的同时进行初始化,以下所示:node
var aa = '1'; let bb = 2; const CC = 3;
若是从新声明变量,该变量的值不会丢失程序员
var aa = 'cc'; var aa; //此时的值仍是cc
变量名(标志符)命名要求:es6
_
及美圆符$
组成true
、false
、null
、(eval
、arguments
严格模式下)undefined
虽然不会报错,可是并不能声明成功,不管给它初始化为何,它的值仍然为undefined
_
与$
)Object
的实例,因此可使用 xx instanceof Object
来判断是否为引用类型的值,若是是则会返回true
,不然返回false
存储方式segmentfault
OS
回收)访问方式数组
复制变量值浏览器
//基本类型赋值 var num1 = 10; var num2 = num1; console.log(num1,num2);// 10, 10 num2 = 100; console.log(num1,num2);// 10, 100 //引用类型赋值 //person2拷贝了person1的引用地址,因此person1和person2实际上指向的是同一个对象 //因此改变person2会影响到person1 var person1 = { name:'cc' }; var person2 = person1; console.log(person1.name, person2.name);// cc, cc person2.name = 'cshine'; console.log(person1.name, person2.name);// cshine, cshine var arr1 = [1,2,3]; var arr2 = arr1; console.log(arr1, arr2);// [1, 2, 3], [1, 2, 3] arr2[1]= 'string'; console.log(arr1, arr2);// [1, "string", 3], [1, "string", 3]
传递参数函数
ECMAScript
中全部的函数的参数都是按值传递,即便是引用类型值的传递也是按值传递 arguments
中的一个元素)es6
新增了let
和const
命令用来声明变量操作系统
let
命令,它的用法相似于var
,可是所声明的变量,只在let
命令所在的块级做用域内有效,且在该块级做用域内不可重复声明const
声明一个只读的常量,一旦声明,常量的值就不能改变,与let
同样,只在声明所在的块级做用域内有效,且在该块级做用域内不可重复声明const
实际上保证的,并非变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,所以等同于常量。但对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个引用地址(指针),const
只能保证这个引用地址(指针)是固定的,至于它指向的堆内存中的存储的值是否是可变的,就彻底不能控制了。所以,将一个对象声明为常量必须很是当心。var
/let
/const
进行声明,此时建立的变量为全局变量,尽可能不要这样作! var
命令和function
命令声明的全局变量,是顶层对象的属性,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性(浏览器中为window
,node
中为global
)var
/let
来讲,只声明而未初始化,此时变量存储的信息是“空”的,也就是undefined
;可是对于const
来讲,只声明而不进行初始化是不容许的,会抛出Missing initializer in const declaration
的错误,由于const
定义的是常量,一旦定义便不可更改。hoisting
)var
命令声明的变量会发生”声明提高“现象,即变量能够在声明以前使用,值为undefined
;设计
console.log(aa);// undefined var aa = 'string'; console.log(aa);// string
function
声明的函数也会发生”声明提高“现象,函数在声明以前可使用,值为指向该函数的指针;可是若是是在支持ES6
的环境中,ES6
容许在块级做用域内声明函数,此时在块级做用域中声明的函数,会提高到所在的块级做用域的头部,值为整个函数块,同时还会提高到块级做用域外,可是值为undefined
。(环境致使块级做用域内声明函数的行为差别很是大,因此应该避免在块级做用域内声明函数。若是确实须要,也应该写成函数表达式,而不是函数声明语句)指针
console.log(fn);// ƒ fn(){} function fn(){} console.log(fn);// ƒ fn(){} //支持es6的环境中 console.log(fb);// undefined if(true){ console.log(fb); // ƒ fb(){} function fb(){} } console.log(fb);// ƒ fb(){} console.log(fc);// undefined if(false){ console.log(fc); // 未执行 function fc(){} } console.log(fc);// undefined fc() //Uncaught TypeError: fc is not a function
函数和变量都会声明提高,此时若函数名和变量名同名,函数名的优先级要高;可是正式执行代码时,同名函数会覆盖只声明却未赋值的变量,可是它不能覆盖声明且赋值的变量(缘由分析可见另外一篇文章JavaScript基础系列---执行环境与做用域链)
console.log(bb);// ƒ bb(){} var bb; function bb(){} console.log(bb);// ƒ bb(){} console.log(cc);// ƒ cc(){} var cc = 'string'; function cc(){} console.log(c)c;// string
function
块里面的变量/函数)也会声明提高,能够先使用后声明,不影响外部同名变量/函数let
和const
命令改变了语法行为,它们所声明的变量必定要在声明后使用,不然报错。因为let
和const
命令在当前块级做用域内不可重复声明因此当有同名函数时,会直接报错Identifier xx has already been declared