General
- 在JS中,对象相当于大部分语言的map,以键值对的形式存在
- 如果将值赋给为申明的变量,该变量将自动作为全局变量,即使在函数内执行。
1 | carname="Volvo"; // carname will be treated as global variable |
==
与===
区别- 对于 string、number 等基础类型,== 和 === 是有区别的
- 不同类型间比较,== 之比较 “转化成同一类型后的值” 看 “值” 是否相等,=== 如果类型不同,其结果就是不等。
- 同类型比较,直接进行 “值” 比较,两者结果一样。
- 对于 Array,Object 等高级类型,== 和 === 是没有区别的:进行 “指针地址” 比较
- 基础类型与高级类型,== 和 === 是有区别的
- 对于 ==,将高级转化为基础类型,进行 “值” 比较
- 因为类型不同,=== 结果为 false
- != 为 == 的非运算,!== 为 === 的非运算
- 对于 string、number 等基础类型,== 和 === 是有区别的
自调用
函数表达式可以 “自调用”。如果表达式后面紧跟 () ,则会自动调用。通过添加括号,来说明它是一个函数表达式
1 | (function () { |
- 闭包
1
2
3
4
5
6
7
8
9
10
11
12function f1(){
var n=999;
nAdd=function(){n+=1} // nAdd 前没有关键字,相当于全局函数
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
ES2015
新增箭头函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 传统定义函数方式
function Test () {
//
}
const Test = function () {
//
}
// 使用箭头函数定义函数时可以省略 function 关键字
const Test = (...params) => {
//
}
// 该函数只有一个参数时可以简写成:
const Test = param => {
return param;
}新增
let
修饰符:let
是修复了var
的作用域的一些bug,变的更加好用。let
是更好的var
。var
的作用于是函数作用于,而let
是块级别(大括号括起来的内容)。https://www.zhihu.com/question/52662013
其他
for...in
andfor...of
一般使用for...of
来遍历整个数组,for...in
会多遍历一个Array.Prototype
属性。arguments
Javascript中函数可以访问一个叫arguments的隐含变量。1
2
3
4
5
6
7
8
9function add() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum;
}
add(2, 3, 4, 5); // 14apply()
andcall()
call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。比如,可以通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。以下通过apply
实现对象的继承1
2
3
4
5
6
7
8
9
10
11
12var Parent = function(){
this.name = "yjc";
this.age = 22;
}
var child = {};
console.log(child);//Object {} ,空对象
Parent.call(child);
console.log(child); //Object {name: "yjc", age: 22}