严格模式
/**
严格模式与混杂模式对立, 要尽量避免混杂模式
混杂模式(即常规模式)
'use strict'
使用严格模式后:
1. 声明变量 必须使用变量修饰符 如 var let const , 直接 i = 100 , console.log(i) 会报错,非严格模式不会报错;
2. 八进制必须以0o开头, (如console.log(034) 就是八进制数据,以0开头的,就是八进制数据,javascript默认为八进制数据);
3. eval函数只能进行简单的数值运算。(而不使用严格模式, eval函数是可以识别多种运算符、和 var,let 等)
4. 严格模式不能删除变量, 而非严格模式可以删除 (var age = 18 , delete age 在非严格模式中可以使用)。
5. 严格模式没有this, 普通函数的this 指向window对象,而启用了严格模式后,this变为undefined。
*/
JSON
JSON 是字符串,独立于语言和平台。
具有 高度辨识? 、体积小、速度快的优点。
序列化 : JSON.stringify() ,内置一个参数(对象)
反序列化: JSON.parse(), ......,参数是json串
es5扩展 新建对象 和 给对象添加属性值 (不常用,只在特定场景下使用)
let obj = {
name:'Eric',
age:18,
sex:'男'
}
/**
es5 创建对象的方式
包含两个参数,第一个是原型对象,第二个是一个描述
描述是一个对象,对象中属性名所对应的属性值是一个对象,包含四个属性。
这样也是继承了原型对象的属性和方法;可以在新建对象的_proto_看到继承的属性和方法。
*/
let newObj = Object.create(obj,{
// 四个属性值默认均为false
address:{
value:'吉林', // 属性名所对应的值
writable:true, // 是否可修改
configurable:true, // 是否可以删除
enumerable:true // 是否可以枚举
}
})
console.log(newObj.age) // age 位于原型对象
console.log(newObj.sex)
delete newObj.address
console.log(newObj.address) // undefined
// 添加属性, 给obj2 新增 fullName 属性
let obj2 = {
firstName : '关',
lastName: '羽'
}
// defineProperties 包含两个参数, 第一个参数为原型对象,第二个为描述。
// 描述中的键 对应一个对象,对象中有两个方法,分别是get 和 set, 在不同的时机触发。
let addObj = Object.defineProperties(obj2,{
fullName :{
get:function(){
return this.firstName + this.lastName
},
set:function(val){
// console.log('修改了')
this.firstName = val.slice(0,1)
this.lastName = val.slice(1)
}
}
})
// 调用fullName 时触发get方法
console.log('全名',addObj.fullName) // 关羽 (修改前)
// 修改时调用set ,set方法支持传入一个参数,这个参数就是新赋的值
console.log(addObj)
addObj.fullName = '张飞'
console.log('全名2',addObj.fullName) // 张飞 (修改后)