es5新特性

严格模式

// 在JS文件或者函数的顶部添加'use strict' 启用严格模式
'use strict';
function do () {
  console.log(111)
}

function test () {
  'use strict';
  console.log(111)
}

JSON

// parse:反序列化成json对象
let str = '{"width": 34, "height": 23}'
let jsonObj = JSON.parse(str)

// stringify:序列化成json字符串
let testObj = {width: 34, height: 23}
let jsonStr = JSON.stringify(testObj)

Array

// indexOf:返回指定元素的下标,没有返回-1
let arr = [1, 2, 3, 4]
console.log(arr.indexOf(3)) // 2

// forEach:遍历数组,不能break
arr.forEach(item => {
  console.log(item)
})

// map:遍历数组,返回值操作后组成新数组返回,原数组不变
let arr2 = arr.map(function (val) {
  return val * val
})
console.log(arr2) // [1, 4, 9, 16]

// every:所有回调都返回true,才返回true,遇到false就break,返回false
arr.every(function (val) {return val > 3}) // false

// some:有一个回调返回true就break并返回true,否则返回false
arr.some(function (val) {return val > 3}) // true

// filter:新数组返回回调为true的值,原数组不变
arr.filter(function (val) {return val > 3}) // [4]

// reduce:累加器,原数组不变
arr.reduce(function (total, currentVal) {return total + currentVal}) // 10

Object

// 添加或更改对象属性
let test = {name: 'MuYi086'}
Object.defineProperty(test, 'age', {value: 26})
console.log(Object) // {name: "MuYi086", age: 26}

// 添加或更改多个对象属性
let props = {'age': {value: 26, writable: true}, 'weight': {value: 70, writable: false}}
Object.defineProperties(test, props)
console.log(test) // {name: "MuYi086", age: 26, weight: 70}

// 用defineProperty实现双向绑定
// HTML
<input type="text" id="content" value="欧哥哥" />
<div id='t-in'></div>

// JS:新属性,不能是input已有的value
let input = document.getElementById('content')
let title = document.getElementById('t-in')
Object.defineProperty(input, 'val', {
  get: function () {
    return this.value
  },
  set: function (val) {
    this.value = val
    title.innerHTML = val
  }
})

input.val = 'MuYi086, 你好'

// 访问属性
let res = Object.getOwnPropertyDescriptor(test, 'name')
console.log(res) // {value: "MuYi086", writable: true, enumerable: true, configurable: true}

// 以数组返回所有属性
let test = {name: 'MuYi086', age: 26}
let res = Object.getOwnPropertyNames(test)
console.log(res) // ["name", "age"]

// 以数组返回所有可枚举的属性
let res = Object.keys(test)
console.log(res) // ["name", "age"]

// 访问原型
let res = Object.getPrototypeOf(test)
console.log(res)

// 阻止向对象添加属性
Object.preventExtensions(test)

// 判断对象是否可添加属性
console.log(Object.isExtensible(test))

// 密封:防止更改对象属性,不能delete,值可以变
Object.seal(test)

// 判断是否被密封
Object.isSealed(test)

// 冻结:类似密封,但更彻底,值也不能变更
Object.freeze(test)

// 判断是否被冻结
Object.isFrozen(test)

Function Extend

// Function.prototype.bind
function aa () {console.log(this.author)}
function bb (name) {this.author = name}
let test = new bb('MuYi086')
let showResult = aa.bind(test)
showResult()

// bind会把第一个实参作为当前this
// 第二参起,会依次传递给原始函数
function aa (age) {
  this.name = 'MuYi086'
  this.age = age
}
let obj = {}
let bb = aa.bind(obj, 26)
bb()
console.log(obj)

参考

Last updated