1.变量声明
未var 声明的变量为全局变量
'use strict';
在js代码首行表示在strict模式下运行js代码
未var的变量会报错
2.变量类型
number
NaN
Infinity
string
bool
对象
数组
null
undefined
多行字符串
233
344
222
map 数据类型
new Map()
var m = new Map([['kk',100],['ww',2000]]);
has()
get()
delete()
set()
set 数据类型
new Set(['233','333']);
add()
delete()
literable
ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型
可以用
for(var i of a)
记住是of
与for in的区别
for in循环属性(array 对象)
for of 循环元素(set map array)
3.函数
function functionname(parameter){
//do something;
}
3.1匿名函数
var x = function(parameter){}
x(parameter);
函数参数问题
自带 arguments关键字可以访问当前函数所有传入的参数,及时函数不需要这些参数
- 实际上arguments最常用于判断传入参数的个数
- ES6标准引入了rest参数
function abs(a,b,...rest){
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
3.2箭头函数
var f = (x,y)=>y+x;
alert(f(1,5));
3.3js行末自动加;
前面我们讲到了JavaScript引擎有一个在行末自动添加分号的机制
return
a;
无法return
所以正确的多行写法是:
function foo() {
return { // 这里不会自动加分号,因为{表示语句尚未结束
name: 'foo'
};
}
4.变量声明
变量提升
js扫描所有变量声明语句,提升到函数顶部
JavaScript引擎自动提升了变量的声明,但不会提升变量的赋值
全局
全局作用域
不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性
var x =2333;
console.log(window.x);
以变量方式var foo = function () {}定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到window对象
'use strict';
function foo() {
alert('foo');
}
foo(); // 直接调用foo()
window.foo(); // 通过window.foo()调用
局部作用域
由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的:
'use strict';
function foo() {
for (var i=0; i<100; i++) {
//
}
i += 100; // 仍然可以引用变量i
}
为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
'use strict';
function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
}
i += 1; // SyntaxError
}
5.对象方法
在一个方法内部,this是一个特殊变量,它始终指向当前对象
给对象加方法
var people = {
x:'222',
y:function(){
alert("2333");
}
}
people.y();
在函数内部this指向window(use strict)或者undefined(未使用use strict
指定this指向的对象可以使用两种方法
1. apply
function.apply(object,array);//array is arguments
2.call
function.call(object,arguments);//one by one
6.闭包
创建一个匿名函数并且立刻执行
console.log(function(X){
return X*X;
}(3);//9