2-1 变量类型和计算
题目
- JS 中使用 typeof 能得到的哪些类型
- 何时使用 === 何时使用 ==
正常情况都是用 ===
if(obj.a ==null){
// 这里相当于 obj.a === null || obj.a === undefined 的简写形式
// 这是jq 源码推荐的写法
}
- JS 中有哪些内置函数
Obiect
Array
Boolean
Number
String
Function
Date
RegExp
Error
JS 变量按照存储方式区分为哪些类型,并描述其特点
值类型 特点: 独立内容块
引用类型 特点: 变量共用内存块,节省内存空间如何理解JSON
// JSON 只是一个js对象
JSON.stringify({a: 10,b:20})
JSON.parse(' {"a": 20, "b": 20} ')
知识点
变量类型
- 值类型 vs 引用类型
// 值类型
var a = 100
var b = a
a = 200
console.log(b) //100
//引用类型
var a = {age: 20}
var b = a
b.age = 21
console.log(a.age) //
- typeof 运算符详解
typeof undefined // undefined
typeof 'abc' // string
typeof 123 //numbur
typeof true //boolean
typeof {} //obiect
typeof [] //obiect
typeof null //obiect
typeof console.log // function
变量计算
- 字符串拼接
- == 运算符
- if语句
- 逻辑运算
// 字符串拼接
var a = 100 + 10 //110
var b = 100 + '10' // '10010'
// == 运算符
100 == ‘100’ //true
0 == ' ' // true
null == undefined // true
// if 语句
var a = true
if(a){
//
}
var b = 100
if(b) {
//
}
var c = ' '
if(c){
//
}
// 逻辑运算符
console.log(10 && 0) //0
console.log(' ' || 'abc') //abc
console.log(!window.abc) // true
//判断一个变量会被当成true还是false
var a = 100
consloe.log(!!a) //true
2-2 原型和原型链
题目
- 如何准确判断一个变量是数组类型
var arr = []
arr instanceof Array // true
typeof arr //Objeict ,typeof 是无法判断是否是数组
- 写一个原型链继承的例子
- 描述 new 一个对象的过程
创建一个新对象
this 指向这个新对象
执行代码,即对 this 赋值
返回 this
- zepto(或其他框架) 源码中如何使用原型链
知识点
- 构造函数
function Foo(name, age){
this.name = name;
this.age = agel;
this.className = 'class-1'
// return this 默认有这一行
}
var f = new Foo('zhangsan', 18)
var f1 = new Foo('zhangsan1', 18) //创建多个对象
- 构造函数 - 扩展
var a = {} 其实是 var a = new Object() 的语法糖
var a = [] 其实是 var a = new Array() 的语法糖
function Foo(){...} 其实是 var Foo = new Function(...)
使用 instanceof 判断一个函数是否是一个变量的构造函数
- 原型规则和示例
所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”意外)
var obj = {}; obj.a = 100;
var arr = []; arr.a =100;
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);
所有的引用类型(数组、对象、函数),都有一个proto属性,属性值是一个普通的对象
console.log(obj._proto_);
console.log(arr._proto_);
console.log(fn._proto_);
所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象
console.log(fn.prototype);
所有的引用类型(数组、对象、函数),proto属性值指向它的构造函数的 ”prototype“ 属性值
console.log(obj._proto_ === Object.prototype);
当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的 proto(即它的构造函数的prototype)中寻找。
// 构造函数
function Foo(name){
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()
- 原型链
// 构造函数
function Foo(name){
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_ 中查找
- instanceof
f instanceof Foo 的判断逻辑是:
f 的 proto 一层一层往上,能否对应到 Foo.prototype
再试着判断 f instanceof Object