Skip to content

ES5

严格模式(strict mode)

目的

  • 消除JavaScript语法的一些不合理、不严谨之处,减少一些怪异行为
  • 消除代码运行的一些不安全之处,为代码的安全运行保驾护航
  • 为未来新版本的JavaScript做好铺垫

使用

  • 在全局或函数的第一条语句定义为: 'use strict'
  • 如果浏览器不支持,只解析为一条简单的语句,没有任何副作用

语法和行为改变

  • 必须使用var声明变量
  • 禁止自定义的函数中的this执行window
  • 创建 eval 作用域
  • 对象不能有重名的属性

JSON对象

// js对象(数组)转换为json对象(数组)
    JSON.strinaify(obj/arr)
// js对象(数组)转换为js对象(数组)
    JSON.parse(json)

Object扩展

  • ES5给Object扩展了一些静态方法,常用两个

Object.create(prototype, [descriptors])

  • 作用:以指定对象为原型创建的对象
  • 为新的对象指定新的属性,并对属性进行描述
    • value: 制定值
    • writable:标识当前属性值是否可修改的,默认为false
    • configurable:标识当前属性是否可以被删除 默认为false
    • enumerable:标识当前属性是否能用for in枚举默认为false
      var obj = {username: 'zhangsan', age: 30};
      var obj1 = {}
      obj1 = Object.create(obj, {
          sex: {
              value: '男',
              writable: true,
              configurable: true,
              enumerable:true
          }
      })
      console.log(obj1.sex);
      obj1.sex = '女';
      console.log(obj1.sex);
      // delete obj1.sex;
      // console.log(obj1)
      for(var i in obj1){
          console.log(i)
      }
      

Object.defineProperties(object, descriptors)

  • 作用:为指定对象定义扩展多个属性
    • get:用来获取当前属性值得回调函数
    • set:修改当前属性值得触发的回调函数,并且实参即为修改后的值
  • 存取器属性:setter,getter一个用来存值,一个用来取值
    var obj2 = {firstName: 'kobe', lastName: 'bryant'};
    Object.defineProperties(obj2, {
        fullName: {
            get: function () { // 获取扩展的属性的值
                return this.firstName + ' ' + this.lastName;
            },
            set: function (data) { // 监听扩展属性,当扩展属性发生变化的时候会自动回调,自动调用后将变化的值作为实参
                console.log('set()', data);
                var names = data.split(' ');
                this.firstName = names[0];
                this.lastName = names[1];
            }
        }
    })
    console.log(obj2.fullName);
    obj2.fullName = 'tim duncan';
    console.log(obj2.fullName);
    

Array扩展

  1. Array.prototype.indexOf(value): 得到值在数组中的第一个下标
  2. Array.prototype.lastIndexOf(value): 得到值在数组中的最后一个下标
  3. Array.prototype.forEach(function(item, index){}): 遍历数组
  4. Array.prototype.map(function(item, index){}): 遍历数组返回一个新的数组,返回加工之后的值
  5. Array.prototype.filter(function(item, index){}): 遍历过滤出一个新的子数组,返回条件为true的值
/**
 * 需求
 * 输出第一个4的下标
 * 输出最后一个4的下标
 * 输出所有元素的值和下标
 * 根据arr产生一个新数组,要求每个元素都比原来大10
 * 根据arr产生一个新数组,返回的每个元素要大于4
 */
var arr = [2,4,3,1,2,6,5,4];
console.log(arr.indexOf(4));
console.log(arr.lastIndexOf(4));
arr.forEach(function (item, index) {
    console.log(item,index);
})
var arr1 = arr.map(function (item, index) {
    return item + 10;
})
console.log(arr1);

var arr2 = arr.filter(function (item, index) {
    return item > 3;
})
console.log(arr2);

function 扩展

  1. Function.prototype.bind(obj):
    • 作用:将函数内的this绑定为obj,并将函数返回
  2. 面试题:区别bind() 与 call() 和 apply()?
    • 都能指定函数的this
    • call()/apply()是立即调用函数
    • bind()是将函数放回
var obj = {username: 'kobe'};
function foo(data){
    console.log(this data);
}
// 传入参数的形式
foo.call(obj, 33); // 直接从第二个参数开始,依次进入
foo.apply(obj, [33]); // 第二参数必须是数组,传入放在数组里
// bind的特点:绑定完this不会立即调用当前的函数,而是将函数返回
// bind 传参的方式同call一样
// var bar = foo.bind(obj)
// console.log(bar);
// bar();
foo.bind(obj, 33)();

setTimeout(function () {
    console.log(this)
}.bind(obj), 1000) // bind 一般使用在回调函数上