一、函数立即执行和自执行
立即执行
在声明类似function foo(){}或var foo = function(){}函数的时候,通过在后面加个括号就可以实现自执行
代码:
foo()
(function foo (){
cosnole.log('我是一个可以自动执行的函数')
}()) 推荐使用
(function foo(){})() //这样写也是可以的
//错误写法
function foo(){
console.log('直接+()这样会报错的,需要在整个函数外加括号')
}
自执行:
//自执行 函数内部执行自身 递归
function foo() { foo(); }
二、js的原始类型
1.null 对象类型
2.undefined
3.string
4.number
5.boolean
6.symbom
原始类型是不可以toString() 的
string和String是不一样的类型
"1".toString()
console.log("1".toString())
console.log(typeof String)
console.log(typeof string)
console.log(typeof "string")
这个时候的“”1“”是String类型对象类型,可以调用toString
必要的时候会强转类型。
原始类型有一些坑,number是浮点类型
console.log(0.1+0.2!==0.3)//输出结果是true
null是对象类型 当输出类型的时候,会输出object
console.log(typeof null)
这是js存在的一个悠久的bug。在js的最初版本中使用的是32位系统,为了性能考虑使用地位存储变量的类型信息,000开头代表是对象,然而null,表示为全零,所以将他错误判断为object。现在内部类型判断代码已经改变了,但是对于这个bug确实一直流传下来了
对象类型:
涉及面试题:对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?
答:对象类型存储的是地址(指针)原始类型存储的是值。
当你创建一个对象类型的时候,计算机会在内存中开辟一个空间来存放值,我们找到这个空间,需要一个地址(指针)
数组是一个对象类型
const a=[]
const b=a
b.push(1)
console.log(a) //输出[1]
console.log(b) //输出[1]
数组(对象类型)赋值的时候,赋值的不是值,是指针,当a放生变化的时候,b的值就会发生变化
函数参数为一个对象的时候
function test(person){
person.age=26
person={
name:'yyy',
age:30
}
return person
}
const p1={
name:'yck',
age:25
}
const p2=test(p1)
console.log(p2)
console.log(p1)
输出
image.png解析:传进函数的person是一个副本,指向的内存地址相同,当改变具体的属性的时候,p1中的属性也会改变,当person={} 这个时候意义就不同了重新定义了一个对象,重新开了一个对象,地址不再是p1了,所以p1和p2的值不相同了
三、typeof vs instanceof
涉及面试题:typeof 是否能正确判断类型?
instanceof 能正确判断对象的原理是什么?
答:typeof不能准确判断变量到底是什么类型?
解析:typeof对于原始类型来说,除了null都可以显示正确的类型输出null为对象类型,typeof对于对象来说,除了函数都会显示object。[] {} 判断出来的都是object
console.log(typeof "1") //string
console.log(typeof 1) //number
console.log(typeof true) //boolean
console.log(typeof undefined) //undefined
// 可以进行判断变量是否存在 if判断 if(typeof a!=undefined){ console.log('成功')} 如果没有定义的 //变量 if(a){} 会报错
console.log(typeof null) //object
console.log(typeof Symbol()) //symbol
console.log(typeof []) //object
console.log(typeof {}) //object
console.log(typeof console.log) //function
所以如果想判断一个对象的正确类型,可以考虑instanceof
instanceof 内部机制是通过原型链判断的。instanceof运算符用来测试一个对象在其原型链这种是否存在一个构造函数 prototype属性
语法:object instanceof constructor
参考:object (要检测的对象) constructor (某个构造函数)
描述:instanceof 运算符用来检测 construtor.prototype 是否存在于参数object的原型链上
function C(){}
var a=new C()
console.log(a instanceof C)
console.log(a)
console.log(a instanceof Object)
//输出结果
更多分解:https://www.cnblogs.com/Trr-984688199/p/6180040.html
instanceof 也不是百分百相信的
三、箭头函数中的this
箭头函数本来是没有this,她的this的指向是包裹这个箭头函数的第一个普通的函数
例如:
function Counter() {
this.num = 0;
this.timer = setInterval(() => {
this.num++;
console.log(this.num);
}, 1000);
}
var b = new Counter();
// 1
// 2
// 3
// ...
普通函数 这个时候的this指向的window
function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
this.num++;
console.log(this.num);
}, 1000);
}
var b = new Counter();
// NaN
// NaN
// NaN
// ...
网友评论