javascript面试准备(一)

2019-10-19  本文已影响0人  前端小飞象

interview

js 基础

原型 原型链

作用域 闭包

异步 单线程

js Api dom 操作 ajax 事件绑定

版本管理 模块化 打包工具

  1. js 中使用 typeof 能得到哪些类型 (js 变量类型)

typeof undefined //undefined

typeof 'abc' //string

typeof 123 //number

typeof true //object

typeof {} //object

typeof [] //object

typeof null //object

typeof console.log //function

  1. 何时用=== 何时使用==(强制类型转换)

//除了这两种其他都用===

if (obj.a == null) {

  //这里相当于obj.a===null ||obj.a===undefined 简写

  //这是jquery源码推荐写法

}

function(a,b){

  if(a==null){

  }

}


var a = 100 + 10 //110

var a = 100 + '10' //'10010'


100 == '100' //true

0 == '' //true 0和空字符串都转换成false

null == undefined //true


var a = true

if (a) {

}

var b = 100 //转换成bool true

if (b) {

}

if ('') {

  //false

}

if (0) {

  //false

}

if (null) {

  //false

}

if (NaN) {

  //false

}

if (false) {

  //false

}

if (undefined) {

  //false

}


console.log(100 && 0) //0 100换成了true

console.log('' || 'abc') //'abc'

console.log(!window.abc) //true

//判断一个变量会被当做true 还是false

var a = 100

console.log(!!a)

  1. js 有哪些内置函数

Object

Array

Boolean

Number

String

Function

Date

RegExp

Error

  1. js 变量按照存储方式区分为哪些类型

// 值类型

var a = 10

var b = a

a = 11

console.log(b) //10

// 引用类型 :对象、数组、函数

var obj1 = { x: 100 }

var obj2 = obj1

obj1.x = 200

console.log(obj2.x) //200

  1. 如何理解 JSON

//JSON只是一个js对象而已

//从一个对象解析出字符串

JSON.stringify({ a: 10, b: 20 }) //{"a":10,"b":20}

//parse用于从一个字符串中解析出json对象如

JSON.parse('{"a":10,"b":20}') //{a:10,b:20}

//注意:对象名必须用双引号 {}使用单引号包裹

原型和原型链

构造函数


function Foo(name, age) {

  this.name = name

  this.age = age

  this.class = 'class-1'

  //return this

}

var f = new Foo('zhangsan', 20)

//var f1=new Foo('lisi',22)

构造函数-扩展

原型规则和示例


var obj = {}

obj.a = 20

var arr = []

arr.a = 10

function fn() {}

fn.a = 100


console.log(obj.__proto__)

console.log(arr.__proto__)

console.log(fn.__proto__)


console.log(fn.prototype)


console.log(obj.__proto__ === Object.prototype)


//构造函数

function Foo(name, age) {

  this.name = name

}

Foo.prototype.alertName = function() {

  alert(this.name)

}

//创建实例

var f = new Foo('zhangsan')

f.printName = function() {

  console.log(this.name)

}

//测试

f.printName()

f.alertName()

for (var item in f) {

  if (f.hasOwnProperty(item)) {

    console.log(item)

  }

}

原型链


//构造函数

function Foo(name, age) {

  this.name = name

}

Foo.prototype.alertName = function() {

  alert(this.name)

}

//创建实例

var f = new Foo('zhangsan')

f.printName = function() {

  console.log(this.name)

}

//测试

f.printName()

f.alertName()

f.toString() //要去f.__proto__.__proto__中查找

原型链

)
[图片上传失败...(image-531d0f-1571457332167)]


f instanceof Foo

  1. 如何准确判断一个变量是数组类型

var arr = []

arr instanceof Array //true

typeof arr //object 无法判断是否时数组

  1. 写一个原型链继承的例子

//动物

function Animal() {

  this.eat = function() {

    console.log('animal eat')

  }

}

//狗

function Dog() {

  this.bark = function() {

    console.log('this bark')

  }

}

Dog.prototype = new Animal()

//哈士奇

var hashiqi = new Dog()

hashiqi.eat()

hashiqi.bark()


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.innerHTML

  }

}

Elem.prototype.on = function(type, fn) {

  var elem = this.elem

  elem.addEventListener(type, fn)

}

var div1 = new Elem('div1')

// console.log(div1.html())

div1

  .html('<p>hello hihi</p>')

  .on('click', function() {

    alert('clicked')

  })

  .html('<p>javascrip</p>')

  1. 描述 new 一个对象的过程

function Foo(name, age) {

  this.name = name

  this.age = age

  this.class = 'class-1'

  //return this

}

