严格模式与es5对象的两种扩展


严格模式

/**
严格模式与混杂模式对立,  要尽量避免混杂模式

混杂模式(即常规模式)

'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)  // 张飞 (修改后)

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录