1.this
任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
所有函数内部都有一个变量this
this的值就是调用函数的当前对象。那么如何确定this指向呢?
- 以函数的形式调用时,this永远都是window
- 以方法的形式调用时,this就是调用方法的对象
- 以构造函数的形式调用时,this就是新创建的对象
- 使用call和apply调用时,this就是指定的那个对象
- 在全局作用域中this代表window
2.不加 ; 会有问题的情况
会导致上下行解析出问题的5个token [(+-/ 这5种之前需要加分号。
小括号开头 中括号开头的前一条语句 其他几种可能是正则什么的
3.数据类型及判断
6种数据类型:
基本(值)类型:Number,String,Boolean,undefined,null
对象(引用)类型:Object
判断数据类型:
typeof :
可以区别:数值,字符串,布尔值,undefined,function
不能区别:null与对线,一般对象与数组
instanceof:专门用来判断对象数据类型:Object,Array,Function
可以判断undefined和null
4. 数据,变量,内存三者是什么以及他们之间的关系
5. js判断数据类型
1. typeof判断
除function外所有引用类型和null 返回 object 其他返回各自数据类型。number,string,undefined,boolean
2. Object.prototype.toString.call() 完美判断所有
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
3. A instanceof B 判断A是否是属于B的实例
6. 执行上下文 练习题目
`
console.log('gb:'+ i)
var i = 1
foo(1)
function foo(i){
if(i == 4){ return }
console.log('f begin'+ i)
foo(i+1)
console.log('f end'+ i)
}
console.log('gb:'+i)
//答案:
// gb:undefined
// f begin1
// f begin2
// f begin3
// f end3
// f end2
// f end1
// gb:1
`
7. 变量提升和函数提升的题目
`
//先执行变量提升 再执行函数提升
function a(){}
var a
console.log(typeof a); //function 后执行的函数提升所以覆盖了前者
//-----------------------
var c = 1
function c(c){
console.log(c)
}
c(2)
//答案:报错 c is not a function
//解析:先执行变量提升,后执行函数提升,然后执行变量赋值。所以最后c是1 不能执行
*/
//先执行的变量提升,因此window.b是存在的 b in window true
// if(!(b in window)){
// var b;
// }
// console.log(b) //undefined
if(!(b in window)){
var b = 1
}
console.log(b) //undefined
if(!(b in window)){
b = 1
}
console.log(b) //报错 b is not defined
//作用域的面试题
var x = 10
function fn(){
console.log(x)
}
function show(f){
var x =11
f()
}
show(fn)
var fn = function(){
console.log(fn)
}
fn()
`