var f = new Foo('zhangsan', 20)

  1. zepto(或其他框架)源码中如何使用原型链

作用域与闭包

执行上下文


console.log(a) //undefined

var a = 100

fn('zhangsan') //'zhangsan' 20

//函数声明

function fn(name) {

  age = 20

  console.log(name, age)

  var age

}

this


function Foo(name) {

  this.name = name

}

var f = new Foo('zhangsan')


//函数表达式

var obj = {

  name: 'A',

  printName: function() {

    consolo.log(this.name)

  }

}

obj.printName() //this===abj


var fn1 = a.fn

fn1() //this===window


//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

作用域


if (true) {

  var name = 'zhangsan'

}

console.log(name) //true


var a = 100

function fn() {

  var a = 200

  console.log('fn', a) //200

}

console.log('global', a) //100

fn()


var a = 100

function fn() {

  var b = 200

  function fn2() {

    var c = 300

    //当前作用域没有定义的变量,既“自由变量”

    console.log(a) //100自由变量

    console.log(b) //200自由变量

    console.log(c)

  }

}

fn()

  1. 说一下对变量提升的理解(执行上下文)
  1. 说明 this 几种不同的使用场景(this)

  2. 用 js 创建 10 个<a>标签 点击的时候弹出来对应的序号(作用域)


var i

for (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)

}

  1. 如何理解作用域(作用域)
  1. 实际开发中闭包的应用(闭包)

function isFristLoad() {

  var _list = []

  return function(id) {

    if (_list.indexOf(id) >= 0) {

      return false

    } else {

      _list.push(id)

      return true

    }

  }

}

//使用

var firstLoad = isFirstLoad()

firstLoad(10) //true

firstLoad(10) //false

firstLoad(20) //true

异步和单线程

异步

  1. 定时任务: setTimeout setInverval

  2. 网络请求: ajax 请求 动态<img>加载

  3. 事件绑定


console.log(100)

setTimeout(function() {

  console.log(200)

}, 1000)

console.log(300)

//100 300 200异步 不阻塞

console.log(100)

alert(200)

console.log(300)

//同步100 200 300

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

  2. alert 是同步。setTimeout 是异步


console.log(1)

setTimeout(function() {

  console.log(2)

}, 0)

console.log(3)

setTimeout(function() {

  console.log(4)

}, 1000)

console.log(5) //1 3 5 2 4

  1. 定时任务: setTimeout setInverval

  2. 网络请求: ajax 请求 动态<img>加载

  3. 事件绑定

日期


Date.now() //获取当前时间毫秒数

var dt = new Date()

dt.getTime() //获取毫秒数

dt.getFullYear() //年

dt.getMonth() //月

dt.getDate() //日

dt.getHours() //小时

dt.getMinutes() //分钟

dt.getSeconds() //秒

Math

数组 API


var arr = []

arr.forEach(function(item, index) {

  console.log(index, item)

})


var arr = []

var result = arr.every(function(item, index) {

  if (item < 4) {

    return true

  }

})

console.log(result)


var arr = []

var result = arr.some(function(item, index) {

  if (item < 2) {

    return true

  }

})

console.log(result)


var arr = [1, 6, 3, 5]

var arr2 = arr.sort(function(a, b) {

  return a - b

}) //[1, 3, 5, 6]


var obj = {

  x: 100,

  y: 200,

  z: 300

}

var key

for (key in obj) {

  if (obj.hasOwnProperty(key)) {

    console.log(kay, obj[key])

  }

}


function formatDate(dt) {

  if (!dt) {

    dt = new Date()

  }

  var year = dt.getFullYear()

  var month = dt.getMonth() + 1

  var date = dt.getDate()

  if (month < 10) {

    month = '0' + month

  }

  if (date < 10) {

    date = '0' + date

  }

  return year + '-' + month + '-' + date

}

var dt = new Date()

var formaDate = formatDate(dt)

console.log(formatDate)


var random = Math.random()

var random = random + '0000000000'

var random = random.slice(0, 10)

console.log(random)


function forEach(obj, fn) {

  var key

  if (obj instanceof Array) {

    //准确判断是不是数组

    obj.forEach(function(item, index) {

      fn(index, item)

    })

  } else {

    //不是数组就是对象

    for (key in obj) {

      fn(key, obj[key])

    }

  }

}

var arr = [1, 2, 3]

forEach(arr, function(index, item) {

  console.log(index, item)

})

var obj = { x: 100, y: 200 }

forEach(obj, function(key, value) {

  console.log(key, value)

})

上一篇 下一篇

猜你喜欢

热点阅读