数据类型判断
数据类型分为基本数据类型和对象类型;变量的值类型分为基本类型(保存的基本类型的数据)和引用类型(保存的是地址值 array、 function、object )。
对于undefined和null的判断:
let a;
if (a === undefined || typeof a === 'undefined') {
console.log('a没有定义')
}
let b = null;
if (b === null) {
//typeof b的值为 'null'
console.log('b为null')
}
对于数组的判断:
if (c instanceof Array) {
console.log(typeof c);// object
console.log( 'c是一个数组');
}
undefined有2种判断方式。null和array的typeof都是object,所以需要特殊判断。
instanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);//true
console.log(auto instanceof Object);//true
全局执行上下文与函数执行上下文
全局执行上下文
在执行全局代码前,首先将window确定为全局执行上下文,然后,对全局数据进行预处理:①将var定义的全局变量初始化为undefined,然后添加为window的属性;②将function声明的全局函数添加为window的方法;③将this赋值给window。最后,开始执行全局代码。
函数执行上下文
在调用函数准备执行函数体前,创建对应的函数执行上下文对象,然后对局部数据进行预处理:将函数定义的形参赋值给函数体内的实参,并添加为执行上下文的属性;将arguments添加为执行上下文属性;将var定义的局部变量初始化为undefined并添加为执行上下文属性;将函数体内声明的function函数赋值给fun并添加为执行上下文方法;将this赋值给调用该函数的对象; 最后开始执行函数整体代码.
执行上下文举例:
<script>
console.log('begin' + i)
var i = 1
test(1)
function test(i) {
if (i == 4) {
return
}
console.log('test-begin:' + i)
test(i + 1)
console.log('test-end:' + i)
}
console.log('end' + i)
</script>
begin: undefined
test-begin: 1
test-begin: 2
test-begin: 3
test-end: 3
test-end: 2
test-end: 1
end: 1
变量提升与函数提升举例:
function test() {
}
var test
console.log(typeof test) //function
由打印结果可知,先执行变量提升,后执行函数提升
var作用域举例:
if (!(b in window)) {
var b = 234
}
console.log(b) //undefined
易错举例:
var c = 1
function c(c) {
console.log(c)
var c = 3
}
c(2) //Uncaught TypeError: c is not a function
这个还是变量提升与函数提升的问题.代码先执行变量提升 var c = undefined, 再执行函数提升,然后赋值c = 1,此时c是一个基本数据类型,再执行c(2))时,当然会报错.