JS代码分别为:混合模式和严格模式
如果js代码中出现了'use strict' 此时为严格模式 严格模式有两种:全局声明,函数内声明
严格模式
1.全局声明:在script标签中最上面,整个script标签内部都是属于全局的严格模式 2.函数声明:在含糊中使用'use strict' 是函数内的严格模式
1.全局的严格模式
'use strict'
2.函数内声明(IIFE)
function f1(){
'use strict'
console.log('123')
}
f1();
- 必须使用 var 声明变量,不允许使用未声明的变量
eval()是一个函数
对传输的参数进行解析代码并执行
- 严格模式下面的eval产生的作用域会报错
函数内部不能有重复的形参
function f1(a,b,c,a){
console.log(a,b,c,a)// a:40 b:20 c:30
}
f1(10,20,30,40)
什么是对象?
- 对象: 是值某个事物具有特征或者行为的就是对象
特征--->属性
行为--->方法
创建对象,根据一个类别来创建
遍历对象通过for(in)来遍历对象中的数据
Object.create(prototype,[descriptors])
可以创建新的对象,新的对象是原创建对象的时候传入的对象的子对象(新对象和原对象是继承的关系),所以obj2是obj1的子对象
var obj1 = {
name:'卡卡西',
age:20
}
var obj2 = Object.create(obj1);
语法: Object.create(prototype,[descriptors]) 属性:
- value 设置属性的默认值
- writable 设置当前的属性是否可以被修改,默认是false 不能改变
- configurable 设置当前的属性是否可以被删除,默认是false,不能被删除
- enumerable 设置当前的属性是否可以被遍历,默认是false,不允许遍历
- get 访问器,如果外部通过obj2.gender方法来获取当前这个gender属性值的时候,会自动的进入到get方法中
-
get不能和value和writable一起使用,会出现冲突报错
-
什么时候使用Object.create()方法? 如果向往单签的对象和其他对象是继承关系,同时大年的对象还需要添加一些可控制的属性
Object.defineProperties(object,descriptors)
通过这个方法为当前对象添加一个新的属性
- object 要操作的对象
- descriptors 属性描述
- get
var obj = {
name: '强哥'
}
// 可以为当前的对象添加一个新属性
Object.defineProperties(obj,{
age:{
value:20, //何止当前的age属性的默认值
writable:false,//是否可以修改当前这个属性的值,fl
}
})
- Object.defineProperties方法与Object.create方法用法一致 总结:如果需要为当前的对象添加新的属性,可以使用Object.defineProperties方法,并且里面的配置对象的属性方法基本上一致。
面向对象
面向对象是一种编程思想,突出需求,抽象出对象,通过对象调用属性或者方法,实现相关的需求,注重的是结果 面向对象的特性:封装,多态,继承,(抽象性)
- 封装:
- 继承:
- 多态:
ES5 新增的数组方法
- indexOf() 查询数组(对象)中的某个数据,如果存在则返回对应数组下标(索引值),如果不存在则返回-1 lastIndexOf()
- map() 遍历数据 默认遍历数组中的每个数据,设置新的数据后,返回的是一个新的数组(需要声明变量来接受返回的数据)
var arr2 = [10,20,30,40];
var arr3 = arr2.map(function(item,index){
return item * 2
})
console.log(arr3)//20-40-60-80
- filter() 过滤数组中的每个数据 只要数组中的数据满足判断条件,则将满足的数据放入到一个新的数组中
var arr4 =[1,2,3,4];
var arr5 = arr4.filter(function(item,index){
return item % 2 === 0;
})
关于this的指向
1.call 2.apply 3.bind
- 总结:apply和call和bind方法都可以改变this的指向,但是,apply和call在调用的时候,会直接执行
- bind 在调用的时候,需要接收,接收后的内容就是之前的函数(方法),再次调用才能够执行 call、apply、bind都属于大写Function的方法,只要是函数就会可以使用这三个方法 call的应用场景,借用构造函数,实现继承
var Person(name,age){
this.name = name;
this.age = age;
}
function Student(name,age){
//借用
Person.call(this,name,age)
}
vat stu = new Student('小明',20)
原型回顾
原型:是对象,有两个原型对象
- prototype 显示原型,浏览器的标准属性,程序猿专用
- proto 隐式原型,浏览器的非标签属性,浏览器专用
- 对象中必然有__proto__
- 函数中必然有prototype
- 函数也是对象,所以,函数中有__proto__,也有prototype
- 实例对象的__proto__指向必然是所在的构造函数中的prototype
ES6介绍
let关键字 1.不允许重复声明 2.拥有块级作用域
js中没有块级作用域,但let可以实现块级作用域
3.let不存在变量的提升---预解析 4.let不影响作用域链