【JavaScript】基础知识题(上)数据类型、原型、继承

JS中使用typeof能够得到的哪些类型?

undefined、string、number、boolean、object、function
注意:js中对函数使用typeof返回的是function

console.log(typeof undefined) // undefined
console.log(typeof 'abc') // string
console.log(typeof 123) // number
console.log(typeof true) // boolean
console.log(typeof {}) // object
console.log(typeof []) // object
console.log(typeof null) // object
console.log(typeof console.log) // function

何时使用 === ?何时使用 == ?

因为JS的 == 存在强制类型转换,所有 == 慎用!!大部分推荐使用 === !!
除极个别情况,如:

if(obj.a == null){
  // 这里相当于 obj.a === null ||obj.a === undefined,简写形式
  // 这是jquery源码中推荐的写法
}

JS中有哪些内置函数?

Object、Array、Boolean、Number、String、Function、Date、RegExp、Error

JS变量按照存储方式分为哪些类型?并描述其特点

值类型:值复制的是真正的值
引用类型:值复制的并不是一个真正的拷贝,而是拷贝其内存地址(指针)

如何理解JSON?

JSON 只是JavaScript的一个内置对象,和 Math 类似(注意:并不是内置函数),其有两个方法,如下:

JSON.stringify({ a: 10, b: 20 }) // 返回与指定值对应的JSON字符串
JSON.parse('{"a":10,"b":20}') // 解析JSON字符串并返回对应的值

如何判断一个变量是数组类型?

使用 instanceof 运算符可以用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上(即可以判断一个引用类型属于那种构造函数的实例)

var arr = []
console.log(arr instanceof Array) // true

写一个原型链继承的例子

封装了一个DOM操作的构造函数,类似Jquery中的$("节点"),可以执行链式操作

cript>
// 封装DOM查询
function Elem(id) {
  this.elem = document.getElementById(id)

  // 操作元素节点的innerHTML
  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)
    return this // 用于链式操作
  }
}

var div1 = new Elem('div1')
console.log(div1.html()) // 我是原版内容
// 链式操作
div1
  .html('我是修改后的内容')
  .on('click', function () {
    alert('我被点击了')
  })
  .html('<h1>我是链式操作修改的内容</h1>')

描述 new 一个对象的过程

1.先创建一个空对象
2.修改该对象的 proto 指向构造函数的 prototype
3.借用(apply)构造函数给该对象设置属性
4.返回该对象

// 创建一个new对象工厂
var objectFactory = function (Con, ...args) {
  // 1.从Object.prototype上克隆一个空的对象
  var obj = new Object()
  // 2.取得外部传入的构造器
  Constructor = [].shift.call(arguments)
  // 3.修改obj的对象原型(关键!!!!!)
  obj.__proto__ = Constructor.prototype
  // 4.给obj设置属性(关键!!!!!)
  var ret = Constructor.apply(obj, arguments)
  // 5.确保返回的是一个对象
  return typeof ret === 'Object' ? ret : obj
}
posted @ 2020-07-18 10:59  努力挣钱的小鑫  阅读(173)  评论(0编辑  收藏  举报