【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
}