javascript笔记之搞不懂的你

ES6的全局变量

全局对象是最顶层的对象,在浏览器环境下是window对象,在NODE中指的是global对象。在ES5中全局对象的属性和全局变量是等价的。在ES6的模块环境中,全局变量必须显式声明称global对象的属性。

1
2
3
4
5
window.a = 1;
a // 1

a = 2;
window.a // 2

这种规定很容易不知不觉创建出了全局变量,ES6为了改变这一点,一方面规定,var命令和function命令声明的全局变量依然是全局对象的属性,同时也规定,let/const/class命令声明的全局变量不属于全局对象的属性。

1
2
3
4
5
var a = 1;
window.a // 1

let b = 1;
window.b // undefined

ES6块级作用域中,声明式函数(function f(){})可以在全局使用,表达式函数不可以

new关键字主要做了什么事:

- `this.__proto__ = 构造函数.prototype`
- `构造函数.prototype.constructor = 构造函数`
- `return this`
PS: 如果构造函数有返回值,且返回简单类型的值,会被忽略

null和undefined

undefined

undefined不是关键字,不是标识符,是一个全局变量,值为undefined

1
2
console.log(Object.getOwnPropertyDescriptor(window,undefined));
// {value: undefined, writable: false, enumerable: false, configurable: false}

通过上面的代码可知全局变量的undefined是不可修改不可枚举不配置的,但是可以在局部声明一个新的变量叫undefined

1
2
3
4
5
6
function a(){
var undefined=10;
console.log(window.undefined); // undefined
console.log(undefined);// 10
}
a();

上面的代码如果出现在项目中会造成一定的问题,为防手误,要做好代码检查。

null

nullNull类型的唯一值,typeof null返回object,因为特殊值null被认为是一个空对象的引用(指针)【null作为js中七种类型之一,是唯一一个typeof返回的不是自身类型的,贼奇葩】。

所以如果一个值准备存储对象,最好将该变量初始化为nullnull==undefinedtrue(自动转换),null===undefinedfalse(三等要求类型相同)。

setTimout

setTimeout从第三个参数起,用来给第一个参数传参

1
2
3
4
setTimeout(function(a,b){
console.log(a,b);
},1000,10,20);
// 1s之后打印10 20

javascript多行字符串

1
2
3
4
5
6
7
8
9
10

var str = "当我们能够熟练运用\
React进行前端开发时,\
不免会对React内部机制产生浓厚的兴趣。\
组件是什么?\
是真的DOM吗?\
生命周期函数的执行依据又是什么呢?"

console.log(str);
// 当我们能够熟练运用React进行前端开发时,不免会对React内部机制产生浓厚的兴趣。组件是什么?是真的DOM吗?生命周期函数的执行依据又是什么呢?

使用label语法,跳出多层循环, JavaScript 没有 goto 语句,label标记只能和 break 或 continue 一起使用

1
2
3
4
5
6
7
8
9
label:for(var i=0;i<5;i++){
for(var j=0;j<5;j++){
if(i==4){
// break label;
continue label;
}
console.log(i);
}
}
  • typeof NaN为number,所有数值类型(包括无穷大)只有NaN和0转换为布尔值时为false
  • switch语句在比较值时使用的是全等操作,不会发生类型转换

  • 回调函数:很多人都以为回调函数是异步的,其实与是否同步异步没有关系,是同步还是异步取决于是否需要等待执行结果

  • 正向代理:为客户端提供代理的是正向代理
  • 反向代理:为服务端提供代理的是反向代理
  • 所谓面向对象就是定义了写代码的套路,继承是为了复用代码,封装是为了隐藏细节,多态是为了让代码更灵活,如果面向对象是宗教,你是什么教的