一.ES5
在2009年推出的新的语法
1).严格模式
使用use strict
,它又分为全局严格和局部严格
这句话必须放在代码的第一行
1).全局严格
// "use strict";//全局严格模式
function fn1() {
console.log(this); //undefined
}
fn1()
function fn2() {
console.log(this); //undefined
}
fn2()
2).局部严格
function fn1() {
"use strict"; //局部严格模式
console.log(this); //undefined
}
fn1()
function fn2() {
console.log(this); //window
}
fn2()
2.严格模式的注意事项
1). 使用变量必须使用 ‘关键字’ (var let const)
2). 禁止函数内的this指向全局对象 window
3). 禁止使用8进制, (不要写0开头的数字)
4). 不允许在非函数的代码块内声明函数
5). arguments与形参不同步 (不一致)
6). eval函数作用域
7). delete 删除window的属性报错
1). 声明变量使用关键字(var let const)
"use strict";
myname = "刘德华"; //ReferenceError: myname is not defined
console.log(myname);
2).禁止函数内的this指向全局对象 window
"use strict";
function fn() {
console.log(this); //undefined
}
fn()
3).禁止使用8进制, (不要写0开头的数字)
"use strict";
var a=099;
console.log(a);
//Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode.
4).不允许在非函数的代码块内声明函数
"use strict";
if (true) {
function fn() {
alert(123);
}
}
fn(); //Uncaught ReferenceError: fn is not defined
5.arguments与形参不同步 (不一致)
"use strict";
function fn(n) {
console.log(n);//100
n = 200;
console.log(arguments); // 100 依然是100
console.log(n);//200
}
6. eval函数作用域
eval()函数的作用,是把字符串解析成js代码
利用它实现 转json
var n = 10;
eval(' "use strict"; var n=20; console.log(n);');//20
console.log(n);//10
7).delete 变量 报错
"use strict";
var a = 100;
console.log(window.a);
delete window.a; //Uncaught TypeError: Cannot delete property 'a' of #<Window>
console.log(window.a); //没有被删除,还会报错
3.严格模式的好处
消除了代码一些不合理的地方
保证了代码的安全
提高了代码运行速度
二 ES5 bind 和call,apply
bind 是用于改变函数内部this
的指向,它不会立即执行函数
call 是用于改变函数内部this
的指向,它会立即执行当前函数,它有多个参数 (推荐使用,具体效率高于apply)
apply 是用于改变函数内部this
的指向,它会立即执行当前函数,第2个参数是数组
1).bind 的语法
只改变函数内部this的指向,不会执行该函数
function fn(a,b) {
console.log(this);//window
console.log(this.name);
console.log(a,b);//
}
fn.bind(person,"你好")("大家好");
2).call 的语法
有多个参数,会自动执行函数
function fn(a,b) {
console.log(this);//window
console.log(this.name);
console.log(a,b);//
}
fn.call(person,"你好call","2222")
3).apply的语法
第2个参数是一个数组,会自动执行函数
function fn(a,b) {
console.log(this);//window
console.log(this.name);
console.log(a,b);//
}
fn.apply(person,["你好apply","2222"])
4.与this相关的场景有哪些? (重点)
1.函数内部的this,默认是window
2.事件绑定函数,内部的this,默认是事件的绑定者
3.对象内部函数里头的this,指向当前的对象
4.定时器,延时器里的this,默认始终是window
5.bind,call,apply会改变this的 指向
6.严格模式下,函数内部的this,指向undefined
7.箭头函数内部的this,指向上下文对象(环境变量)
8.new 会改变构造函数内部this的指向
三.ES5数组的高阶函数
-
forEach 只能做遍历,不会被中断,可以异常结合
try..catch..finally
重点 -
Map 能做遍历,返回的是一个数组
-
some 只要有一个条件满足,就返回
true
,默认返回false
-
every所有的提交满足,才返回
true
,否则返回false
-
filter 返回条件满足的成员是 一个数组
-
reduce 一个参数是一个函数,函数内部有 pre,cur,index,arr 根据函数内部的retrun返回指定结果
二个参数,第2个参数是pre的初始值
四.ES6
ES6又称之为 EcmaScript 2015 ,因为是2015发布
1).let块级作用域
- 相同的变量名称,只能被声明一次
let myname="刘德华";
let myname="周杰伦"; //相同的变量名称,只能被声明一次
// Uncaught SyntaxError: Identifier 'myname' has already been declared
- 如果在代码块内声明的变量,只能在代码块内使用
{
let myname = "刘德华";
}
console.log(myname);//Uncaught ReferenceError: myname is not defined
- 防止变量的提升(预编译)
function fn() {
console.log(myname) //Cannot access 'myname' before initialization
let myname = "蔡徐坤";
console.log(myname);
}
fn();
- 使用let解决下标问题
var oBtns = document.querySelectorAll("button");// 5
for (let i = 0; i < oBtns.length; i++) {
oBtns[i].onclick = function () {
console.log(i); //下标解决了
}
}
2).const 常量,
-
如果声明的变量的值是值类型,不可以被修改
-
如果声明的变量的值是引用类,可以修改值,不能修改类型
值类型
const COOLMAN="老罗";
COOLMAN="谭扬帆";
console.log(COOLMAN);
//Uncaught TypeError: Assignment to constant variable.
引用类型
const COOLMAN = {
name: "谭扬帆",
sex: "男",
age: 18
}
COOLMAN.name="老罗"
console.log(COOLMAN);//老罗 类型没有被修改,对象的属性或者方法可以被修改
const 与let的相同点
可以避免变量的提升
也具备块级作用域
同一个变量只能声明一次
2.ES6-String新增方法
2.1 字符串的方法
- includes():返回布尔值,表示是否找到了参数字符串。
var str = "abc123";
//indexOf
console.log(str.indexOf("c") != -1); //true
console.log(str.includes("c")); //true
- startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
var str = "abc123";
console.log(str.startsWith("a"));//true
- endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var str = "abc123";
console.log(str.endsWith("3"));
- repeat(): 返回一个新字符串,表示将原字符串重复n次.
var str = "我爱你!";
console.log(str.repeat(100)); // 100次
2.2 字符串模板
var chars="不"
var str=`今天天气很${chars}好!`;
console.log(str);// 今天天气很不好!
3.ES6-Array新增
3.1 Array.from() 把伪数组,转换成真数组
第一个参数,伪数组
第二个参数,是一个回调函数,该回调函数内部写 逻辑并且返回内容
var arg = {
0: 100,
1: 200,
2: 300,
"a": 99,
length: 3
}
var arr = Array.from(arg,function (item) {
console.log(item);
return item*100;
});
console.log(arr); // [10000,20000,30000]
3.2 Array.of()把一组值转换成数组
var arr = Array.of(1, 3, 5, 7, 9);
console.log(arr);
3.3 find 根据条件,返回值
var oList = [
{ id: 1, name: "刘德华", age: 20 },
{ id: 2, name: "周杰伦", age: 18 },
{ id: 3, name: "蔡徐坤", age: 29 },
{ id: 4, name: "吴彦祖", age: 33 },
]
var strName = "杰"
var person = oList.find(function (item) {
return item.name.includes(strName)
})
console.log(person);
3.4 findIndex 根据条件,返回值的下标
//删除 带 '杰' 那个人的信息
// splice(index,1);
var oList = [
{ id: 1, name: "刘德华", age: 20 },
{ id: 2, name: "周杰伦", age: 18 },
{ id: 3, name: "蔡徐坤", age: 29 },
{ id: 4, name: "吴彦祖", age: 33 },
]
var strName = "杰"
var index = oList.findIndex(function (item) {
return item.name.includes(strName)
})
oList.splice(index, 1);
console.log(oList);
4. ES6-Function新增
4.1 函数的默认参数
function sayHello2(name='qianfeng'){
document.write(`Hello ${name}`); //注意引号
}
4.2 箭头函数(重点)
箭头函数,又叫做 拉姆达表达式 Lambda,是函数的语法糖,箭头函数一定是一个匿名函数
1.1计算2个数的和 普通函数
function calc(a, b) {
return a + b;
}
var res = calc(10, 20);
console.log(res);
1.2计算2个数的和 箭头函数
var calc = (a, b) => {
return a + b;
}
var res = calc(10, 20);
console.log(res);
2.1将一个数放大10被的普通函数
function show(n) {
return n * 10
}
2.2将一个数放大10被的箭头函数
var show = n => n * 10;
3.1返回一个对象的普通函数
function set(name) {
var obj = {};
obj.name = name;
return obj
}
3.2返回一个对象的普通的升级写法
function set(name) {
return { name };
}
3.3返回一个对象的箭头函数
var set = name => ({ name });
console.log(set("abc"));
4.箭头函数常见写法
var arr = [11, 22, 33, 44];
//升序
arr.sort((a, b) => a - b);
//降序
arr.sort((a, b) => b - a);
// 每个数放大10被
arr.map(item => item * 10);
...
5.箭头函数的this指向(重点)
箭头函数内部的this,默认是根据函数所在的运行函数(上下文对象 context ),在window下,this指向window.
在定时器和延时里,默认也是window,
在事件里,默认也是window
var Person = {
name: "刘德华",
showA: function () {
// console.log(this);//Person ,对象里的普通方法的this,指向当前对象
var fn = () => {
console.log(this);//Person 箭头函数的this,指向上下文对象(环境对象)
}
fn()
},
showB: () => {
// console.log(this);// window ,对象里的箭头函数的this,默认是window
var fn = () => {
console.log(this);//window 箭头函数的this,指向上下文对象(环境对象)
}
fn()
}
}
Person.showA();
Person.showB()
Person.showB.bind(Person)();// 箭头函数内部的this指向,不会被bind,call和apply改变
注意:
1.箭头函数内部的this指向,不会被bind,call和apply改变
2.箭头函数,不能被new实例化