1,数据类型
JavaScript将数据分为六大类型,分别为数值类型(number)、字符串类型(string)、布尔类型(boolean)、undefined(定义未赋值)、null(赋值为空值)、应用类型。其中引用类型可分为普通对象,Function、Array。Function,Array都是属于特殊的对象。
typeof可以用来判断一个变量的数据类型:
var a
document.write(typeof a+"____")
var a=12
document.write(typeof a+"____")
a="xiaoshi"
document.write(typeof a+"____")
a=true;
document.write(typeof a+"____")
a=undefined;
document.write(typeof a+"____")
a="";
document.write(typeof a+"____")
a=null;
document.write(typeof a+"____")
以上代码的打印结果为:undefined、number、string、boolean、undefined、object、object。值得注意的是虽然值为null或者为空,但是打印的结果还是一个Object类型。也就是说typeof不可以用于判断null和Object
instanceof用来判断对象的具体类型:
function Fun(){}
var f=new Fun();
var f2=new Fun();
document.write(f instanceof Fun)
document.write(f2 instanceof Fun)
document.write(f instanceof Function)
document.write(f instanceof Object)
以上代码的执行结果为:true、true、false、true。
===用于判断undefined,和null:
var a=null;
document.write(a===null)
以上代码的执行结果为true。
2,undefined与null
undefined与null的区别在于:undefined表示的是定义未赋值,null表示定义赋值为一个null。
null的作用:初始赋值, 表明将要赋值为对象;结束前, 让对象成为垃圾对象(被垃圾回收器回收)。
3,严格区别变量类型与数据类型
数据的类型:基本类型和对象类型。
变量的类型(变量内存值的类型):基本类型(保存就是基本类型的数据),引用类型(:保存的是地址值)。
4, 数据、内存和变量
存储在内存中代表特定信息的二级制代码.,其特点为可传递, 可运算。
内存是内存条通电后产生的可储存数据的空间(临时的)。内存产生和死亡: 内存条(电路版)==>通电==>产生内存空间==>存储数据==>处理数据==>断电==>内存空间和数据都消失。
a,内存分类。
栈: 全局变量/局部变量
堆: 对象
变量是可变化的量, 由变量名和变量值组成,每个变量都对应的一块小内存, 变量名用来查找对应的内存, 变量值就是内存中保存的数据。
内存,数据, 变量三者之间的关系为:内存用来存储数据的空间,变量是内存的标识。
5,有关变量的问题
问题一: var a = xxx, a内存中到底保存的是什么?
* xxx是基本数据, 保存的就是这个数据
* xxx是对象, 保存的是对象的地址值
* xxx是一个变量, 保存的xxx的内存内容(可能是基本数据, 也可能是地址值)
问题二:关于引用变量赋值
* 2个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 另一个变量看到的是修改之后的数据
* 2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象
问题三:问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递
* 理解1: 都是值(基本/地址值)传递
* 理解2: 可能是值传递, 也可能是引用传递(地址值)
问题四:问题: JS引擎如何管理内存?
a,内存生命周期
* 分配小内存空间, 得到它的使用权
* 存储数据, 可以反复进行操作
* 释放小内存空间
b. 释放内存
* 局部变量: 函数执行完自动释放
* 对象: 成为垃圾对象==>垃圾回收器回收
5,对象
5.1.什么是对象
对象就是用于保存多个数据的封装体。
5.2.为什么使用对象
统一管理多个数据
5.3.对象的组成
属性: 属性名(字符串)和属性值(任意)组成
方法: 一种特别的属性(属性值是函数)
5.4.如何访问对象内部数据?
方式一:对象.属性名: 编码简单, 有时不能用
方式二: 对象['属性名']: 编码麻烦, 能通用
方式一不能用的情况:属性名包含特殊字符: -或者空格,属性名不确定。
var p = {}
p.content-type = 'text/json'
这种方式不可以使用。只能使用第二种方式。
var p = {}
p['content-type'] = 'text/json'
同时,在属性名不确定时,使用第二种方式,可以方便获取不同属性的属性名,更加灵活多变。
var p={}
var propName = 'myAge'
var value = 18
p[propName] = value
6,函数
6.1.函数概念
a,什么是函数
实现特定功能的多条语句的封装体,只有函数是可以执行的, 其它类型的数据不能执行。
b,为什么要用函数
提高代码复用.
c,如何调用(执行)函数
*test(): 直接调用。
* obj.test(): 通过对象调用。
* new test(): new调用。
* test.call/apply(obj): 临时让test成为obj的方法进行调用。
6.2.回调函数
回调函数是指通过某种方式调用的自定义的函数,这个函数是我们自己定义的,但是不是由我们调用,而是在某种场景之下才被调用的。例如一个函数的形参是一个函数时,也被称之为回调函数。
场景的回调函数场景有:
dom事件回调函数 ==>发生事件的dom元素
document.getElementById('btn').onclick = function () { // dom事件回调函数
alert(this.innerHTML)
}
定时器回调函数 ===>window
setTimeout(function () { // 定时器回调函数
alert('到点了'+this)
}, 2000)
ajax请求回调函数
生命周期回调函数
6.3.IIFE(立即执行函数)
立即执行函数是匿名函数调用本身的函数,
a,IIFE的作用
- 隐藏实现
- 不会污染外部(全局)命名空间
- 用它来编码js模块
b,IIFE可以向外提供一个访问函数
(function () {
var a = 1
function test () {
console.log(++a)
}
window.$ = function () { // 向外暴露一个全局函数
return {
test: test
}
}
})()
$().test()
6.4. this是什么?
任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window,所有函数内部都有一个变量this,它的值是调用函数的当前对象。
a. 如何确定this的值?
* test(): window
* p.test(): p
* new test(): 新创建的对象
* p.call(obj): obj
b,注意:直接调用,this对象是window。