1、函数
1.1 函数为什么可以放在文件的任何位置?
实际上,浏览器分两遍读取网页,第一遍读取所有的函数定义,第二遍开始执行代码,因此可以吧函数放在任何位置。
函数名后面加括号 表示调用函数
1.2 函数的声明方式
- 标准声明
- 函数表达式
<script type="text/javascript">
window.onload = function (){
quake(2)
fly()
}
// 标准的函数声明
function quake(num) {
for (var i =0 ;i<num;i++) {
console.log("quake: "+i)
}
}
// 函数表达式 ,fly变量存储的是函数的引用或者指针
var fly = function(){
console.log("I can fly!")
}
</script>
2、对象
2.1 如何创建对象
//添加一个对象变量声明
//接下来,使用左花括号开启对象定义
var chevy = {
make:"Chevy",
model:"Bel Air",
year:"1957"
}
// chevy只是一个变量,变量实际上不存储对象,变量存储的是指向对象的引用
也可以创建不包含任何属性的对象 var person = { };
试图访问不存在的属性是,返回的结果是 undefined
2.2 随时增删属性
chevy.dogYears=2;
delete chevy.dogYears;
2.3 给对象添加新的属性(方法)
var chevy = {
make:"Chevy",
model:"Bel Air",
year:"1957",
start:false,
drive: function(){
this.start =true
}
}
2.4迭代对象的属性
for(var prop in chevy) {
console.log(prop+":"+chevy[prop])
}
2.5 javascript提供的对象
- Date
- Math
- RegExp
- JSON
2.6 浏览器提供的对象
- Document
- Window
- Console
3 与网页交互
3.1 网页加载完毕后运行代码
<script>
window.onload = function () {
.....
}
</script>
4、 类型
4.1 undefined
undefined表示还没有值,即没有初始化的东西。
undefined是一个值,他也有类型,它的类型就是undefined。
不能够吧undefined和字符串"undefined"混为一谈
4.2 typeof作用
typeof 用来返回操作数的类型,返回值类型是字符串
typeof obj // 可能返回“string”、“boolean”、“number”、“object” 、"undefined"等
4.3 坑人的javascript对象null
javascript诞生时的想法是用undefined表示变量还没有初始化,用null表示 在应该提供一个对象 却没法创建或者找不到时提供null。
总之null用于表示对象不存在,null的类型是object
4.4 NAN
NAN 表示无法表示的数值结果(not a number),
NAN 是javacript中唯一一个与自己不相等的家伙
NAN !=NAN
判断一个变量是否是NAN的方法 isNaN(obj)
有个地方要骂娘了,既然NAN表示not a number 但是typeof一个NAN对象,返回值是"number" 狗血!!!!
4.5 javascript相等运算符
==
如果两个变量的类型相同,那么直接比较,如果类型不同,先转换为相同的类型,再比较
=== 仅当两个变量类型和值都相等时,它们才相等
4.6 javascript中的假值
- undefined
- NaN
- null
- 0
- 空字符串
5 原型
5.1 使用原型创建对象
javascript对象可以从其它对象那里继承属性和行为,其中行为被继承的对象成为原型
5.2 为什么可以使用原型实现继承
因为javascript先从对象实例中查找属性,如果查找不到,再去原型中查找
5.3 原型从哪里来
任何对象的都具有原型属性,如果你查看对象的构造器属性 就会发现prototype属性
var obj2 = new OBJ();
console.log(OBJ)
5.4 原型是动态的
给原型添加新的属性和方法后,继承该原型的所有对象实例将立即看到它,只要它们没有重写该属性。
5.5 判断属性是在原型中定义的还是在对象实例中定义的
如果obj.hasOwnProperty(“属性名”) 返回true,说明是在对象实例中定义的,如果返回false,但是又能够访问它说明是在对象中定义的。
5.6原型链
对象不仅可以继承一个原型的属性,还以继承一个原型链。
原型链示例:
<script>
// javascript一切皆对象 包括函数、构造器、...
window.onload = function(){
var showdog = new ShowDog("金毛",3,"驯兽师1号")
showdog.bark()
showdog.show()
}
// 普通小狗原型
function Dog (name,age) {
this.age =age;
this.name = name;
}
Dog.prototype.bark = function () {
console.log(this.name+"汪汪!")
}
//表演犬原型
function ShowDog (name,age,handler) {
//this.name = name;
//this.age = age;
Dog.call(this,name,age)//复用Dog构造函数
this.handler =handler;
}
ShowDog.prototype = new Dog() // 继承普通小狗的原型
//表演犬原型增加表演方法
ShowDog.prototype.show = function () {
console.log(this.handler+"指挥着"+this.name+"表演ing!")
}
</script>
6、setTimeout
6.1 setTimeout()基本使用
setTimeout() 第一个参数可以是字符串(最好不要用,再用字符串拼接执行到的函数时候 容易报undefined,具体原因后面会说到),也可以是函数对象。
上面的写法本身没有什么太大问题 ,但是我们最好避免下全局变量的使用,因此我们可以改进下 使用原型创建对象像这样:
6.2 setTimeout原理
setTimeout属性是挂载在window对象下的,因此延时函数中的this始终都是指向window对象的(特别注意,在做亲子视频中心封面上传时 在这里浪费了很多时间)
6.3 setTimeout踩坑
一、前面说到过延时函数中的this始终都是指向window对象的
二、如果延时函数需要传递参数,如果延时函数的形参是字符串类型,那么第一个参数使用字符串拼接(形参前后需要加上单引号),那么问题不大。但是如果形参是一个对象类型,那么字符串拼接的方法便不正确,因为字符串加对象拼接后变成了[object Object] ,不满足setTimeout的第一个参数是最终变成了check(’[object Object]’),所以得不到正确的结果
因此如果延时函数需要传递参数,并且参数类型是对象 正确的写法像这样写:
setTimeout(function(){
延时函数名(形参)
},1000)
参考资料:
https://bbs.youkuaiyun.com/topics/392162289
https://www.cnblogs.com/yuqingfamily/p/5816560.html
本文所有源代码在我的资源里可以下载https://download.youkuaiyun.com/download/qq_36719449/12187386