JS基础

2017-07-25  本文已影响0人  AuthorJim

JavaScript 面试

JS基础篇

变量类型和计算

    if (obj.a == null) {
        // 这里相当于obj.a === null || obj.a === undefined
    }

区分为值类型、引用类型。值类型的值复制之后不会相互干涉,引用类型的值复制是变量指针的复制,并不是真正的值的拷贝

JSON只不过是JS对象

原型和原型链

JS三座大山之一

instanceof。用于判断引用类型属于哪个构造函数的方法

function Elem(id) {
    this.elem = document.getElementById(id)
}
Elem.prototype.html = function (val) {
    var elem = this.elem
    if (val) {
        elem.innerHtml = val
        return this
    } else {
        return elem.html()
    }
}
Elem.prototype.on = function (type, fn) {
    var elem = this.elem
    elem.addEventListener(type, fn)
    return this
}
var fuck = new Elem('fuck')
fuck.html('<p>hello</p>').on('click', function () {
    alert('clicked!')
})

作用域和闭包

变量定义函数声明都会提前定义

for (var i = 0; i < 10; i++) {
    (function (i) {
        var a = document.createElement('a')
        a.innerHTML = i + '<br>'
        a.addEventListener('click', function (e) {
            e.preventDefault()
            alert(i)
        })
        document.body.appendChild(a)
    })(i)
}

封装变量,收敛权限

function isFirstLoad() {
    var _list = []
    // 保护了_list变量
    return function (id) {
        if (_list.indexOf(id) >= 0) {
            return false
        } else {
            _list.push(id)
            return true
        }
    }
}
var firstLord = isFirstLoad()
firstLord(10)   // true
firstLord(10)   // false
firstLord(20)   // true

异步和单线程

同步会阻塞代码执行,异步不会

其他

function formateDate(dt) {
    if (!dt) {
        dt = new Date()
    }
    var year = dt.getFullYear()
    var month = dt.getMonth()
    var date = dt.getDate()
    if (month < 10) {
        month = '0' + month
    }
    if (date < 10) {
        date = '0' + date
    }
    return year + '-' + month + '-' + date
}
function forEach(obj, fn) {
    var key
    if (obj instanceof Array) {
        obj.forEach(function (item, index) {
            fn(item, index)
        })
    } else {
        for (key in obj) {
            fn(key, obj[key])
        }
    }
}

webAPI

DOM操作

BOM操作

var ua = navigator.userAgent
var isChrome = ua.indexOf('Chrome')
console.log(isChrome)

location....

事件

function bindEvent(elem, type, selector, fn) {
    if (fn == null) {
        fn = selector
        selector = null
    }
    elem.addEventListener(type, function (e) {
      var target
      if (selector) {
          target = e.target
          if (target.matches(selector)) {
              fn.call(target, e)
          }
      } else {
          fn(e)
      }  
    })
}

事件代理:代码简介、减小浏览器的压力

项目运行环境

页面加载

性能优化

安全性

Snippets

发生类型转换的场景

原型规则

原型规则是学习原型链的基础

  1. 所有的引用类型都具有对象的特性,即可用自由扩展属性('null'除外)
  2. 所有的引用类型都有一个proto属性(隐式原型),属性值是一个普通对象
  3. 所有的函数都有一个prototype属性(显式原型),属性值是一个普通对象
  4. 所有引用类型的proto属性值指向它的构造函数的prototype属性值
  5. 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的proto(即它的构造函数的prototype)中寻找

执行上下文

this

this要在执行时才能确定值,定义时无法确认

var a = {
    name: 'A',
    fn: function () {
        console.log(this.name)
    }
}
a.fn()  // this ==> a
a.fn.call({name: 'B'})  // this ==> {name: 'B'}
var fn1 = a.fn
fn1()   // this ==> window

作用域

linux命令

加载资源的形式

加载资源的过程

浏览器渲染页面的过程

加载资源优化

渲染优化

上一篇 下一篇

猜你喜欢

热点阅读