变量类型及计算
题目
1. JS中用 typeof
得到那些数据类型
1 | typeof undefined // undefined |
typeof 只能区分值类型
2. 何时使用 ==
和 ===
1 | if (obj.a == null) { |
‘’(空字符串), 0, null, undefined都可以转换为 false
3. JS中的内置函数–数据封装对象
1 | Object |
4. JS变量按存储方式区分为那些类型,并描述其特点
值类型
1
2
3
4var a = 100;
var b = a;
a = 200;
console.log(b) // 100引用类型:对象、数组、函数(节省内存空间,以指针方式存储)
1
2
3
4var obj1 = {x: 20};
var obj2 = obj1;
obj1.x = 30;
console.log(obj2.x) // 30
5. 如何理解JSON
JSON只是JS的一个内置对象,Math也是1
2JSON.stingify({a: 10, b: 20}) // 对象 -> 字符串
JSON.parse("{'a': 10, 'b': 20}") // 字符串 -> 对象
原型和原型链
知识点
- 构造函数
- 构造函数 - 扩展
- 原型规则和示例
- 原型链
- instanceof
构造函数
1 | function Foo(name, age) { |
构造函数的扩展
var a = {}
其实是var a = new Object()
的语法糖var a = []
其实是var a = new Array()
的语法糖function Foo() {...}
其实是var Foo = new Funcion() {...}
的语法糖- 使用
instanceof
判断一个函数是否是一个变量的构造函数
原型规则和实例
- 所有的引用类型(对象、数组、函数),都具有对象特性,即可自由扩展属性(除了”null”以外
- 所有的引用类型(对象、数组、函数),都有一个proto(隐式原型)属性,属性值是一个普通对象
- 所有的函数,都有一个prototype(显示原型)属性,属性值是一个普通对象
- 所有的引用类型(对象、数组、函数),proto属性值指向它的构造函数的
prototype
属性值 - 当试图寻找一个对象(引用类型)的某个属性时,如果这个对象本身没有这个睡醒,那么会去它的proto(即它的构造函数的prototype)中去寻找
1 | // 所有的引用类型都有可自由扩展属性 |
1 | // 构造函数 |
instanceof
用于判断引用类型属于哪个构造函数的方法
f intanceof
Foo 的判断逻辑:
f.proto
一层一层往上,能否对应到Foo.prototype
- 再试着判断
f instanceof Object
- 同样在
f.proto
一层一层往上找,直到Object.prototype
题目
1. 如何准确判断一个变量是数组类型
1 | var arr = []; |
2. 写一个原型链继承的例子
1 | // 动物 |
面试中千万不要上面的例子,应该写更加贴近实战的例子,上面这个例子只是用来理解。
一个封装DOM查询的例子1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19function 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);
return this
}
var div1 = new Elem('div1');
div.html('<p>hello</p>').on('click', function () {alert('clicked')}).html('<p>JavaScript</p>');
3. 描述 new 一个对象的过程
- 创建一个新对象
- this 指向这个新对象
- 执行代码,即对 this 进行赋值
- 返回 this
4. zepto(或其他框架)源码中如何使用原型链
- 阅读源码是高效提升技能的方式
- 但不能“埋头苦研”有技巧在其中,阅读之前在网上先搜索一下资料