ES6的全局变量
全局对象是最顶层的对象,在浏览器环境下是window对象,在NODE中指的是global对象。在ES5中全局对象的属性和全局变量是等价的。在ES6的模块环境中,全局变量必须显式声明称global对象的属性。
1 | window.a = 1; |
这种规定很容易不知不觉创建出了全局变量,ES6为了改变这一点,一方面规定,var命令和function命令声明的全局变量依然是全局对象的属性,同时也规定,let/const/class命令声明的全局变量不属于全局对象的属性。
1 | var a = 1; |
ES6块级作用域中,声明式函数(function f(){})可以在全局使用,表达式函数不可以
new关键字主要做了什么事:
- `this.__proto__ = 构造函数.prototype`
- `构造函数.prototype.constructor = 构造函数`
- `return this`
PS: 如果构造函数有返回值,且返回简单类型的值,会被忽略
null和undefined
undefined
undefined
不是关键字,不是标识符,是一个全局变量,值为undefined
1
2console.log(Object.getOwnPropertyDescriptor(window,undefined));
// {value: undefined, writable: false, enumerable: false, configurable: false}
通过上面的代码可知全局变量的undefined
是不可修改不可枚举不配置的,但是可以在局部声明一个新的变量叫undefined
;1
2
3
4
5
6function a(){
var undefined=10;
console.log(window.undefined); // undefined
console.log(undefined);// 10
}
a();
上面的代码如果出现在项目中会造成一定的问题,为防手误,要做好代码检查。
null
null
是Null
类型的唯一值,typeof null
返回object
,因为特殊值null
被认为是一个空对象的引用(指针)【null作为js中七种类型之一,是唯一一个typeof返回的不是自身类型的,贼奇葩】。
所以如果一个值准备存储对象,最好将该变量初始化为null
,null==undefined
为true
(自动转换),null===undefined
为false
(三等要求类型相同)。
setTimout
setTimeout从第三个参数起,用来给第一个参数传参1
2
3
4setTimeout(function(a,b){
console.log(a,b);
},1000,10,20);
// 1s之后打印10 20
javascript多行字符串
1 |
|
使用label语法,跳出多层循环, JavaScript 没有 goto 语句,label标记只能和 break 或 continue 一起使用
1 | label:for(var i=0;i<5;i++){ |
typeof NaN
为number,所有数值类型(包括无穷大)只有NaN和0转换为布尔值时为falseswitch语句在比较值时使用的是全等操作,不会发生类型转换
回调函数:很多人都以为回调函数是异步的,其实与是否同步异步没有关系,是同步还是异步取决于是否需要等待执行结果
- 正向代理:为客户端提供代理的是正向代理
- 反向代理:为服务端提供代理的是反向代理
- 所谓面向对象就是定义了写代码的套路,继承是为了复用代码,封装是为了隐藏细节,多态是为了让代码更灵活,如果面向对象是宗教,你是什么教的