(1)ES6中let和var的区别
ES6一共有6种声明变量的方法。var
命令和function
命令、let
和const
命令,import
命令和class
命令。
-
ES6新增了
let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。let
实际上为JavaScript新增了块级作用域。var定义的变量是定义该变量的作用域中的局部变量。省略var时,则为全局变量。
-
let不
存在“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
-
只要块级作用域内存在
let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
上面代码中,存在全局变量tmp
,但是块级作用域内let
又声明了一个局部变量tmp
,导致后者绑定这个块级作用域,所以在let
声明变量前,对tmp
赋值会报错。ES6明确规定,如果区块中存在
let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
-
let不允许在相同作用域内,重复声明同一个变量。var可以。
备注:加一个常用于和let比较的命令:const
-
const
声明一个只读的常量。一旦声明,常量的值就不能改变。 -
const
声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。 -
const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。 -
const
命令声明的常量不提升,同样存在暂时性死区,只能在声明的位置后面使用。 -
const
声明的常量,也与let
一样不可重复声明。 -
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。
const
命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
const foo = {}; foo.prop = 123; foo.prop// 123 foo = {}; // TypeError: "foo" is read-only
上面代码中,常量foo
储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo
指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
(2)前端跨域有哪些方案?
协议,域名,端口号有一个不同就被称为跨域.
具体方案详见:http://blog.csdn.net/joyhen/article/details/21631833
(3)判断bar属性来自于foo对象本身还是非原型对象的方法是什么?
每当代码读取对象的某个属性时,会执行一次搜索,目标是给定名字的属性。搜索首先从对象实例本身开始,如果在实例中找到了给定的属性,则返回该属性的值, 如果没有找到,则继续搜索指针指向的原型对象,如果在原型对象中查找到该属性,则返回该属性的值。同时这也是多个实例共享原型所保存的属性和方法的基本原理。
hasOwnProperty()可以检测一个属性是存在于实例中,还是原型中。这个方法只在给定属性存在对象实例中时,返回True.
部分引用:http://es6.ruanyifeng.com/#docs/let